Ref und Event Bus haben beide Probleme, wenn Ihr Steuerelement-Rendering von betroffen ist v-if. Also entschied ich mich für eine einfachere Methode.
Die Idee ist, ein Array als Warteschlange zu verwenden, um Methoden zu senden, die an die untergeordnete Komponente aufgerufen werden müssen. Sobald die Komponente bereitgestellt wurde, verarbeitet sie diese Warteschlange. Es überwacht die Warteschlange, um neue Methoden auszuführen.
(Ausleihen eines Codes aus Desmond Luas Antwort)
Übergeordneter Komponentencode:
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 },
})
Dies ist Code für 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>
Und es gibt viel Raum für Verbesserungen wie den Wechsel processMethodsQueuezu einem Mixin ...