Ref и шина событий имеют проблемы, когда на рендеринг элемента управления влияет v-if . Итак, я решил пойти по более простому методу.
Идея состоит в использовании массива в качестве очереди для отправки методов, которые необходимо вызвать дочернему компоненту. Как только компонент будет смонтирован, он обработает эту очередь. Он наблюдает за очередью, чтобы выполнить новые методы.
(Заимствование кода из ответа Десмонда Луа)
Код родительского компонента:
import ChildComponent from './components/ChildComponent'
new Vue({
el: '#app',
data: {
item: {},
childMethodsQueue: [],
},
template: `
<div>
<ChildComponent :item="item" :methods-queue="childMethodsQueue" />
<button type="submit" @click.prevent="submit">Post</button>
</div>
`,
methods: {
submit() {
this.childMethodsQueue.push({name: ChildComponent.methods.save.name, params: {}})
}
},
components: { ChildComponent },
})
Это код для ChildComponent
<template>
...
</template>
<script>
export default {
name: 'ChildComponent',
props: {
methodsQueue: { type: Array },
},
watch: {
methodsQueue: function () {
this.processMethodsQueue()
},
},
mounted() {
this.processMethodsQueue()
},
methods: {
save() {
console.log("Child saved...")
},
processMethodsQueue() {
if (!this.methodsQueue) return
let len = this.methodsQueue.length
for (let i = 0; i < len; i++) {
let method = this.methodsQueue.shift()
this[method.name](method.params)
}
},
},
}
</script>
И есть много возможностей для улучшения, например, переход processMethodsQueueна миксин ...