Что такое Options API
▸Структура компонента
Options API организует код по типу опций: data, methods, computed, watch, lifecycle hooks. Это традиционный подход Vue.
1<template>2 <div>3 <p>{{ fullName }}</p>4 <button @click="updateName">Обновить</button>5 </div>6</template>78<script>9export default {10 data() {11 return {12 firstName: 'Иван',13 lastName: 'Петров',14 };15 },16 computed: {17 fullName() {18 return `${this.firstName} ${this.lastName}`;19 },20 },21 methods: {22 updateName() {23 this.firstName = 'Николай';24 },25 },26 mounted() {27 console.log('Компонент смонтирован');28 },29};30</script>
▸Преимущества Options API
▸Недостатки
Что такое Composition API
▸Структура компонента
Composition API организует код по функциональности. Весь код, относящийся к одной задаче, находится вместе.
1<template>2 <div>3 <p>{{ fullName }}</p>4 <button @click="updateName">Обновить</button>5 </div>6</template>78<script setup>9import { ref, computed, onMounted } from 'vue';1011const firstName = ref('Иван');12const lastName = ref('Петров');1314const fullName = computed(() => `${firstName.value} ${lastName.value}`);1516function updateName() {17 firstName.value = 'Николай';18}1920onMounted(() => {21 console.log('Компонент смонтирован');22});23</script>
▸Преимущества Composition API
script setup синтаксис
▸Преимущества
1<script setup>2// Все переменные автоматически доступны в template3// Не нужно экспортировать4// Автоматическая регистрация компонентов5</script>
▸Сравнение с обычным script
1<script>2import { defineComponent, ref } from 'vue';34export default defineComponent({5 setup() {6 const count = ref(0);7 return { count };8 },9});10</script>1112<!-- vs script setup -->13<script setup>14import { ref } from 'vue';15const count = ref(0);16</script>
Реактивность
▸Options API
1data() {2 return {3 count: 0,4 };5},6methods: {7 increment() {8 this.count++;9 },10}
▸Composition API
1const count = ref(0);23function increment() {4 count.value++;5}67const state = reactive({ count: 0 });8state.count++;
Переиспользование логики
▸Options API: Mixins
1export default {2 data() {3 return { x: 0, y: 0 };4 },5 methods: {6 updatePosition(event) {7 this.x = event.clientX;8 this.y = event.clientY;9 },10 },11};
Проблемы: конфликты имён, неочевидные зависимости, трудно отслеживать.
▸Composition API: Composables
1import { ref, onMounted, onUnmounted } from 'vue';23export function usePosition() {4 const x = ref(0);5 const y = ref(0);67 function update(event) {8 x.value = event.clientX;9 y.value = event.clientY;10 }1112 onMounted(() => window.addEventListener('mousemove', update));13 onUnmounted(() => window.removeEventListener('mousemove', update));1415 return { x, y };16}
TypeScript
▸Options API
1<script lang="ts">2import { defineComponent, PropType } from 'vue';34interface User {5 id: number;6 name: string;7}89export default defineComponent({10 props: {11 user: {12 type: Object as PropType<User>,13 required: true,14 },15 },16});17</script>
▸Composition API
1<script setup lang="ts">2interface User {3 id: number;4 name: string;5}67const props = defineProps<{8 user: User;9}>();10</script>
Когда выбирать Options API
Когда выбирать Composition API
Заключение
Composition API — это будущее Vue. Options API всё ещё поддерживается, но для новых проектов используйте Composition API с script setup. Переходите постепенно: сначала новые компоненты, потом рефакторинг старых.