Ref e event bus hanno entrambi problemi quando il rendering del controllo è influenzato da v-if. Quindi, ho deciso di utilizzare un metodo più semplice.
L'idea è usare un array come coda per inviare metodi che devono essere chiamati al componente figlio. Una volta che il componente è stato montato, elaborerà questa coda. Controlla la coda per eseguire nuovi metodi.
(Prendendo in prestito un codice dalla risposta di Desmond Lua)
Codice componente genitore:
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 },
})
Questo è il codice per 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>
E c'è molto spazio per migliorare come passare processMethodsQueuea un mixin ...