Как передавать данные в Vue?

Вопрос: как передавать данные между компонентами в Vue?

Линия поддержки
Линия поддержки Ответы на вопросы пользователей
12 ноября 2025

Как правильно работать с данными в компонентах? Разберем использование Pinia и его преимущества для управления состоянием.

Изображение записи

Комментарий пользователя

Здравствуйте! Есть локальные события и глобальный статус. В каких случаях применять emit/props, provide/inject или заводить Pinia?

Марцинкевич Полина Пользователь

Ответ специалиста

Здравствуйте! Простое правило: для прямой parent → child связи — props, для child → parent — emit. provide/inject используют для передачи зависимостей глубоко в дерево (тема, сервисы). Это удобно для конфигураций и singletons, но не заменяет store.
Pinia нужен, когда один и тот же state читают и изменяют много несвязанных компонентов, нужна централизованная логика, devtools и плагины.

  • Максим Нивейкин

    Максим Нивейкин

    Младший фронтенд-разработчик Vue

Примеры: 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.