解決vue單頁面 回退頁面 keeplive 緩存問題
場景:項(xiàng)目中遇到 vue 點(diǎn)擊回退 從A頁跳到B頁,緩存A頁,當(dāng)B頁狀態(tài)修改再次返回A時(shí),A頁查詢條件緩存不刷新,列表刷新
A頁:

B頁:

解決方法:
利用keep-alive 緩存需要緩存的頁面
1.在app.vue中改寫router-view
<template>
<div id="app">
<keep-alive>
<router-view v-if="$route.meta.keepAlive">
<!-- 這里是會(huì)被緩存的視圖組件,比如 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這個(gè)鉤子函數(shù)中的from參數(shù)判斷是從哪個(gè)頁面過來的,這個(gè)參數(shù)執(zhí)行時(shí),組件實(shí)例還沒創(chuàng)建,不能在data中定義變量。所以我們可以在路由中定義一個(gè)變量isBack,用來判斷。
{
path: '/trade',
name: 'trade',
component: () => import( /* webpackChunkName: "about" */ '@/views/trade.vue'),
meta: {
title:'trade.tradeTitle',
keepAlive: true, // 此組件需要被緩存
isBack:false, //用于判斷上一個(gè)頁面是哪個(gè)
}
},
{
path: '/detail/:id',
name: 'detail',
component: () => import( /* webpackChunkName: "about" */ '@/views/detail.vue'),
meta: {
title:'trade.detailTitle',
keepAlive: false,
isBack:false,//用于判斷上一個(gè)頁面是哪個(gè)
}
},
鉤子函數(shù)的執(zhí)行順序:
不使用keep-alive
beforeRouteEnter --> created --> mounted --> destroyed
使用keep-alive
beforeRouteEnter --> created --> mounted --> activated --> deactivated
再次進(jìn)入緩存的頁面,只會(huì)觸發(fā)beforeRouteEnter -->activated --> deactivated 。created和mounted不會(huì)再執(zhí)行。我們可以利用不同的鉤子函數(shù),做不同的事。務(wù)必理解上述鉤子函數(shù)的執(zhí)行時(shí)機(jī)和執(zhí)行順序,本教程的核心就依賴于此鉤子函數(shù)
activated和deactivated是使用keep-alive后,vue中比較重要的兩個(gè)鉤子函數(shù),建議詳細(xì)了解下。
在A頁面中通過beforeRouteEnter這個(gè)鉤子函數(shù)中判斷是從哪個(gè)頁面過來的
beforeRouteLeave(to, from, next) {
// 路由導(dǎo)航鉤子,此時(shí)還不能獲取組件實(shí)例 `this`,所以無法在data中定義變量(利用vm除外)
// 參考 https://router.vuejs.org/zh-cn/advanced/navigation-guards.html
// 所以,利用路由元信息中的meta字段設(shè)置變量,方便在各個(gè)位置獲取。這就是為什么在meta中定義isBack
// 參考 https://router.vuejs.org/zh-cn/advanced/meta.html
if (from.path === '/detail'){
//判斷是從哪個(gè)路由過來的,
//如果是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)入或者刷新頁面后才會(huì)執(zhí)行此鉤子函數(shù)
// 使用keep-alive后(2+次)進(jìn)入不會(huì)再執(zhí)行此鉤子函數(shù)
this.$nextTick(() => {
this.getLists();
});
},
activated中增加判斷條件
activated() {
if(this.$route.meta.isBack || !this.isFirstEnter){
// 如果isBack是false,表明需要獲取新數(shù)據(jù),否則就不再請(qǐng)求,直接使用緩存的數(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)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 解決Vue keep-alive 調(diào)用 $destory() 頁面不再被緩存的情況
- Vue利用localStorage本地緩存使頁面刷新驗(yàn)證碼不清零功能的實(shí)現(xiàn)
- vue頁面跳轉(zhuǎn)實(shí)現(xiàn)頁面緩存操作
- keep-Alive搭配vue-router實(shí)現(xiàn)緩存頁面效果的示例代碼
- Vue2.0 實(shí)現(xiàn)頁面緩存和不緩存的方式
- vue項(xiàng)目強(qiáng)制清除頁面緩存的例子
- vue Tab切換以及緩存頁面處理的幾種方式
- 關(guān)于vue里頁面的緩存詳解
- vue緩存的keepalive頁面刷新數(shù)據(jù)的方法
- 如何管理Vue中的緩存頁面
相關(guān)文章
詳解為element-ui的Select和Cascader添加彈層底部操作按鈕
這篇文章主要介紹了詳解為element-ui的Select和Cascader添加彈層底部操作按鈕,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
vue-cli 為項(xiàng)目設(shè)置別名的方法
這篇文章主要介紹了vue-cli 為項(xiàng)目設(shè)置別名的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
vue router導(dǎo)航守衛(wèi)(router.beforeEach())的使用詳解
導(dǎo)航守衛(wèi)主要用來通過跳轉(zhuǎn)或取消的方式守衛(wèi)導(dǎo)航。這篇文章主要介紹了vue-router導(dǎo)航守衛(wèi)(router.beforeEach())的使用,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04
Vue項(xiàng)目實(shí)現(xiàn)簡單的權(quán)限控制管理功能
這篇文章主要介紹了Vue項(xiàng)目實(shí)現(xiàn)簡單的權(quán)限控制功能,文中給大家介紹了兩種方式進(jìn)行權(quán)限限制,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2019-07-07
element?實(shí)現(xiàn)導(dǎo)航欄收起展開功能及思路
這篇文章主要介紹了element?實(shí)現(xiàn)導(dǎo)航欄收起展開功能,實(shí)現(xiàn)思路先給 el-menu加上 :collapse="isCollapse" 屬性,這個(gè)屬性也是 element 上的一個(gè)參數(shù),意思為是否開啟折疊動(dòng)畫,在 data 中定義 isCollapse ,用 true 和 false 控制展開與收起,需要的朋友可以參考下2023-01-01
Vue3+TypeScript封裝axios并進(jìn)行請(qǐng)求調(diào)用的實(shí)現(xiàn)
這篇文章主要介紹了Vue3+TypeScript封裝axios并進(jìn)行請(qǐng)求調(diào)用的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04

