如何手動(dòng)銷毀Vue中掛載的組件
手動(dòng)銷毀Vue掛載的組件
因?yàn)楹芏囗撁嫘枰玫?lt;keep-alive>,我就用其將承載頁面的父組件包裹了,但這也帶來了一些問題。比如新寫的頁面中,進(jìn)入下個(gè)頁面還在調(diào)用上個(gè)頁面的數(shù)據(jù)(以前沒有遇到過,不清楚是是什么原因),即已經(jīng)切換路由卻無法自己destory掉,打日志發(fā)現(xiàn)確實(shí)沒有跑destoryed這個(gè)生命周期函數(shù)。
如何解決
在需要?jiǎng)h除的組件中的deactivated生命周期函數(shù)中手動(dòng)調(diào)用this.$destroy('componentName'),這里的componentName即這個(gè)組件的name,使用后發(fā)現(xiàn)destoryed函數(shù)確實(shí)可以正常使用了,而且進(jìn)入下一個(gè)頁面也不會(huì)再報(bào)錯(cuò)說缺少這個(gè)頁面的數(shù)據(jù)。
vue 銷毀實(shí)例
1.導(dǎo)入vue創(chuàng)建一個(gè)VM實(shí)例
傳入配置對(duì)象,了解配置對(duì)象中的各個(gè)屬性
var VM = new Vue({ el: '#app', // 表示當(dāng)我們new的這個(gè)Vue實(shí)例, 要控制頁面上的那個(gè)區(qū)域? data: { // data屬性中,存放的是el中要用到的數(shù)據(jù),這里的data就是MVVM中的M專門用來保存每個(gè)頁面的數(shù)據(jù) message: 'Hello Vue!' },? methods : {}, // 這個(gè)methods屬性中定義了當(dāng)前Vue實(shí)例所有可用的方法,主要寫業(yè)務(wù)邏輯? computed: {}, // 在computed中,可以定一些屬性, 這些屬性叫做計(jì)算屬性,計(jì)算屬性的本質(zhì)就是一個(gè)方法,只不過我們?cè)谑褂眠@些計(jì)算屬性的時(shí)候是吧它們的名稱直接當(dāng)做屬性來使用的,并不會(huì)把計(jì)算屬性當(dāng)做方法去調(diào)用? filters : {}, // 這個(gè)filters屬性中定義了當(dāng)前Vue實(shí)例中所有可用的過濾的方法? watch: {}, // 使用這個(gè)屬性,可以監(jiān)聽data中數(shù)據(jù)的變化,然后觸發(fā)這個(gè)watch中對(duì)應(yīng)的function處理函數(shù) router, // 掛載路由對(duì)象? directives:{}, // 這個(gè)directives屬性定義了當(dāng)前Vue實(shí)例中所有可用的自定義指令 beforeCreate () {}, // 生命周期函數(shù): 表示實(shí)例完全被創(chuàng)建之前,會(huì)執(zhí)行這個(gè)函數(shù)? created () {}, // 生命周期函數(shù): 表示實(shí)例被創(chuàng)建之后? beforeMounted () {}, // 生命周期函數(shù): 表示模板已經(jīng)編譯完成,但是還沒有把模板渲染到頁面中? mounted () {}, // 生命周期函數(shù):表示模板已經(jīng)編譯完成,內(nèi)存中的模板已經(jīng)真實(shí)的渲染到了頁面中去,已經(jīng)可以看到渲染好的頁面了? beforeUpdate () {}, // 生命周期函數(shù): 表示當(dāng)前界面還沒有被更新,數(shù)據(jù)肯定被更新了? update () {}, // 生命周期函數(shù): 表示當(dāng)前頁面和數(shù)據(jù)保持同步了,都是最新的? beforeDestroy () {}, // 生命周期函數(shù): 表示Vue實(shí)例已經(jīng)從運(yùn)行階段進(jìn)入到銷毀階段? destroyed () {} // 生命周期函數(shù): 表示組件已經(jīng)完全被銷毀了})
2.vm.$destroy()只能銷毀實(shí)例里的方法但不能清除DOM和data嗎?
destroy()只是完全銷毀一個(gè)實(shí)例,清理它與其它實(shí)例的連接,解綁它的全部指令及事件監(jiān)聽器。
參見官方文檔: https://cn.vuejs.org/v2/api/#vm-destroy
它并不是用來清除已有頁面上的DOM的。實(shí)現(xiàn)功能包括:
(1) 包括Watcher對(duì)象從其所在Dep中釋放
if (vm._watcher) { ? vm._watcher.teardown() } let i = vm._watchers.length while (i--) { ? vm._watchers[i].teardown() } // remove reference from data ob // frozen object may not have observer. if (vm._data.__ob__) { ? vm._data.__ob__.vmCount-- }
(2) 移除所有事件的監(jiān)聽
vm.$off()
(3) patch一個(gè)null目的是觸發(fā)所有的destroy鉤子。
vm.__patch__(vm._vnode, null) return function patch (oldVnode, vnode, hydrating, removeOnly, parentElm, refElm) { ? ? /*vnode不存在則直接調(diào)用銷毀鉤子*/ ? ? if (isUndef(vnode)) { ? ? ? if (isDef(oldVnode)) invokeDestroyHook(oldVnode) ? ? ? return ? ? } ? ? ... ?}
想要清除頁面的 DOM,需要使用 v-if,或者修改 v-for 中涉及到的數(shù)組或?qū)ο蟆?/p>
另外,調(diào)用 app.$destroy() 之后,你會(huì)發(fā)現(xiàn),app.message = ‘Yes, he is a boy.’ 不會(huì)對(duì)頁面產(chǎn)生影響。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue 項(xiàng)目 iOS WKWebView 加載
這篇文章主要介紹了vue 項(xiàng)目 iOS WKWebView 加載問題,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04Vue路由組件的緩存keep-alive和include屬性的具體使用
:瀏覽器頁面在進(jìn)行切換時(shí),原有的路由組件會(huì)被銷毀,通過緩存可以保存被切換的路由組件,本文主要介紹了Vue路由組件的緩存keep-alive和include屬性的具體使用,感興趣的可以了解一下2023-11-11Vue路由監(jiān)聽實(shí)現(xiàn)同頁面動(dòng)態(tài)加載的示例
本文主要介紹了Vue基于路由監(jiān)聽實(shí)現(xiàn)同頁面動(dòng)態(tài)加載的示例,重點(diǎn)在于切換路由的時(shí)候,重新拉取列表數(shù)據(jù),接下來看看實(shí)現(xiàn)方法吧2021-05-05淺談vue+webpack項(xiàng)目調(diào)試方法步驟
本篇文章主要介紹了淺談vue+webpack項(xiàng)目調(diào)試方法步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09vue左右側(cè)聯(lián)動(dòng)滾動(dòng)的實(shí)現(xiàn)代碼
這篇文章主要介紹了vue左右側(cè)聯(lián)動(dòng)滾動(dòng)的實(shí)現(xiàn)代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-06-06vue實(shí)現(xiàn)導(dǎo)航欄效果(選中狀態(tài)刷新不消失)
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)導(dǎo)航欄效果,選中狀態(tài)刷新不消失,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12解決element-ui table設(shè)置列fixed時(shí)X軸滾動(dòng)條無法拖動(dòng)問題
這篇文章主要介紹了解決element-ui table設(shè)置列fixed時(shí)X軸滾動(dòng)條無法拖動(dòng)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10