<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
專案中經常會有這麼一個需求,一個表單頁面,可能需要跳轉其他頁面拿到對應的資料,再跳回表單頁面,但是之前填寫過的資料還在。而某些頁面跳這個表單頁面的時候,是不需要快取,因為他是新增,如果是快取的話,那麼上次填的資料,下次進入這個表單頁面的時候,那麼資料還存在,明顯不符合設計的要求。
因為專案中使用的是 vue3,所以對於頁面快取,第一時間想到就是利用 keepAlive 做快取,但是如果不做其他處理的話,僅僅簡單使用 keepAlive 會帶來一些問題,就像上面說的,如果上次填的資料,回退到上一個頁面,再進來表單頁,那麼上次填的資料還存在,那麼,我們該怎麼去清掉快取,什麼時候又加入快取呢,而且清快取和加入快取的時機,我們又怎麼把握呢,這就是我們需要解決的難題。
一開始,我想到的是,維護 keepAlive 的 include 陣列,這個陣列我使用的是 set 資料結構,因為有比較方便的增刪方法,而且不重複,程式碼如下:
// useCache.ts import { ref } from "vue"; const KEEP_ALIVE_SET = ref(new Set([])); export default () => { const setKeepAlive = <T extends "add" | "delete">( operate: T, value: number ) => { KEEP_ALIVE_SET.value[operate](value); }; return { KEEP_ALIVE_SET, setKeepAlive }; };
<!-- App.vue --> <template> <router-view v-slot="{ Component }"> <transition name="router-fade" mode="out-in"> <keep-alive :include="Array.from(KEEP_ALIVE_SET)"> <component :is="Component" /> </keep-alive> </transition> </router-view> </template>
關於這裡 setKeepAlive 的時機的心智負擔著實有點大,因為 add 的時候,存在著大量的頁面進行 add,即使用了路由守衛去設定,邏輯的編寫也充斥著程式碼本身,隨著頁面變多,這心智負擔也會呈現直線增長,並且這還會有一個 bug,當 add 快取的時候,首次進入快取頁面,其實他還沒快取下來,我們都知道 keepAlive 執行快取,需要首次進入頁面的時候記錄下來,之後再進入的時候,判斷該頁面是否已經載入過,就不執行重新渲染,也就造成了,快取能生效是在第二次進入這個頁面的時候,這明顯與我們的預想不符合,所以該方案也就 pass 掉了。
我們回顧下關於在 vue 中的 key 屬性:
key 這個特殊的 attribute 主要作為 Vue 的虛擬 DOM 演演算法提示,在比較新舊節點列表時用於識別 vnode。如果 key 相同,會最小化觸發重新渲染(達到快取的目的),如果 key 不同,那麼肯定會發生替換。
// useCache.ts import { ref } from "vue"; const kEEP_ALIVE_MAP = ref(new Map([])); export default () => { const setKeepAlive = (key: string, value: number) => { kEEP_ALIVE_MAP.value.set(key, value); }; return { kEEP_ALIVE_MAP, setKeepAlive }; };
<!-- App.vue --> <template> <!-- 利用快取的時間戳key 保證頁面保鮮 --> <router-view v-slot="{ Component }"> <keep-alive :max="5"> <component :is="Component" v-if="$route.meta.keepAlive" :key="$route.meta.keepAlive ? kEEP_ALIVE_MAP.get($route.name) : $route.path" /> </keep-alive> <component :is="Component" v-if="!$route.meta.keepAlive" :key="$route.name" /> </router-view> </template>
a 頁面去到表單頁,不需要快取:
const goAddOrdersPage = () => { // 設定時間戳key 保證每次從這個頁面跳轉,key都是最新的,進入表單頁也就一直重新渲染 setKeepAlive("AddOrder", new Date().getTime()); router.push({ name: "AddOrder" }); };
b 頁面操作完成後,回到表單頁面,需要快取:
// 路由導航守衛 onBeforeRouteLeave((to, from, next) => { // 如果不是去的表單頁面,那麼就重新更新表單頁面的key,否則的話,就直接next,這樣就可以在表單頁面用到的key還是舊的時間戳key,以此達到快取目的 if (to.name !== "AddOrder") { setKeepAlive("AddOrder", new Date().getTime()); } next(); });
在維護該 key 的時候,我使用的是一個全域性變數維護,利用 hooks 的形式,在各個頁面之間進行設定,當然這只是比較簡單的一種處理方法,其實方法有很多,也可以用狀態管理器 vuex 或 pinia。注意:如果用路由 params 進行傳值,vue-router 會給出警告,目前這個方案是官方也不建議的,而且我自己也試過,params 會獲取不到值。
到此這篇關於vue3利用keepAlive快取頁面的文章就介紹到這了,更多相關vue3用keepAlive快取頁面內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45