Chupachar
@Chupachar
front-end dev

Как вызвать функцию из одного дочернего компонента в родителе, если событие эмитируется родителю из другого дочернего компонента?

Есть дочерний компонент с некой логикой валидации такого вида:
ThePersonalDetailsListData.vue
<template>
  <div></div>
</template>
<script setup>
import {ref, defineEmits } from 'vue';

  const getValidate = () => {
  	console.log('validate');
  }

  const emit = defineEmits(['form-validation']);

  emit('form-validation', getValidate);
 
</script>

так же есть родитель:
App.vue
<template>
 <TheFormNavigation @open-modal="openModalAndSendData"/>
  <form>
    <router-view></router-view>
  </form>
</template>
<script setup>
import {ref} from 'vue'
import TheFormNavigation from './components/TheFormNavigation.vue';

const validation = (getValidation) => { // нужно что то типа такого
  if (typeof getValidation === 'function') {
    getValidation();
  }
}

const openModalAndSendData = () => {
  validation();
}

</script>

и другой дочерний компонент для App.vue в котором есть кнопка отправляющая данные на сервер:
TheFormNavigation.vue
<template>
  <button @click="getValidate">Click</button>
</template>
<script setup>
import { ref, defineEmits } from 'vue';

const emit = defineEmits('open-modal');

function openModal() {
  emit('open-modal'); 
}

</script>


Суть в том что мне в компоненте App.vue нужно запустить функциюgetValidate() из дочернего компонента ThePersonalDetailsListData.vue. Но я не понимаю как это можно реализовать, ведь кнопка находится в компоненте TheFormNavigation.vue при клике по которой я эмитирую событие родителю App.vue и вызываю функциюopenModalAndSendData(), а функция getValidate() находится в компоненте, который является дочерним для App.vue , но по сути никак не связан с компонентом навигации. Вот такая иерархия на данный момент:
659d3f9a5221d433886913.png
Возможно ли это реализовать, EventBus?

Это нужно для того, чтобы при клике по кнопке отправки формы<BaseButton>отработала валидация getValidate(), если так захочется серверу.
  • Вопрос задан
  • 148 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы