コントロールレンダリングがの影響を受ける場合、参照バスとイベントバスの両方に問題がありますv-if
。そこで、もっと簡単な方法で行くことにしました。
アイデアは、子コンポーネントに呼び出す必要のあるメソッドを送信するためのキューとして配列を使用することです。コンポーネントがマウントされると、このキューを処理します。キューを監視して新しいメソッドを実行します。
(Desmond Luaの回答からいくつかのコードを借りています)
親コンポーネントコード:
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
、ミックスインに移行するなど、改善の余地はたくさんあります...