Комментарий пользователя
Здравствуйте! Есть локальные события и глобальный статус. В каких случаях применять emit/props, provide/inject или заводить Pinia?
Ответ специалиста
Здравствуйте! Простое правило: для прямой parent → child связи — props, для child → parent — emit. provide/inject используют для передачи зависимостей глубоко в дерево (тема, сервисы). Это удобно для конфигураций и singletons, но не заменяет store.
Pinia нужен, когда один и тот же state читают и изменяют много несвязанных компонентов, нужна централизованная логика, devtools и плагины.
Примеры: emit из дочернего компонента
// Child.vue (Composition API)
const emit = defineEmits(['select']);
function onClick(id) { emit('select', id); }
provide/inject для сервиса:
// Provider.vue
import { provide } from 'vue';
provide('analytics', analyticsService);
// DeepChild.vue
import { inject } from 'vue';
const analytics = inject('analytics');
analytics.track('event');
Pinia — когда нужен store:
import { defineStore } from 'pinia';
export const useUserStore = defineStore('user', {
state: () => ({ user: null }),
actions: { setUser(u){ this.user = u } }
});
Для тестируемости и ясности предпочитайте props/emit; provide/inject для сервисов; Pinia для cross-cutting state.
Больше уроков и практических советов в рассылке Академи Selectel.