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на мікс ...