Ref dan event bus keduanya memiliki masalah saat render kontrol Anda terpengaruh oleh v-if. Jadi, saya memutuskan untuk menggunakan metode yang lebih sederhana.
Idenya adalah menggunakan array sebagai antrian untuk mengirim metode yang perlu dipanggil ke komponen anak. Setelah komponen dipasang, itu akan memproses antrian ini. Ini melihat antrian untuk menjalankan metode baru.
(Meminjam beberapa kode dari jawaban Desmond Lua)
Kode komponen induk:
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 },
})
Ini adalah kode untuk 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>
Dan ada banyak ruang untuk perbaikan seperti pindah processMethodsQueueke mixin ...