$nextTick解決Vue組件卸載在加載合併的問題

情況是這樣的,父子組件都是複選框,點擊父組件的複選框,子組件的複選框要顯示並全選,取消複選框,子組件隱藏。子組件顯隱我用的 v-if ,使用created鉤子函數來使子組件處於全選狀態。

但是出現的問題就是點擊父組件的第一個複選框,在點擊第二個複選框,子組件並不會觸發v-if,只是更新了數據。倒是沒有出發子組件的created鉤子函數。

於是在父組件裏手動卸載組件並創建組件,第7行和第14行

然而並沒有效果

因為Vue會合併對重複數據的處理,並沒有卸載組件,而是一直使true的狀態

怎麼辦呢?

使用$nextTick(渲染更新完成的回調)

在第7行卸載後會渲染一個,我在卸載後在創建就不會合併了

這裡$nextTick 使微任務

如果使用setTimeout會發生抖動,由於使宏任務,會等待所有微任務執行完成後才會執行,雖然時間使0,但是還是有時長,卸載在創建中間出現消失在顯示的情況

 

代碼如下:

 1    /**
 2      * 當選中狀態發生變化(是否是選中狀態,子組件的數據)
 3      */
 4     handleCheckedItemChange(isChecked, item){
 5       console.log(isChecked,item, "=============");
 6       // 卸載組件
 7       this.isShowDetail = false;
 8       this.sonDetail = item.sort ? item.sort : null
 9       this.isSelected = isChecked || false
10       // 因為vue會將重複的指令合併成一個,所以都沒走卸載組件,這裡使用$nextTick在渲染後進行(組件卸載後)在重新創建組件,
11       // 因為$nextTick 是微任務,而使用setTimeout是宏任務,時間過長,使窗口發生抖動,因為銷毀在創建中間消失一下
12       this.$nextTick(() => {
13         // 創建子組件
14         this.isShowDetail = true
15       });
16     }
17   },

 

 

開心的一天,有一種東西叫苦盡甘來,啊哈哈,昨天還在雨中導航,今天就有收穫了

一定要帶傘,因為天有不測風雲,啊哈哈

也希望每個人在下雨的時候都有個人撐着傘在等你

 

Tags: