Вызов функций в дочернем компоненте из родителя в Vue 2.0

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

По своей сути задача сводится к тому, чтобы присвоить ref дочернему компоненту и обращаться к его методам напрямую из родительского объекта, используя эту ссылку.

vue
Скопировать код
<!-- Родительский компонент -->
<template>
  <Child ref="childRef" />
  <button @click="invokeChild">Активировать метод дочернего компонента</button>
</template>

<script>
import { ref } from 'vue';
import Child from './Child.vue';

export default {
  components: { Child },
  setup() {
    const childRef = ref(null);

    const invokeChild = () => {
      if (childRef.value) {
        childRef.value.childMethod();
      }
    };

    return {
      childRef,
      invokeChild,
    };
  },
};
</script>

Далее представлен пример дочернего компонента:

vue
Скопировать код
<!-- Дочерний компонент -->
<script setup>
import { defineExpose } from 'vue';

const childMethod = () => console.log('Функция дочернего компонента исполнена!');
defineExpose({ childMethod });
</script>

Родительский компонент теперь способен активировать childMethod() дочернего компонента при каждом клике на кнопку. Таким образом, дочерний компонент всегда готов к взаимодействию!🔊

Кинга Идем в IT: пошаговый план для смены профессии

Подробное рассмотрение vue refs

Не ограничивайтесь базовыми знаниями, ведь делимся мы знаниями для того, чтобы умножать их. Давайте изучим различные способы использования vue refs, которые позволяют активировать функции дочерних компонентов из родительского.

Доступ к методам компонента через $refs

В Vue 2 и при использовании Options API в Vue 3, this.$refs позволяют активировать методы дочернего компонента. Присвойте атрибут ref.

JS
Скопировать код
export default {
  methods: {
    parentFunction() {
      this.$refs.childRef.childFunction();
    }
  }
}

Реактивные пропсы для активации функций дочернего компонента

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

vue
Скопировать код
<template>
  <Child :some-prop="parentData" />
</template>

<script>
export default {
  data() {
    return {
      parentData: 'Привет, наслаждайся новыми данными!'
    };
  }
}
</script>

Дочерний компонент реагирует следующим образом:

JS
Скопировать код
<script>
export default {
  props: ['someProp'],
  watch: {
    someProp(newValue) {
      this.childAction(newValue);
    }
  },
  methods: {
    childAction(propValue) {
      // Что нового принёс родитель?💢
    }
  }
}
</script>

Применение шины событий для коммуникации

Шина событий в настоящее время является устаревшей, но отлично демонстрирует, как с помощью Vue реализуется взаимодействие между родительскими и дочерними компонентами.

Публичные методы с помощью defineExpose в Composition API

Во Vue 3 и Composition API публичные методы определяются через defineExpose.

Взаимодействие с использованием $emit и $on

Система событий Vue позволяет дочерним компонентам инициировать события, а родительским управлять их исполнением.

Паттерны коммуникации

Обратим внимание на различные подходы к улучшению взаимодействия между родительскими и дочерними компонентами, помогающие избежать хаоса.

Централизованное управление состоянием с помощью Vuex

В сложных случаях, особенно в крупных приложениях, Vuex представляет собой централизованный подход к управлению состоянием.

Гибкое управление с помощью слотов в компонентах

Слоты в компонентах предлагают более широкие возможности для гибкого взаимодействия, нежели прямой вызов методов дочернего компонента.

Магия реактивных пропсов

Декларативное использование реактивных пропсов раскрывает новые грани программирования.

Визуализация

Давайте сравним взаимодействие между родительским и дочерними компонентами с радиосвязью:

Markdown
Скопировать код
Родительский компонент (👩‍💼): Мне требуется дать инструкции дочернему компоненту (👶).

Родитель использует радиостанцию, аналог ref.

JS
Скопировать код
const childRef = ref(null);

У родителя происходит событие:

JS
Скопировать код
const onParentEvent = () => {
  if(childRef.value) {
    childRef.value.childSpecificMethod();
  }
};
Markdown
Скопировать код
Дочерний компонент (👶): Приказ понят и будет исполнен!

Таким образом, задача родителя успешно выполнена!

Markdown
Скопировать код
Сигнал родителя (👩‍💼📞): Инструкция передана.
Действие дочернего компонента (👶🏃): Метод исполнен.