Vue?keepAlive實(shí)現(xiàn)不同的路由共用一個(gè)組件component的緩存問題(推薦)
不同的路由共用一個(gè)組件component,并用keepAlive實(shí)現(xiàn)不同的頁(yè)面緩存
實(shí)現(xiàn)功能:使用列表頁(yè)面檢索的數(shù)據(jù)跳轉(zhuǎn)到對(duì)應(yīng)的詳情頁(yè)面,從詳情頁(yè)回到列表頁(yè)能記住上次檢索的數(shù)據(jù),再次切換到詳情頁(yè)時(shí)能正常取到對(duì)應(yīng)的數(shù)據(jù)
實(shí)現(xiàn)方式使用Vue keepAlive實(shí)現(xiàn)頁(yè)面緩存,整理了一些資料和其他的博客在這里記錄一下。。。。
keepAlive原理:
1,保留組件的狀態(tài),在重新進(jìn)入頁(yè)面時(shí)避免重新渲染。
2、是抽象組件,它自身不會(huì)渲染DOM元素,也不會(huì)出現(xiàn)在父組件鏈中。
3、當(dāng)組件在 內(nèi)被切換,它的 activated 和 deactivated 這兩個(gè)生命周期鉤子函數(shù)將會(huì)被對(duì)應(yīng)執(zhí)行。
實(shí)現(xiàn)
在app.vue中改寫router-view
<keep-alive :include="cachedViews" :exclude="disCachedViews"> <router-view/> </keep-alive>
注意 cachedViews里面存的是由路由name構(gòu)成的數(shù)組,數(shù)組的name需與組件的name一致,否詞不能達(dá)到緩存的效果。
因?yàn)檫@里用的是動(dòng)態(tài)路由,組件的name不能根據(jù)路由動(dòng)態(tài)更改,所以用另外一種方式
<keep-alive> <router-view v-if="$route.meta.keepAlive" > <!-- 這里是會(huì)被緩存的視圖組件 --> </router-view> </keep-alive> <router-view v-if="!$route.meta.keepAlive" > <!-- 這里是不被緩存的視圖組件 --> </router-view>
在構(gòu)建路由時(shí)路由元信息meta加上屬性keepAlive,為true
這里已經(jīng)實(shí)現(xiàn)了頁(yè)面緩存的效果,及第一個(gè)功能檢索的列表頁(yè)面list.vue進(jìn)入到詳情i頁(yè)nfo.vue,再切換回到list.vue可以看到已檢索的數(shù)據(jù)列表。
2.打開一個(gè)新的詳情頁(yè),發(fā)現(xiàn)數(shù)據(jù)是上一次打開的頁(yè)面數(shù)據(jù),數(shù)據(jù)并沒有根據(jù)路由刷新
因?yàn)槲覀冞@里做了keepAlive緩存,重新進(jìn)入頁(yè)面并不會(huì)觸發(fā)created方法,而且詳情頁(yè)info.vue做了多路由復(fù)用同一個(gè)組件的情況,不能使用activated()去觸發(fā)。
解決這個(gè)問題必須解決路由復(fù)用問題,使用Vue-router做項(xiàng)目時(shí),會(huì)遇到如/info/:id這樣只改變id號(hào)的場(chǎng)景。由于router-view是復(fù)用的,單純的改變id號(hào)并不會(huì)刷新router-view
1.方法一:通過 watch 監(jiān)聽路由
watch: { '$route'(to, from) { if (to.path !== from.path) { console.log('檢測(cè)到路由變化') // 初始化數(shù)據(jù) this.initData() } } },
2.方法二:用 :key 來阻止“復(fù)用”
設(shè)置key為$route.fullPath之后,由于兩個(gè)路由的fullPath不同,組件會(huì)被強(qiáng)制不復(fù)用
<keep-alive> <router-view v-if="$route.meta.keepAlive" :key="$route.fullPath"> <!-- 這里是會(huì)被緩存的視圖組件 --> </router-view> </keep-alive> <router-view v-if="!$route.meta.keepAlive" :key="$route.fullPath"> <!-- 這里是不被緩存的視圖組件 --> </router-view>
3.方法三:通過 vue-router 的鉤子函數(shù) beforeRouteEnter beforeRouteUpdate beforeRouteLeave
beforeRouteEnter (to, from, next) { // 在渲染該組件的對(duì)應(yīng)路由被 confirm 前調(diào)用 // 不!能!獲取組件實(shí)例 `this` // 因?yàn)楫?dāng)鉤子執(zhí)行前,組件實(shí)例還沒被創(chuàng)建 }, beforeRouteUpdate (to, from, next) { // 在當(dāng)前路由改變,但是該組件被復(fù)用時(shí)調(diào)用 // 舉例來說,對(duì)于一個(gè)帶有動(dòng)態(tài)參數(shù)的路徑 /foo/:id,在 /foo/1 和 /foo/2 之間跳轉(zhuǎn)的時(shí)候, // 由于會(huì)渲染同樣的 Foo 組件,因此組件實(shí)例會(huì)被復(fù)用。而這個(gè)鉤子就會(huì)在這個(gè)情況下被調(diào)用。 // 可以訪問組件實(shí)例 `this` }, beforeRouteLeave (to, from, next) { // 導(dǎo)航離開該組件的對(duì)應(yīng)路由時(shí)調(diào)用 // 可以訪問組件實(shí)例 `this` }
經(jīng)過實(shí)踐,方法二是比較好用的
到此這篇關(guān)于Vue keepAlive實(shí)現(xiàn)不同的路由共用一個(gè)組件component的緩存問題的文章就介紹到這了,更多相關(guān)Vue keepAlive組件緩存內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue element-ui實(shí)現(xiàn)el-table表格多選以及回顯方式
這篇文章主要介紹了vue element-ui實(shí)現(xiàn)el-table表格多選以及回顯方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07Vue項(xiàng)目中常用的工具函數(shù)總結(jié)
這篇文章主要給大家介紹了關(guān)于Vue項(xiàng)目中常用的工具函數(shù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-09-09Vue入門實(shí)戰(zhàn)之天氣預(yù)報(bào)
這篇文章主要為大家詳細(xì)介紹了Vue入門實(shí)戰(zhàn)之天氣預(yù)報(bào),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08vue+echarts+datav大屏數(shù)據(jù)展示及實(shí)現(xiàn)中國(guó)地圖省市縣下鉆功能
這篇文章主要介紹了vue+echarts+datav大屏數(shù)據(jù)展示及實(shí)現(xiàn)中國(guó)地圖省市縣下鉆,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11基于vue實(shí)現(xiàn)多引擎搜索及關(guān)鍵字提示
這篇文章主要為大家詳細(xì)介紹了基于vue實(shí)現(xiàn)多引擎搜索及關(guān)鍵字提示的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03Vue學(xué)習(xí)筆記進(jìn)階篇之過渡狀態(tài)詳解
本篇文章主要介紹了Vue學(xué)習(xí)筆記進(jìn)階篇之過渡狀態(tài)詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07Vue路由組件的緩存keep-alive和include屬性的具體使用
:瀏覽器頁(yè)面在進(jìn)行切換時(shí),原有的路由組件會(huì)被銷毀,通過緩存可以保存被切換的路由組件,本文主要介紹了Vue路由組件的緩存keep-alive和include屬性的具體使用,感興趣的可以了解一下2023-11-11