可控制緩存銷(xiāo)毀的?keepAlive?組件實(shí)現(xiàn)詳解
簡(jiǎn)介
關(guān)于 Vue 的 KeepAlive
<KeepAlive>
是一個(gè)內(nèi)置組件,它的功能是在多個(gè)組件間動(dòng)態(tài)切換時(shí) 緩存 被移除的組件實(shí)例
我們可以利用這一特性來(lái)解決當(dāng)路由切換時(shí)頁(yè)面組件被銷(xiāo)毀的問(wèn)題,常見(jiàn)的業(yè)務(wù)場(chǎng)景有表單緩存,列表緩存定位,返回時(shí)保持狀態(tài)等,網(wǎng)上有很多教程涉及,但是對(duì)如何自主控制緩存的組件銷(xiāo)毀這一塊大多講的不是很清晰。
本文會(huì)以初學(xué)者的角度出發(fā),一步一步帶你了解 keepAlive 的特性并實(shí)現(xiàn)一個(gè)可以自主控制什么時(shí)候銷(xiāo)毀緩存頁(yè)面的 keepAlive 組件 —— app-router-view
思路
在編寫(xiě)這一組件時(shí)我們的思路是先在路由配置中加入緩存標(biāo)識(shí),然后在<router-view>
組件里加上<KeepAlive>
標(biāo)簽,然后通過(guò)緩存標(biāo)識(shí)判斷是否緩存該組件,為了操作緩存的銷(xiāo)毀,我們會(huì)用到 include 屬性,通過(guò)操作 include 里的組件名實(shí)現(xiàn)自主銷(xiāo)毀組件,以下是具體實(shí)現(xiàn)步驟。
在 Routes 中添加 keepAlive 緩存標(biāo)識(shí)
const routes = [ { path: '/index', name: 'index', component: () => import('@/views/index.vue'), meta: { title: '首頁(yè)', keepAlive: false // 緩存標(biāo)識(shí) } } ]
創(chuàng)建 app-router-view 組件
<template> <router-view v-slot="{ Component, route }"> <keep-alive> <component :is="Component" v-if="route.meta.keepAlive"/> </keep-alive> <component :is="Component" v-if="!route.meta.keepAlive"/> </router-view> </template>
這就是大家平時(shí)看教程比較常見(jiàn)的模式了,也能實(shí)現(xiàn)一些簡(jiǎn)單的需求,但還存在問(wèn)題,就是當(dāng)我們不需要緩存時(shí)候無(wú)法手動(dòng)清除緩存,等會(huì)繼續(xù)完善,這里先給大家簡(jiǎn)單介紹下<router-view>
的 v-slot 和標(biāo)簽里的 :is 是做什么的,這兩個(gè)東西工作中并不常用,新同學(xué)可能比較陌生,這里也簡(jiǎn)單科普下。
router-view 中的 v-slot
簡(jiǎn)單說(shuō) v-slot 可以讓我們方便的拿到路由標(biāo)簽包裹的組件和路由對(duì)象
主要用于方便我們使用 <transition>
和 <keep-alive>
組件來(lái)包裹我們自己的組件
標(biāo)簽里的 :is
官網(wǎng)介紹是用于綁定動(dòng)態(tài)組件,簡(jiǎn)單說(shuō)就是可以讓標(biāo)簽轉(zhuǎn)化為我們指定的 vue 組件
實(shí)現(xiàn)手動(dòng)清除頁(yè)面緩存
這里簡(jiǎn)單說(shuō)下思路,<keep-alive>
標(biāo)簽上有 include 屬性,會(huì)接收一個(gè)數(shù)組,數(shù)組里的值是我們要緩存頁(yè)面的組件名,我們可以通過(guò)操作 include 的值來(lái)手動(dòng)銷(xiāo)毀我們的緩存頁(yè)面。
這里需要特別注意這個(gè)組件名,沒(méi)有理解好這一塊實(shí)踐中就會(huì)出現(xiàn)各種奇奇怪怪的問(wèn)題?。?!
組件名指的是 vue 組件定義時(shí)的那個(gè)命名,同時(shí)我們 routes 里定義的 name 需要與之對(duì)應(yīng),否則找不到關(guān)系,以下圖為例,默認(rèn)情況下,我們 vue 的文件名就是我們最終引入的組件名,即 list-one 與 list-two 就是需要我們維護(hù)在 routes 中的名字
了解了這一點(diǎn)后我們來(lái)開(kāi)始代碼實(shí)現(xiàn)
定義組件名的方法
一般情況下我們可以通過(guò)文件名稱來(lái)做組件名,但是很多時(shí)候我們會(huì)遇到文件名稱一樣的問(wèn)題,這時(shí)候就需要我們自定義組件名了,這里推薦兩種方法原生模式和插件模式
- 原生模式
<script> export default { name: 'component-name' // 你的組件名 } </script>
- 插件模式
使用 vite-plugin-vue-setup-extend 插件擴(kuò)展語(yǔ)法糖
// 安裝插件 npm i unplugin-vue-components -D // 在頁(yè)面 script setup 標(biāo)簽中定義 name <script setup name="component-name"> // This starter template is using Vue 3 <script setup> SFCs // ... </script>
配置好路由 name 與組件 name 對(duì)應(yīng)關(guān)系
{ path: '/list-one', name: 'list-one', component: () => import('@/views/list-one.vue'), meta: { title: '列表 1', keepAlive: false } }, { path: '/list-two', name: 'list-two', component: () => import('@/views/list-two.vue'), meta: { title: '列表 2', keepAlive: true } }
在 pinia 或者 vuex 中定義好操作緩存列表的方法
我這里以 pinia 為例,創(chuàng)建 useKeepAliverStore 模塊,通過(guò) add , 與 remove 操作緩存列表
/** * @description: 緩存控制 */ export const useKeepAliverStore = defineStore('keepAliver', { state: () => ({ caches: [] }), getters: {}, actions: { add(name) { if (!this.caches.includes(name)) { this.caches.push(name) } }, remove(name) { this.caches = this.caches.filter((item) => item !== name) }, clear() { this.caches = [] } } })
添加路由守衛(wèi),在頁(yè)面進(jìn)入時(shí)維護(hù)緩存列表
import { useKeepAliverStore } from '@/store/modules/keepAliver' export function setupKeepAliver(router) { router.beforeEach((to, from, next) => { if (to.meta.keepAlive) { console.log('keepAliver') const { add } = useKeepAliverStore() add(to.name) } next() }) }
調(diào)整組件,維護(hù)好 include
<script setup> // This starter template is using Vue 3 <script setup> SFCs import { useKeepAliverStore } from '@/store/modules/keepAliver' const { caches } = storeToRefs(useKeepAliverStore()) </script> <template> <router-view v-slot="{ Component, route }"> <keep-alive :include="caches"> <component :is="Component" v-if="route.meta.keepAlive" :key="route.name" /> </keep-alive> <component :is="Component" v-if="!route.meta.keepAlive" :key="route.name" /> </router-view> </template>
這樣就大功告成啦,當(dāng)我們想要銷(xiāo)毀某個(gè)頁(yè)面,只要調(diào)用下 remove 方法移除 caches 里對(duì)應(yīng)的組件名,就可以銷(xiāo)毀該頁(yè)面的緩存了
demo地址:jyliyue/keep-alive-demo (github.com)
以上就是可控制緩存銷(xiāo)毀的 keepAlive 組件實(shí)現(xiàn)詳解的詳細(xì)內(nèi)容,更多關(guān)于可控制緩存銷(xiāo)毀keepAlive組件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
IDEA創(chuàng)建Vue項(xiàng)目的兩種方式總結(jié)
這篇文章主要介紹了IDEA創(chuàng)建Vue項(xiàng)目的兩種方式總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2023-04-04vuex頁(yè)面刷新數(shù)據(jù)丟失解決方法詳解
這篇文章主要為大家介紹了vuex頁(yè)面刷新數(shù)據(jù)丟失解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07關(guān)于Vue中keep-alive的作用及使用方法
keep-alive是Vue的內(nèi)置組件,當(dāng)它包裹動(dòng)態(tài)組件時(shí),會(huì)緩存不活動(dòng)的組件實(shí)例,該組件將不會(huì)銷(xiāo)毀,這篇文章主要介紹了關(guān)于Vue中keep-alive的作用是什么?怎么使用,需要的朋友可以參考下2023-04-04Vue+Element實(shí)現(xiàn)表格編輯、刪除、以及新增行的最優(yōu)方法
這篇文章主要為大家詳細(xì)介紹了Vue+Element實(shí)現(xiàn)表格的編輯、刪除、以及新增行的最優(yōu)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05淺談關(guān)于.vue文件中style的scoped屬性
本篇文章主要主要介紹了淺談關(guān)于.vue文件中style的scoped屬性,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08基于Vue2.0和Typescript實(shí)現(xiàn)多主題切換的示例
本文主要介紹了基于Vue2.0和Typescript實(shí)現(xiàn)多主題切換的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04vue組件(全局,局部,動(dòng)態(tài)加載組件)
組件是Vue.js最強(qiáng)大的功能之一。組件可以擴(kuò)展HTML元素,封裝可重用的代碼。這篇文章主要介紹了vue組件(全局,局部,動(dòng)態(tài)加載組件),需要的朋友可以參考下2018-09-09vue3使用elementPlus進(jìn)行table合并處理的示例詳解
虛擬數(shù)據(jù)中公司下有多個(gè)客戶,公司一樣的客戶,公司列需要合并,客戶如果一樣也需要合并進(jìn)行展示,所以本文給大家介紹了vue3使用elementPlus進(jìn)行table合并處理的實(shí)例,文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02