在Vue開發中,我們經常需要父子組件之間進行通信。其中一種方式是使用emit()來向父組件派發事件,從而實現子組件傳值。但是,如果發生了循環嵌套,就容易產生問題。下面舉一個簡單的例子。
<template> <div> <child-component :prop1="parentProp"></child-component> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, data() { return { parentProp: 'parent1' } }, methods: { parentFunc() { console.log('parent event happened'); } } } </script>
上面的代碼中,父組件傳遞一個名為parentProp的屬性給子組件,同時定義了一個名為parentFunc的方法。接下來我們來看一下子組件的代碼。
<template> <div> <child-component :prop1="childProp" @child-event="childFunc"></child-component> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, data() { return { childProp: 'child1' } }, methods: { childFunc() { console.log('child event happened'); this.$emit('child-event'); } } } </script>
子組件接收父組件的prop,并定義了一個名為childFunc的方法,在該方法中觸發了一個名為child-event的自定義事件。也就是說,子組件向自己發送了一個事件。
此時,父組件中的parentFunc方法并沒有被觸發。這是因為Vue會將子組件中通過$emit()派發的事件向父組件冒泡,從而實現父子組件之間的通信。但是,如果在子組件中不小心通過$emit()派發了一個自定義事件,就會形成循環嵌套,從而打破了事件冒泡機制的正常運行。
為了避免這種情況,在子組件中最好避免派發自定義事件。如果確實需要派發自定義事件,可以將事件名字設置得更具體,避免與父組件中的事件重名。這樣做可以盡量減小事件冒泡產生的影響。
上一篇python 類必須重寫
下一篇vue emmet