在開發(fā)Vue項目時,子組件是非常常見的組件類型。子組件顧名思義就是被包含在另一個組件中的子級組件。隨著項目的發(fā)展,我們有時候需要關(guān)閉一個子組件,本文將詳細(xì)講述如何關(guān)閉Vue子組件。
首先,我們需要明確一點,關(guān)閉Vue子組件不是指隱藏子組件,在Vue框架中隱藏子組件可以使用v-show或v-if指令來實現(xiàn)。關(guān)閉子組件是指使子組件不再顯示在父組件的組件樹中,也就是將其徹底卸載。
<template> <div> <h1>我的父組件</h1> <my-child :is-show="true"/> <button @click="closeChild">關(guān)閉子組件</button> </div> </template> <script> import MyChild from './MyChild.vue'; export default { name: 'MyParent', components: { MyChild }, methods: { closeChild() { // TODO: 調(diào)用關(guān)閉子組件的方法 } } }; </script>
如上代碼所表示,拉取了子組件MyChild.vue。父組件中使用了Is-Show這個屬性來控制是否顯示MyChild.vue。同時父組件中也掛載了一個關(guān)閉子組件的方法。
那么如何調(diào)用關(guān)閉Vue子組件的方法呢?Vue提供了兩種方式來銷毀子組件,即將子組件從父組件中刪除和銷毀子組件的實例對象。這兩種方式分別對應(yīng)兩個函數(shù),removeChild()和destroy()。我們實現(xiàn)關(guān)閉Vue子組件需要用到Vue的一個mixins方法。
<script> export default { mounted() { this.$root.eventHub.$on('close-child-component', this.closeSelf); }, beforeDestroy() { this.$root.eventHub.$off('close-child-component', this.closeSelf); }, methods: { closeSelf() { const elem = this.$el; elem.parentNode.removeChild(elem); this.$destroy(); } } }; </script>
如上代碼所示,我們定義了一個名為closeSelf的方法。在父組件mounted鉤子函數(shù)中,我們監(jiān)聽了一個事件名為“close-child-component”,然后將closeSelf綁定到該事件上。當(dāng)我們需要關(guān)閉子組件時,只需要觸發(fā)該事件即可。
當(dāng)我們調(diào)用事件時,會將$el即子組件的DOM元素從父節(jié)點中刪除,并通過this.$destroy()方法銷毀子組件的實例對象,這意味著子組件的所有生命周期鉤子函數(shù)都會被調(diào)用(beforeDestroy、destroyed)。
在使用Vue框架中,子組件是非常常見的組件類型。而在Vue中關(guān)閉子組件就需要將子組件從父組件中刪除并銷毀子組件的實例對象。我們可以使用Vue提供的mixins方法,來實現(xiàn)關(guān)閉Vue子組件。