最近在使用Vue開發(fā)項目的時候,遇到了一個比較奇怪的問題。我們都知道Vue組件之間通信可以使用$emit方法,但是在一個特定的場景下,$emit卻總是無效。
具體來說,我們在一個叫做Parent的組件中定義了一個子組件Child。我們希望在Child組件中點擊一個按鈕,然后向上發(fā)送一個事件,Parent組件可以監(jiān)聽并處理這個事件。于是我們在Child組件中這樣定義:
methods: { handleClick () { this.$emit('my_event') } }
然后我們在Parent組件中監(jiān)聽這個事件:
... methods: { handleEvent () { console.log('event received') } }
然而,當我們在Child組件中點擊按鈕時,并沒有看到控制臺輸出“event received”。經(jīng)過一番排查,我們發(fā)現(xiàn)問題出在了Parent組件的定義上。
原來,在Parent組件中,我們使用了v-if指令來控制Child組件的顯示。而在Child組件還未被渲染時,它是無法發(fā)送事件的,因此$emit方法不起作用。解決方法也很簡單,我們只需要使用v-show指令來代替v-if即可:
... data: () =>({ showChild: true }), methods: { handleEvent () { console.log('event received') } }
總結(jié)一下,如果你遇到了Vue.$emit無效的情況,不妨檢查一下你的組件是不是被if指令控制了顯示和隱藏。如果是的話,試試替換成v-show指令,說不定問題就迎刃而解了。
上一篇c json對象