摘要:實(shí)現(xiàn)動(dòng)態(tài)緩存以及緩存銷毀需求來源及描述后臺(tái)管理系統(tǒng)中,左側(cè)為功能菜單欄,點(diǎn)擊菜單列表,右側(cè)顯示該菜單的功能頁面,本來是一個(gè)非常簡(jiǎn)單的后臺(tái)管理系統(tǒng)布局,現(xiàn)在增加了菜單按鈕點(diǎn)擊左側(cè)菜單欄時(shí),右側(cè)頁面頭部顯示當(dāng)前的頁面標(biāo)題,形成一個(gè)列表,點(diǎn)擊可
vue keep-alive實(shí)現(xiàn)動(dòng)態(tài)緩存以及緩存銷毀 需求來源及描述
后臺(tái)管理系統(tǒng)中,左側(cè)為功能菜單欄,點(diǎn)擊菜單列表,右側(cè)顯示該菜單的功能頁面,本來是一個(gè)非常簡(jiǎn)單的后臺(tái)管理系統(tǒng)布局,現(xiàn)在增加了tabs菜單按鈕;
點(diǎn)擊左側(cè)菜單欄時(shí),右側(cè)頁面頭部header顯示當(dāng)前的頁面標(biāo)題,形成一個(gè)tabs列表,點(diǎn)擊可切換頁面內(nèi)容和關(guān)閉tabs;
需求要求,點(diǎn)擊左側(cè)時(shí),右側(cè)顯示頁面內(nèi)容,同時(shí)右側(cè)header增加該頁面的tabs,點(diǎn)擊tabs可以切換頁面,但頁面內(nèi)容不刷新,點(diǎn)擊左側(cè)菜單時(shí),右側(cè)內(nèi)容刷新;
第一想到的時(shí)利用vue的功能組件
此時(shí)只能實(shí)現(xiàn)緩存,但是不能根據(jù)需求實(shí)現(xiàn)動(dòng)態(tài)緩存
解決方案利用include來判斷需要緩存的路由組件,在根據(jù)點(diǎn)擊狀態(tài)更新include
利用計(jì)算屬性和vuex獲取緩存列表
state: { keepAliveList:"",//保存緩存的列表 }, mutations: { setKeepAliveLists(state,arrListString){ state.keepAliveList = arrListString; }, }
computed:{ keepAliveList(){ // 獲取緩存的路由列表 return this.$store.state.keepAliveList; } }
生成緩存列表,列表的值為各組件中name的值集合拼接的字符串
this.$store.commit("setKeepAliveLists",routerComponentNameList.join())
點(diǎn)擊左側(cè)菜單欄時(shí),更新緩存列表
handleSelect(name) { if(this.routerNameMap.has(name)){//如果當(dāng)前點(diǎn)擊的路由已經(jīng)在緩存列表中,則先清除緩存列表,再添加; this.resetKeepAive(name,this.keepAliveList);//刪除緩存路由 this.tabChangeRoute(name);//切換路由 } else { this.routerNameMap.add(name) this.tabChangeRoute(name); } }, // 更新要緩存的路由列表 resetKeepAive(name,cacheList) { const conf = this.keepAliveList; let arr = cacheList.split(","); if (name && typeof name === "string") { let i = arr.indexOf(name); if (i > -1) { arr.splice(i, 1); this.$store.commit("setKeepAliveLists",arr.join()); this.$nextTick(() => {//添加緩存路由 this.$store.commit("setKeepAliveLists",conf); }) } } }
點(diǎn)擊右側(cè)tabs關(guān)閉標(biāo)簽刪除緩存
removeTab(name){ // 點(diǎn)擊tab上的關(guān)閉按鈕,清除當(dāng)前路由的緩存 this.routerNameMap.delete(name); this.resetKeepAive(name,this.keepAliveList);//刪除緩存路由 }
下面為主要代碼,監(jiān)聽當(dāng)前路由是否被移除緩存,如果移除緩存則需要銷毀該組件,否則內(nèi)容中的緩存組件會(huì)越來越來,影響使用性能;
創(chuàng)建一個(gè)mixin.js文件,然后引入到需要被動(dòng)態(tài)緩存的路由組件中即可;
// 路由緩存管理 export default { computed: { keepAliveConf(){ return this.$store.state.keepAliveList; } }, watch:{ keepAliveConf(e){ // 監(jiān)聽緩存列表的變化,如果緩存列表中沒有當(dāng)前的路由或組件則在緩存中銷毀該實(shí)例 let name = this.$options.name; if(!e.split(",").includes(name)) { this.$destroy() } } }, }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/105699.html
摘要:通過這兩種方式分別檢測(cè)是否匹配當(dāng)前組件。修正取出中的不符合條件的,同時(shí)不是目前渲染的時(shí),銷毀對(duì)應(yīng)的組件實(shí)例實(shí)例,并從中移除銷毀對(duì)應(yīng)的組件實(shí)例實(shí)例遍歷中的所有項(xiàng),如果不符合指定的規(guī)則的話,則會(huì)執(zhí)行。則會(huì)調(diào)用組件實(shí)例的方法來將組件銷毀。 keep-alive keep-alive是vue.js的內(nèi)置組件,它能夠把不活動(dòng)的組件的實(shí)例保存在內(nèi)存中,而不是直接的銷毀,它是一個(gè)抽象組件,不會(huì)被渲染...
摘要:為的組件將不會(huì)被緩存。通過這兩種方式分別檢測(cè)是否匹配當(dāng)前組件。修正取出中的不符合條件的,同時(shí)不是目前渲染的時(shí),銷毀對(duì)應(yīng)的組件實(shí)例實(shí)例,并從中移除銷毀對(duì)應(yīng)的組件實(shí)例實(shí)例遍歷中的所有項(xiàng),如果不符合指定的規(guī)則的話,則會(huì)執(zhí)行。 寫在前面 因?yàn)閷?duì)Vue.js很感興趣,而且平時(shí)工作的技術(shù)棧也是Vue.js,這幾個(gè)月花了些時(shí)間研究學(xué)習(xí)了一下Vue.js源碼,并做了總結(jié)與輸出。 文章的原地址:http...
摘要:我們需要的最好效果肯定是當(dāng)前的全局事件就在當(dāng)前的組件下產(chǎn)生作用,當(dāng)我們切換到其他組件時(shí),事件自動(dòng)刪除,于是我可能想到的就是利用鉤子函數(shù)去刪除這個(gè)全局事件。 最近在自學(xué) Vue 也了解了一些基本用法,也記錄了一些筆記有興趣的朋友可以去查看我的其他文章,技術(shù)這東西真的不能光靠看,看是沒有的,你必須要?jiǎng)邮謱?shí)踐,只有在實(shí)戰(zhàn)項(xiàng)目中才能發(fā)現(xiàn)問題,才能發(fā)現(xiàn)我們沒有掌握的知識(shí)點(diǎn),然后發(fā)現(xiàn)問題解決問題,...
摘要:很多優(yōu)化點(diǎn)都是根據(jù)實(shí)際情況入手,上面這幾個(gè),都是我在做項(xiàng)目時(shí),感覺不合適而進(jìn)行優(yōu)化的,后面會(huì)持續(xù)補(bǔ)充下去 主要說的是,我在項(xiàng)目中,自己遇到的一些小問題和解決方案 圖片 base64 問題 // 有一個(gè) test 的組件 .icon { background: url(../assets/test.png); } // 然后有三個(gè)頁面,引入了 test 組...
摘要:動(dòng)態(tài)組件如果我們打算在一個(gè)地方根據(jù)不同的狀態(tài)引用不同的組件的話,比如頁,那么給我們提供動(dòng)態(tài)組件。實(shí)現(xiàn)動(dòng)態(tài)組件的加載。的值可以是一個(gè)已經(jīng)注冊(cè)的組件的名字或者一個(gè)組件的選對(duì)象。 動(dòng)態(tài)組件 如果我們打算在一個(gè)地方根據(jù)不同的狀態(tài)引用不同的組件的話,比如tab頁,那么Vue給我們提供動(dòng)態(tài)組件。 基本使用 Parent.vue {{btn.name}} ...
閱讀 1418·2021-10-11 10:59
閱讀 3118·2019-08-30 15:54
閱讀 2737·2019-08-30 13:19
閱讀 2465·2019-08-30 13:02
閱讀 2380·2019-08-30 10:57
閱讀 3360·2019-08-29 15:40
閱讀 990·2019-08-29 15:39
閱讀 2314·2019-08-29 12:40