Ref et bus d'événements ont tous deux des problèmes lorsque le rendu de votre contrôle est affecté par v-if. J'ai donc décidé d'opter pour une méthode plus simple.
L'idée est d'utiliser un tableau comme file d'attente pour envoyer des méthodes qui doivent être appelées au composant enfant. Une fois le composant monté, il traitera cette file d'attente. Il surveille la file d'attente pour exécuter de nouvelles méthodes.
(Empruntant du code à la réponse de Desmond Lua)
Code du composant parent:
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 },
})
Ceci est le code pour 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>
Et il y a beaucoup à faire pour s'améliorer comme passer processMethodsQueueà un mixin ...