vue3緩存頁面keep-alive及路由統一處理詳解
一、前言
當使用路由跳轉到其他頁面的時候,要求緩存當前頁面,比如列表頁面跳轉到詳情頁面,需要緩存列表內容,並且保存滾動條位置,也有時候需要緩存的頁面裡面有部分內容不緩存,總之各種情況,下面就列舉其中一些例子
vue2和vue3的使用方式是不一樣的
created()方法和mounted()方法在頁面初始化的時候會執行,如果緩存瞭頁面,這兩個方法都不會再執行,還有如果緩存瞭頁面,vue2中的destroyed()和vue3中的unmounted()方法都不會執行
activated()方法在每次進入頁面都會執行
二、使用
1.vue2和vue3的不同
vue2:
<template> <div id="nav"> <router-link to="/">Home</router-link> | <router-link to="/about">About</router-link> </div> <!-- vue2.x配置 --> <keep-alive> <router-view v-if="$route.meta.keepAlive" /> </keep-alive> <router-view v-if="!$route.meta.keepAlive"/> </template>
vue3:
<template> <div id="nav"> <router-link to="/">Home</router-link> | <router-link to="/about">About</router-link> </div> <!-- vue3.0配置 Component是固定寫法--> <router-view v-slot="{ Component }"> <keep-alive> <component :is="Component" v-if="$route.meta.keepAlive"/> </keep-alive> <component :is="Component" v-if="!$route.meta.keepAlive"/> </router-view> </template>
route.js中配置:
path: '/', name: 'Home', component: Home, meta:{ keepAlive: true }
效果:
2.頁面某些數據不需要緩存
可以在activated()方法中處理需要部分刷新的邏輯
... 需要部分刷新的數據:<input type="text" v-model="newStr" /> ... data() { return { newStr: "2", }; }, mounted() { console.log("執行瞭mounted方法"); this.newStr = "3"; }, activated() { console.log("執行瞭actived方法。。。"); this.newStr = "4"; }
效果:
3.動態設置keepAlive屬性
也可以在vue文件中設置keepAlive屬性,實測隻有在beforeRouteEnter()方法中添加才會生效,即進入頁面的時候
在Home.vue中添加:
// 使用組件內守衛,對離開頁面事件做一些操作 // to為即將跳轉的路由,from為上一個頁面路由 beforeRouteEnter(to, from, next) { to.meta.keepAlive = true; // 路由繼續跳轉 next(); }
4.使用include,exclude配置需要緩存的組件
在app.vue中配置:
<router-view v-slot="{ Component }"> <keep-alive include="testKA"> <component :is="Component"/> </keep-alive> </router-view>
其中,testKA對應某個組件的name:
export default { name:'testKA',// keep-alive中include屬性匹配組件name data() {return {}}, activated() { // keepalive緩存的頁面每次進入都會進行的生命周期 }, }
此外,include用法還有如下:
<!-- 逗號分隔字符串 --> <keep-alive include="a,b"> <component :is="view"></component> </keep-alive> <!-- 正則表達式 (使用 `v-bind`) --> <keep-alive :include="/a|b/"> <component :is="view"></component> </keep-alive> <!-- 數組 (使用 `v-bind`) --> <keep-alive :include="['a', 'b']"> <component :is="view"></component> </keep-alive>
exclude用法與include用法相同,代表不被緩存的組件。
5.部分頁面過來需要緩存,部分頁面過來需要刷新
描述:如有a,b,c三個頁面,a->b時,b刷新頁面,然後b->c,c->b時,b不刷新頁面,再b->a,a->b時,b刷新頁面。
自測,隻有配合vuex才能實現,但是缺點是,頁面緩存的時候不執行activated()方法
6.緩存隻在一級路由生效
如果需要在二級路由使用緩存,可以在一級路由中進行同樣的配置
store.js代碼:
state: { keepAlives:[] }, mutations: { SET_KEEP_ALIVE(state,params) { state.keepAlives = params } }, getters:{ keepAlive:function(state){ return state.keepAlives } }
App.vue代碼:
<template> <div id="nav"> <router-link to="/bbb">BBB</router-link> | <router-link to="/home">Home</router-link> | <router-link to="/about">About</router-link> </div> <router-view v-slot="{ Component }"> <keep-alive :include="keepAlive"> <component :is="Component"/> </keep-alive> </router-view> </template> <script> export default{ computed:{ keepAlive(){ return this.$store.getters.keepAlive } } } </script>
Home.vue代碼:
// 使用組件內守衛,對離開頁面事件做一些操作 // to為即將跳轉的路由,from為上一個頁面路由 beforeRouteEnter(to, from, next) { next(vm=>{ if(from.path == "/bbb"){ vm.$store.commit("SET_KEEP_ALIVE",["Home"]) } }); }, beforeRouteLeave(to, from, next) { if (to.path == "/about") { console.log("將要跳轉/about頁面...") } else { console.log("將要跳轉非/about頁面...") this.$store.commit("SET_KEEP_ALIVE",[]) } // 路由繼續跳轉 next(); }
效果:
總結
到此這篇關於vue3緩存頁面keep-alive及路由統一處理的文章就介紹到這瞭,更多相關vue3緩存頁面keep-alive內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- vue中keepAlive組件的作用和使用方法詳解
- Vue實現前端頁面緩存的過程
- vue中activated的用法
- vue前端開發keepAlive使用詳解
- vue中keep-alive組件的用法示例