Как получить обратный вызов от прослушивателя событий в Nuxt/Vue

#vue.js #vuejs2 #nuxt.js

Вопрос:

Я нахожусь на Nuxt 2.15.8 и хочу получить результат моего события. У меня есть дочерний компонент, в котором генерируется событие . затем получите его на родительском компоненте и выполните несколько вызовов api . Мне нужна двусторонняя связь, чтобы я мог сообщить ребенку , что событие было отправлено, был отправлен вызов api и получен результат, поэтому выполните некоторые действия ! (в настоящее время это делается путем передачи логической опоры ребенку и наблюдения за этим)

что я делаю прямо сейчас:

мой родительский компонент :

 lt;templategt;  lt;childcomponent :result="result" @childEvent="handleEvent" /gt;  lt;/templategt; lt;scriptgt; export default {  components:{ childcomponent },  data(){  return{  result: false  }  }  methods:{  async handleEvent(val){  let res = this.$axios.get(`/example/${val}`)  if(res){  this.result = true  }else{  this.result = false  }  }  } } lt;/scriptgt;  

компонент «мой ребенок» :

 lt;templategt;  lt;div @click="doSomething"gt;lt;/divgt; lt;/templategt; lt;scriptgt; export default {  props:['result'],  watch:{  result(e){  if(e){  // do something  }  }  }  methods:{  doSomething(){  // do something  this.$emit('childEvent', 'val')  }  } } lt;/scriptgt;  

Я знаю , что могу использовать $nuxt.$emit() для отправки другого события от родителя и получения его от ребенка, но я хочу что-то простое, например

 //child this.$emit('childEvent', 'val' , (result)=gt;{  // result of event handler sent from parent })  // Or  let res = await this.$emit('childEvent', 'val') if(res){  // do something }  

Возможно ли это вообще??

Ответ №1:

Я не совсем понимаю, почему вы можете захотеть уведомить ребенка. Если вам просто нужно состояние «загрузка», подойдет опора (установите значение загрузки true при запуске axios, а затем значение false при его завершении). Кстати, API axios асинхронен (основан на обещаниях), поэтому вы должны использовать await:

 let res = await this.$axios.get(`/example/${val}`)  

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

 lt;templategt;  lt;childcomponent ref="child" :result="result" @childEvent="handleEvent" /gt;  lt;/templategt; lt;scriptgt; export default {  components:{ childcomponent },  data(){  return{  result: false  }  }  methods:{  async handleEvent(val){  let res = await this.$axios.get(`/example/${val}`)  this.$refs.child.getResult(res)  }  } } lt;/scriptgt;  

И ребенок:

 lt;templategt;  lt;div @click="doSomething"gt;lt;/divgt; lt;/templategt; lt;scriptgt; export default {  methods:{  doSomething(){  // do something  this.$emit('childEvent', 'val')  },  getResult(res) {  // do something  }  } } lt;/scriptgt;  

Комментарии:

1. Я уже знаю некоторые способы сделать это, но все дело в многоразовом компоненте . функция должна быть на родителе, а ребенок должен просто излучать и получать результат . Если я добавлю this.$refs.child.getResult(res) , я должен сделать это для каждого родителя , что нежелательно, по крайней мере здесь . К вашему сведению, это моя проблема , когда я нажимаю на дочерний компонент , я получаю список в родительском и передаю его дочернему, но по какой-то причине список не будет отображаться, поэтому я собираюсь обновить эту часть в дочернем компоненте, изменив key . Я хочу , чтобы это происходило внутри ребенка, без родительских кодов.

2. Хорошо, я понимаю. Но почему бы не использовать реквизит для передачи списка обратно ребенку? Таким образом, ребенок отображает список в его текущем состоянии, получая обновление после извлечения. Или, в качестве альтернативы, почему бы не позволить ребенку извлекать и хранить данные внутри? На мой взгляд, это лучшие шаблоны, которые обрабатывают события обновления вручную.

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

4. Я не уверен, что хорошо понимаю вашу проблему. Список/данные обычно должны находиться только в одном месте, и владелец данных должен быть единственным, кто его изменяет. Если вы хотите, чтобы этот список использовался во многих частях вашего приложения, возможно, vuex-это то, что вы ищете.