В чём разница между Options API и Composition API?

Options API и Composition API — это два разных подхода к написанию компонентов во Vue.js. Оба официально поддерживаются во Vue 3, но различаются в синтаксисе, организации кода, повторном использовании логики и масштабируемости.

Основы Options API

Options API использовался по умолчанию до Vue 3. Он структурирует код компонентов через специальные опции (data, methods, computed, watch, props, mounted и т.д.). Каждая часть логики определяется в соответствующем разделе.

Пример Options API:

export default {
data() {
return {
count: 0
};
},
computed: {
double() {
return this.count \* 2;
}
},
methods: {
increment() {
this.count++;
}
},
mounted() {
console.log('Component mounted');
}
}

Здесь логика компонента разделена по типам: переменные — в data, вычисления — в computed, методы — в methods, жизненные циклы — в отдельных хуках.

Основы Composition API

Composition API появился в Vue 3. Он использует функцию setup(), внутри которой можно управлять всеми аспектами логики компонента с помощью реактивных функций (ref, reactive, computed, watch, onMounted и т.д.).

Пример Composition API:

<script setup>
import { ref, computed, onMounted } from 'vue';
const count = ref(0);
const double = computed(() => count.value \* 2);
function increment() {
count.value++;
}
onMounted(() => {
console.log('Component mounted');
});
</script>

Всё определено внутри setup или <script setup>, что позволяет держать связанную логику ближе друг к другу.

Сравнение: структура и организация кода

Особенность Options API Composition API
Структура По категориям (data, methods, etc) По смысловым блокам внутри setup()
--- --- ---
Уровень гибкости Статическая структура Гибкая композиция логики
--- --- ---
Масштабируемость Трудно поддерживать в крупных компонентах Легко масштабируется, логика изолируется
--- --- ---
Повторное использование Через миксины или наследование Через composition functions
--- --- ---

Повторное использование логики

  • Options API поддерживает повторное использование через миксины, но они имеют ряд ограничений: имена могут конфликтовать, сложно отслеживать происхождение логики.
const myMixin = {
data() {
return { message: 'hello' };
},
methods: {
greet() {
console.log(this.message);
}
}
};
  • Composition API поддерживает повторное использование через composition functions (настраиваемые функции, возвращающие реактивную логику).
// useCounter.js
import { ref } from 'vue';
export function useCounter() {
const count = ref(0);
const increment = () => count.value++;
return { count, increment };
}

Поддержка TypeScript

  • Options API имеет ограниченную поддержку TypeScript: типы плохо инференсятся, this требует аннотаций, сложно типизировать пропсы.

  • Composition API гораздо лучше поддерживает TypeScript, поскольку всё — обычные JS/TS функции:

const count = ref&lt;number&gt;(0);

Обработка props, emit, slots

  • **Options API:
    **
export default {
props: \['title'\],
methods: {
send() {
this.$emit('send');
}
}
}
  • **Composition API (script setup):
    **
&lt;script setup&gt;
const props = defineProps&lt;{ title: string }&gt;();
const emit = defineEmits(\['send'\]);
function send() {
emit('send');
}
&lt;/script&gt;

Жизненный цикл

  • Options API использует имена хуков:
mounted() {
console.log('mounted');
}
  • Composition API использует импортируемые функции:
onMounted(() => {
console.log('mounted');
});

Работа с реактивностью

  • Options API скрывает реактивность за кулисами: данные в data автоматически оборачиваются во Vue’s reactive system.

  • Composition API предоставляет явные реактивные функции:

    • ref() для примитивов

    • reactive() для объектов

    • computed() для вычисляемых свойств

    • watch() и watchEffect() для отслеживания

Порог входа

  • Options API легче для новичков: декларативная структура, меньше абстракций.

  • Composition API требует понимания реактивности, функций, структуры setup, но в итоге даёт больше контроля.

Совместное использование

Vue 3 позволяет использовать оба подхода в одном компоненте, но это не рекомендуется без необходимости. Лучше придерживаться одного API внутри компонента.

Пример гибридного подхода:

export default {
props: \['msg'\],
setup() {
const count = ref(0);
return { count };
},
mounted() {
console.log('Options lifecycle hook');
}
}

Когда использовать Options API

  • Для небольших компонентов.

  • При работе в команде с новичками во Vue.

  • Когда проект унаследован и использует Options API.

Когда использовать Composition API

  • При большом или масштабируемом проекте.

  • При использовании TypeScript.

  • Когда важна повторная используемость логики.

  • Когда необходимо улучшить читаемость и поддерживаемость кода.