← Назад к вопросам

Какие плюсы и минусы Composition API по сравнению с Options API?

1.6 Junior🔥 301 комментариев
#Vue.js

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Composition API vs Options API в Vue

Vue 3 представил новый подход к написанию компонентов. Composition API похож на React hooks, в то время как Options API — старый синтаксис Vue 2. Оба работают в Vue 3, но имеют разные преимущества.

Options API (старый способ)

export default {
  data() {
    return {
      count: 0,
      message: 'Hello'
    };
  },
  computed: {
    doubled() {
      return this.count * 2;
    }
  },
  methods: {
    increment() {
      this.count++;
    }
  },
  watch: {
    count(newVal) {
      console.log('Count changed:', newVal);
    }
  },
  mounted() {
    console.log('Component mounted');
  }
};

Composition API (новый способ)

import { ref, computed, watch, onMounted } from 'vue';

export default {
  setup() {
    const count = ref(0);
    const message = ref('Hello');

    const doubled = computed(() => count.value * 2);

    const increment = () => {
      count.value++;
    };

    watch(count, (newVal) => {
      console.log('Count changed:', newVal);
    });

    onMounted(() => {
      console.log('Component mounted');
    });

    return { count, message, doubled, increment };
  }
};

Плюсы Options API

1. Структурировано и предсказуемо

// Всё на месте
export default {
  data() { }, // данные
  computed() { }, // вычисляемые
  methods() { }, // методы
  watch() { }, // наблюдатели
  mounted() { } // хуки жизни
};

// Новичку сразу понятна структура

2. Меньше boilerplate

// Options
data() {
  return { count: 0 };
}

// Composition требует
const count = ref(0); // нужно оборачивать

3. Привычнее для Vue 2 разработчиков

// Синтаксис не изменился со времён Vue 2
// Легко мигрировать старый код

4. Лучше для маленьких компонентов

// Маленький компонент с Options API очень читаемо
export default {
  data() { return { isOpen: false }; },
  methods: {
    toggle() { this.isOpen = !this.isOpen; }
  }
};

Минусы Options API

1. Logic Fragmentation — логика рассеяна по разным местам

// Логика связана с фильтром
// Но разбита на несколько мест

export default {
  data() {
    return {
      searchQuery: '',
      selectedCategory: null,
      filteredItems: []
    };
  },
  computed: {
    // Часть логики
    filteredByCategory() {
      return items.filter(i => i.category === this.selectedCategory);
    }
  },
  methods: {
    // Другая часть логики
    handleSearch(query) {
      this.searchQuery = query;
      this.updateFiltered();
    }
  },
  watch: {
    // Ещё часть логики
    searchQuery() {
      this.updateFiltered();
    }
  }
};

// Нужно скакать туда-сюда по файлу

2. Плохо масштабируется

// Когда компонент большой (500+ строк)
// Становится сложно ориентироваться

export default {
  data() { /* 50 свойств */ },
  computed: { /* 20 вычисляемых */ },
  methods: { /* 30 методов */ },
  watch: { /* 15 наблюдателей */ },
  // Какой метод где? Нужно искать
};

3. Переиспользование логики сложнее

// Несколько компонентов нужна одна логика
// Options API требует mixins (плохо)

const filterMixin = {
  data() { return { query: '' }; },
  methods: { setQuery() {} },
  watch: { query() {} }
};

// Проблемы: конфликты имён, неясные зависимости

4. TypeScript поддержка плохая

// Options API с TypeScript выглядит плохо
export default {
  data(): { count: number } {
    return { count: 0 };
  },
  methods: {
    increment(this: any) { // this типизируется сложно
      this.count++;
    }
  }
};

Плюсы Composition API

1. Логика в одном месте

// Вся логика фильтрации вместе
const useFilter = () => {
  const searchQuery = ref('');
  const selectedCategory = ref(null);

  const filteredByCategory = computed(() => {
    return items.filter(i => i.category === selectedCategory.value);
  });

  const handleSearch = (query) => {
    searchQuery.value = query;
  };

  watch(searchQuery, () => {
    // обновляем
  });

  return { searchQuery, selectedCategory, filteredByCategory, handleSearch };
};

// Намного понятнее!

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

// Extracted composable
const useCounter = () => {
  const count = ref(0);
  const doubled = computed(() => count.value * 2);
  const increment = () => { count.value++; };
  return { count, doubled, increment };
};

// Использование в разных компонентах
export default {
  setup() {
    const counter1 = useCounter();
    const counter2 = useCounter();
    return { counter1, counter2 };
  }
};

// Чистое переиспользование, нет конфликтов

3. Отличная TypeScript поддержка

// Type safety из коробки
const count = ref<number>(0);
const items = ref<Item[]>([]);

const increment = (amount: number): void => {
  count.value += amount;
};

// Всё типизировано правильно

4. Tree-shaking и оптимизация

// Неиспользуемая логика удалится при build
const useUnused = () => {
  // Если эта функция не импортируется, удалится
};

5. Похож на React Hooks

// Composition API очень похож на React
// Если знаешь React, быстро освоишь Vue

const useAuth = () => {
  const user = ref(null);
  const login = async (email) => { /* ... */ };
  return { user, login };
};

// То же самое в React
const useAuth = () => {
  const [user, setUser] = useState(null);
  const login = async (email) => { /* ... */ };
  return { user, login };
};

Минусы Composition API

1. Больше boilerplate

// Нужно импортировать функции
import { ref, computed, watch, onMounted } from 'vue';

// Options API требует меньше
data() { /* ready */ }

2. Крутая кривая обучения

// Нужно понять ref и reactive
const count = ref(0);
count.value++ // зачем value?

const user = reactive({ name: 'John' });
user.name++ // а здесь без value

// Запутанно для новичков

3. Нужно явно указывать возвращаемые значения

// В Options всё видимо из структуры
export default {
  data() { return { x: 1 }; } // видимо
  methods: { foo() {} } // видимо
};

// В Composition нужно помнить что вернуть
setup() {
  const x = ref(1);
  const foo = () => {};
  return { x, foo }; // нужно явно
}

Когда использовать какой?

Options API лучше для:

  • Маленьких компонентов (< 200 строк)
  • Команд без опыта с JavaScript функциональным стилем
  • Legacy проектов Vue 2
  • Простых UI компонентов

Composition API лучше для:

  • Больших компонентов с сложной логикой
  • Переиспользуемых composables
  • TypeScript проектов
  • Команд знакомых с React/функциональным стилем
  • Новых проектов

Конец Options API?

Vue 3 поддерживает оба подхода, но документация ориентирует на Composition API. Options API не уходит, но постепенно становится второго плана.

Итог

  • Options API: структурировано, для начинающих, маленькие компоненты
  • Composition API: мощно, масштабируемо, переиспользуемо, сложнее
  • Vue 3 поддерживает оба
  • Новые проекты → Composition API
  • Legacy → Options API если уже есть
Какие плюсы и минусы Composition API по сравнению с Options API? | PrepBro