vue3 銷毀組件方法及問題解決方案
問題描述:使用elementplus的dialog,當關(guān)閉彈窗后不刷新頁面,直接再次打開發(fā)現(xiàn)彈窗中還存留上一次的數(shù)據(jù)。嘗試定義關(guān)閉事件,或者使用api中提供的屬性destroy-on-close 都不行。后來發(fā)現(xiàn)這是一個誤區(qū)。彈窗關(guān)閉時并不代表這個組件已經(jīng)被銷毀了,只是dialog關(guān)閉了
解決方法:使用v-if 控制頁面的創(chuàng)建與銷毀。
由于我這里dailog中的數(shù)據(jù)比較多,所以我抽成了一個組件,在父組件中引用了,但是關(guān)閉彈窗的操作是在子組件的dialog中,所以這里又涉及到了子父組件的傳值。再來復(fù)習一遍~。
ps:我這里的業(yè)務(wù)場景是通過在父頁面點擊按鈕來控制子頁面是否彈出來,所以具體實現(xiàn)是這樣的:
在父頁面中定義一個變量,默認為false,當點擊彈出按鈕時,將這個變量置為true;子頁面中手動觸發(fā)關(guān)閉dialog的事件中,將該變量設(shè)置為false,并將值傳遞待到這個父頁面。
結(jié)構(gòu):
子組件
父組件:
接下來具體實現(xiàn):
子組件:當子組件的dialog手動關(guān)閉時
關(guān)閉方法:
使用defineEmits,定義一個方法,并用一個變量去接收,在關(guān)閉事件中傳遞一個值,為false
const colse = defineEmits(["ok"]) function closeNDialog() { colse("ok", false) }
父頁面:在父頁面引用的子組件中使用v-if綁定是否銷毀標識,并定義方法去接收子組件傳遞過來的布爾值。在父頁面通過點擊button打開子組件的事件中將該值設(shè)置為true,此時子頁面為以創(chuàng)建
<!-- 子組件,使用v-if接收,定義ok方法接收子傳遞過來的布爾值, 需要注意。ok應(yīng)和子頁面中定義的保持一致,這個e就代表的是子頁面colse方法傳遞過來的值, 該值為false,然后我們將false賦值給是否銷毀標識 --> <aaa v-if=isExist @ok="e=>isExist=e"></aaa> //定義是否銷毀標識,默認為false,代表銷毀 const isExist = ref(false);
父頁面通過點擊button打開子組件的事件
const showManage = (row) => { openDialog({}).then(resp => { isExist.value = true // 具體業(yè)務(wù)邏輯..... }) }
至此就完成了通過v-if 和子父組件傳值的方法來銷毀子頁面的需求,實現(xiàn)了打開子頁面請求數(shù)據(jù)后,再不刷新地址欄的情況下,再次打開子頁面彈窗時,上一次請求的數(shù)據(jù)被清空,相當于重新創(chuàng)建了一個子頁面。但是并不建議這樣做,因為重復(fù)創(chuàng)建dom元素。我這里由于子頁面中數(shù)據(jù)有很多,并且子頁面中還嵌套了子頁面,要想實現(xiàn)清空數(shù)據(jù),目前我想到的解決方法就是創(chuàng)建,銷毀子頁面。歡迎其他大佬指正更好的實現(xiàn)方式。
到此這篇關(guān)于vue3 銷毀組件方法的文章就介紹到這了,更多相關(guān)vue3 銷毀組件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue?element-ui?Radio單選框默認值選不中的原因:混用字符和數(shù)字問題
這篇文章主要介紹了vue?element-ui?Radio單選框默認值選不中的原因:混用字符和數(shù)字問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12基于cropper.js封裝vue實現(xiàn)在線圖片裁剪組件功能
這篇文章主要介紹了基于cropper.js封裝vue實現(xiàn)在線圖片裁剪組件功能,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2018-03-03