Если вы переходите с Vue 2 на Vue 3 или начинаете изучать современную фронтенд-разработку, Composition API станет вашим главным инструментом. Это не просто новый синтаксис — это философия организации кода, которая делает компоненты более читаемыми, переиспользуемыми и масштабируемыми. В этой статье мы разберем Composition API на практических примерах, от базовых до продвинутых, чтобы вы могли уверенно применять его в своих проектах.
Что такое Composition API и зачем он нужен?
Composition API — это альтернативный подход к организации логики компонентов Vue 3. В отличие от Options API (который все еще поддерживается), где код разделен по опциям (data, methods, computed и т.д.), Composition API позволяет группировать логику по функциональности, используя функции ref, reactive, computed и хуки жизненного цикла внутри функции setup().
Composition API не заменяет Options API, а дополняет его. Вы можете использовать оба подхода в одном проекте, но Composition API особенно полезен для сложных компонентов и создания переиспользуемой логики.
Базовые примеры Composition API
Реактивные данные с ref и reactive
Простейший пример — создание реактивных переменных:
import { ref, reactive } from 'vue'
export default {
setup() {
// Для примитивов и объектов используем ref
const count = ref(0)
const message = ref('Привет Vue 3!')
// Для сложных объектов лучше reactive
const user = reactive({
name: 'Алексей',
age: 28,
email: 'alex@example.com'
})
function increment() {
count.value++ // Обратите внимание на .value для ref
user.age++ // Для reactive обращаемся напрямую
}
return { count, message, user, increment }
}
}
Вычисляемые свойства и watchers
Composition API предлагает более гибкий способ работы с вычисляемыми свойствами и отслеживанием изменений:
import { computed, watch } from 'vue'
export default {
setup() {
const price = ref(100)
const quantity = ref(2)
// Вычисляемое свойство
const total = computed(() => price.value * quantity.value)
// Watcher для отслеживания изменений
watch(quantity, (newValue, oldValue) => {
console.log(`Количество изменилось с ${oldValue} на ${newValue}`)
})
// Немедленный watcher
watch(price, (newValue) => {
console.log(`Новая цена: ${newValue}`)
}, { immediate: true })
return { price, quantity, total }
}
}
Продвинутые паттерны
Создание композаблов (composables)
Настоящая сила Composition API раскрывается при создании переиспользуемой логики — композаблов:
// useMouse.js
import { ref, onMounted, onUnmounted } from 'vue'
export function useMouse() {
const x = ref(0)
const y = ref(0)
function update(event) {
x.value = event.pageX
y.value = event.pageY
}
onMounted(() => window.addEventListener('mousemove', update))
onUnmounted(() => window.removeEventListener('mousemove', update))
return { x, y }
}
// В компоненте
import { useMouse } from './useMouse'
export default {
setup() {
const { x, y } = useMouse()
return { x, y }
}
}
Работа с асинхронными операциями
Composition API отлично работает с асинхронным кодом:
import { ref, onMounted } from 'vue'
import axios from 'axios'
export default {
async setup() {
const posts = ref([])
const loading = ref(true)
const error = ref(null)
try {
const response = await axios.get('https://api.example.com/posts')
posts.value = response.data
} catch (err) {
error.value = err.message
} finally {
loading.value = false
}
// Можно использовать onMounted для побочных эффектов
onMounted(() => {
console.log('Компонент загружен с данными:', posts.value.length)
})
return { posts, loading, error }
}
}
В Vue 3.2+ появился синтаксис <script setup>, который делает код еще чище. Он автоматически возвращает все объявленные переменные и функции из setup().
Лучшие практики и советы
- Именуйте композаблы с префиксом "use" — это общепринятое соглашение
- Группируйте связанную логику вместе — основное преимущество Composition API
- Используйте TypeScript — Composition API отлично типизируется
- Не бойтесь миксовать с Options API — особенно в legacy-коде
- Документируйте композаблы — как обычные функции
FAQ: Часто задаваемые вопросы
Нужно ли полностью переписывать проекты на Composition API?
Нет! Vue 3 полностью поддерживает Options API. Composition API — это дополнительный инструмент. Начинайте использовать его в новых компонентах или при рефакторинге сложной логики.
Когда использовать ref, а когда reactive?
Используйте ref для примитивов и когда вам нужна реактивная ссылка на значение. reactive лучше подходит для сложных объектов, но помните, что он не работает с примитивами и теряет реактивность при деструктуризации.
Composition API сложнее для новичков?
Первоначальная кривая обучения может быть выше, особенно для тех, кто привык к Options API. Однако для сложных приложений и командной разработки Composition API в долгосрочной перспективе упрощает поддержку кода.
Можно ли использовать Vuex с Composition API?
Да, но в Vue 3 рекомендуется использовать Pinia — новую библиотеку управления состоянием, созданную специально для Composition API. Она проще, типизированнее и имеет отличную интеграцию с Vue 3.
Поддерживается ли Composition API в Vue 2?
Да, через официальный плагин @vue/composition-api. Однако для полной поддержки всех возможностей рекомендуется переход на Vue 3.