解決vue單頁面 回退頁面 keeplive 緩存問題
場景:項目中遇到 vue 點擊回退 從A頁跳到B頁,緩存A頁,當(dāng)B頁狀態(tài)修改再次返回A時,A頁查詢條件緩存不刷新,列表刷新
A頁:
B頁:
解決方法:
利用keep-alive 緩存需要緩存的頁面
1.在app.vue中改寫router-view
<template> <div id='app'> <keep-alive> <router-view v-if='$route.meta.keepAlive'> <!-- 這里是會被緩存的視圖組件,比如 page1,page2 --> </router-view> </keep-alive> <router-view v-if='!$route.meta.keepAlive'> <!-- 這里是不被緩存的視圖組件,比如 page3 --> </router-view> </div></template>
2.在router/index.js中添加路由元信息,設(shè)置需要緩存的頁面
keepAlive:設(shè)置需要緩存的頁面
isBack:通過beforeRouteEnter這個鉤子函數(shù)中的from參數(shù)判斷是從哪個頁面過來的,這個參數(shù)執(zhí)行時,組件實例還沒創(chuàng)建,不能在data中定義變量。所以我們可以在路由中定義一個變量isBack,用來判斷。
{ path: ’/trade’, name: ’trade’, component: () => import( /* webpackChunkName: 'about' */ ’@/views/trade.vue’), meta: { title:’trade.tradeTitle’, keepAlive: true, // 此組件需要被緩存 isBack:false, //用于判斷上一個頁面是哪個 } }, { path: ’/detail/:id’, name: ’detail’, component: () => import( /* webpackChunkName: 'about' */ ’@/views/detail.vue’), meta: { title:’trade.detailTitle’, keepAlive: false, isBack:false,//用于判斷上一個頁面是哪個 } },
鉤子函數(shù)的執(zhí)行順序:
不使用keep-alive
beforeRouteEnter --> created --> mounted --> destroyed
使用keep-alive
beforeRouteEnter --> created --> mounted --> activated --> deactivated
再次進(jìn)入緩存的頁面,只會觸發(fā)beforeRouteEnter -->activated --> deactivated 。created和mounted不會再執(zhí)行。我們可以利用不同的鉤子函數(shù),做不同的事。務(wù)必理解上述鉤子函數(shù)的執(zhí)行時機和執(zhí)行順序,本教程的核心就依賴于此鉤子函數(shù)
activated和deactivated是使用keep-alive后,vue中比較重要的兩個鉤子函數(shù),建議詳細(xì)了解下。
在A頁面中通過beforeRouteEnter這個鉤子函數(shù)中判斷是從哪個頁面過來的
beforeRouteLeave(to, from, next) { // 路由導(dǎo)航鉤子,此時還不能獲取組件實例 `this`,所以無法在data中定義變量(利用vm除外) // 參考 https://router.vuejs.org/zh-cn/advanced/navigation-guards.html // 所以,利用路由元信息中的meta字段設(shè)置變量,方便在各個位置獲取。這就是為什么在meta中定義isBack // 參考 https://router.vuejs.org/zh-cn/advanced/meta.html if (from.path === ’/detail’){ //判斷是從哪個路由過來的, //如果是B頁面即detail頁面過來的,表明當(dāng)前頁面不需要刷新獲取新數(shù)據(jù),直接用之前緩存的數(shù)據(jù)即可 to.meta.isBack = true; }else{ to.meta.isBack = false; } next(); },
data中定義變量isFirstEnter用來判斷是否第一次進(jìn)入,或是否刷新了頁面,默認(rèn)false
data() { return { isFirstEnter:false, }; },
created中把isFirstEnter變?yōu)閠rue,說明是第一次進(jìn)入或刷新了頁面
created() { this.isFirstEnter=true; // 只有第一次進(jìn)入或者刷新頁面后才會執(zhí)行此鉤子函數(shù) // 使用keep-alive后(2+次)進(jìn)入不會再執(zhí)行此鉤子函數(shù) this.$nextTick(() => { this.getLists(); }); },
activated中增加判斷條件
activated() { if(this.$route.meta.isBack || !this.isFirstEnter){ // 如果isBack是false,表明需要獲取新數(shù)據(jù),否則就不再請求,直接使用緩存的數(shù)據(jù) // 如果isFirstEnter是true,表明是第一次進(jìn)入此頁面或用戶刷新了頁面,需獲取新數(shù)據(jù) this.tradeList=[] this.AjaxList = [] //把數(shù)據(jù)清空,可以稍微避免讓用戶看到之前緩存的數(shù)據(jù) this.pageNum = 1; this.$nextTick(() => { this.getLists(); }); }else{ this.$route.meta.isBack=false this.isFirstEnter=false; }},
以上這篇解決vue單頁面 回退頁面 keeplive 緩存問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. 使用 kind 和 Docker 啟動本地的 Kubernetes環(huán)境2. idea設(shè)置自動導(dǎo)入依賴的方法步驟3. 解決python中import文件夾下面py文件報錯問題4. XML入門精解之結(jié)構(gòu)與語法5. ASP基礎(chǔ)入門第八篇(ASP內(nèi)建對象Application和Session)6. IntelliJ IDEA設(shè)置編碼格式的方法7. IntelliJ IDEA設(shè)置默認(rèn)瀏覽器的方法8. idea自定義快捷鍵的方法步驟9. IntelliJ IDEA設(shè)置條件斷點的方法步驟10. Idea如何去除Mapper警告方法解析
