Как передать данные из одного дочернего компонента в другой?

В Vue.js существует несколько способов передачи данных между дочерними компонентами. Рассмотрим несколько наиболее распространенных подходов.

1. Через Props: Один из самых простых способов передать данные из одного дочернего компонента в другой - использовать props. В родительском компоненте вы можете передать данные через атрибуты компонента. Например:

<template>
  <div>
    <child-component :data="myData"></child-component>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      myData: 'Привет, мир!'
    };
  }
};
</script>

И в дочернем компоненте вы можете принять данные через props:

<template>
  <div>
    <p>{{ data }}</p>
  </div>
</template>

<script>
export default {
  props: {
    data: String
  }
};
</script>

Теперь дочерний компонент будет отображать переданные данные.

2. Через Event Bus: Еще один способ передачи данных между дочерними компонентами - использовать шину событий (event bus). Вы можете создать новый экземпляр Vue и использовать его для передачи данных. Например:

// main.js
import Vue from 'vue';

export const eventBus = new Vue();
<template>
  <div>
    <button @click="sendData">Отправить данные</button>
  </div>
</template>

<script>
import { eventBus } from './main.js';

export default {
  methods: {
    sendData() {
      eventBus.$emit('dataEmitted', 'Данные, которые нужно передать');
    }
  }
};
</script>
<template>
  <div>
    <p>{{ receivedData }}</p>
  </div>
</template>

<script>
import { eventBus } from './main.js';

export default {
  data() {
    return {
      receivedData: ''
    };
  },
  created() {
    eventBus.$on('dataEmitted', (data) => {
      this.receivedData = data;
    });
  }
};
</script>

Теперь, при нажатии кнопки в первом дочернем компоненте, данные будут переданы и отображены во втором дочернем компоненте.

3. Через Vuex: Если ваши компоненты имеют сложные потребности в передаче данных, то рекомендуется использовать Vuex - официальное состояние управление для Vue.js приложений. Vuex предоставляет централизованное хранилище для всех компонентов вашего приложения и позволяет передавать данные между ними. Подключение Vuex к вашему приложению требует настройки, поэтому здесь мы рассмотрим только основные принципы.

// store.js
import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

export default new Vuex.Store({
  state: {
    myData: 'Привет, мир!'
  },
  mutations: {
    setData(state, data) {
      state.myData = data;
    }
  },
  actions: {
    setData(context, data) {
      context.commit('setData', data);
    }
  }
});
<template>
  <div>
    <button @click="sendData">Отправить данные</button>
  </div>
</template>

<script>
import { mapActions } from 'vuex';

export default {
  methods: {
    ...mapActions(['setData']),
    sendData() {
      this.setData('Данные, которые нужно передать');
    }
  }
};
</script>
<template>
  <div>
    <p>{{ receivedData }}</p>
  </div>
</template>

<script>
import { mapState } from 'vuex';

export default {
  computed: {
    ...mapState(['myData']),
    receivedData() {
      return this.myData;
    }
  }
};
</script>

После нажатия кнопки в первом дочернем компоненте, данные будут переданы во второй дочерний компонент через store и отображены.

Вышеуказанные методы - это только некоторые из способов передачи данных между дочерними компонентами в Vue.js. Вам также могут быть полезны другие подходы, такие как использование событий, handoff-props и обратных колбэков. Выбор метода зависит от конкретной задачи и предпочтений разработчика.