Vue keepalive學(xué)習(xí)用法及場(chǎng)景分析
在Vue中,<keep-alive>
的include
屬性用于指定需要緩存的組件,其實(shí)現(xiàn)方式如下:
1. 基本用法
• 字符串形式:通過(guò)逗號(hào)分隔組件名稱,匹配到的組件會(huì)被緩存。
<keep-alive include="ComponentA,ComponentB"> <component :is="currentComponent"></component> </keep-alive>
此時(shí)僅緩存名稱為ComponentA
和ComponentB
的組件。
• 正則表達(dá)式:使用v-bind
動(dòng)態(tài)綁定正則表達(dá)式,匹配組件名稱。
<keep-alive :include="/Component[A-Z]/"> <component :is="currentComponent"></component> </keep-alive>
此時(shí)匹配名稱以Component
開(kāi)頭且后續(xù)為大寫字母的組件。
• 數(shù)組形式:通過(guò)數(shù)組動(dòng)態(tài)指定緩存組件。
<keep-alive :include="['ComponentA', 'ComponentB']"> <component :is="currentComponent"></component> </keep-alive>
支持動(dòng)態(tài)計(jì)算屬性返回?cái)?shù)組,例如結(jié)合路由元信息。
2. 動(dòng)態(tài)控制緩存
• 結(jié)合路由元信息:在路由配置中通過(guò)meta
字段標(biāo)記需緩存的組件,再通過(guò)計(jì)算屬性動(dòng)態(tài)生成include
值。
// 路由配置 const routes = [ { path: '/pageA', component: PageA, meta: { keepAlive: true } }, { path: '/pageB', component: PageB, meta: { keepAlive: false } } ]; // 動(dòng)態(tài)include <keep-alive :include="cachedComponents"> <router-view></router-view> </keep-alive> computed: { cachedComponents() { return this.$route.matched .filter(route => route.meta.keepAlive) .map(route => route.name); } }
此方式通過(guò)路由元信息靈活控制緩存。
3. 注意事項(xiàng)
• 組件需設(shè)置name
屬性:include
通過(guò)組件名稱匹配,因此被緩存組件必須顯式定義name
屬性。
• 優(yōu)先級(jí):若同時(shí)存在include
和exclude
,exclude
的優(yōu)先級(jí)更高。例如:
<keep-alive include="A,B" exclude="B"> <component :is="currentComponent"></component> </keep-alive>
此時(shí)僅緩存組件A
,因B
被排除。
4. 生命周期鉤子
被緩存的組件會(huì)觸發(fā)activated
(激活時(shí))和deactivated
(停用時(shí))鉤子,而非created
或mounted
,需在對(duì)應(yīng)鉤子中處理狀態(tài)更新。
1. <keep-alive>
的生命周期流程
當(dāng)組件被包裹在 <keep-alive>
內(nèi)時(shí),其生命周期會(huì)分為以下階段:
階段 | 觸發(fā)條件 | 回調(diào)鉤子 | 行為說(shuō)明 |
---|---|---|---|
初次進(jìn)入 | 組件首次被渲染 | created , mounted | 正常初始化,執(zhí)行邏輯 |
切換至其他組件 | 組件被切換到非活動(dòng)狀態(tài) | deactivated | 停用回調(diào),保存狀態(tài)或清理資源 |
再次被激活 | 組件重新進(jìn)入活動(dòng)狀態(tài) | activated | 激活回調(diào),恢復(fù)狀態(tài)或刷新數(shù)據(jù) |
組件銷毀 | 緩存達(dá)到 max 限制或手動(dòng)銷毀 | destroyed | 銷毀組件實(shí)例,釋放內(nèi)存 |
2. 關(guān)鍵生命周期鉤子詳解
(1) activated
鉤子
• 觸發(fā)時(shí)機(jī):組件從緩存中被重新激活時(shí)(例如用戶返回到該頁(yè)面)。
• 典型用途:
• 加載最新數(shù)據(jù)(例如從服務(wù)端獲取)。
• 恢復(fù)動(dòng)態(tài)修改的 DOM 狀態(tài)(如滾動(dòng)位置、定時(shí)器)。
• 更新組件內(nèi)部狀態(tài)(如重置表單或重新計(jì)算數(shù)據(jù))。
• 示例:
export default { activated() { console.log('組件被激活'); this.fetchData(); // 刷新數(shù)據(jù) this.initTimer(); // 重啟定時(shí)器 }, };
(2) deactivated
鉤子
• 觸發(fā)時(shí)機(jī):組件被切換到緩存中(例如用戶跳轉(zhuǎn)到其他頁(yè)面)。
• 典型用途:
• 取消定時(shí)器或異步操作,避免內(nèi)存泄漏。
• 保存當(dāng)前狀態(tài)到本地存儲(chǔ)或 Vuex。
• 暫停動(dòng)畫或視頻播放。
• 示例:
export default { deactivated() { console.log('組件被停用'); clearInterval(this.timer); // 清除定時(shí)器 this.saveScrollPosition(); // 保存滾動(dòng)位置 }, };
(3) destroyed
鉤子
• 觸發(fā)時(shí)機(jī):當(dāng)組件被徹底銷毀時(shí)(例如緩存滿后被移除,或調(diào)用 $destroy()
)。
• 典型用途:
• 釋放強(qiáng)引用資源(如 WebSocket 連接)。
• 清理全局事件監(jiān)聽(tīng)器。
• 注意:僅在組件被銷毀時(shí)觸發(fā),緩存中的組件不會(huì)觸發(fā)此鉤子。
3. 生命周期對(duì)比(普通組件 vs <keep-alive>
組件)
鉤子 | 普通組件 | <keep-alive> 組件 |
---|---|---|
created | ? | ?(僅第一次初始化時(shí)觸發(fā)) |
mounted | ? | ?(僅第一次初始化時(shí)觸發(fā)) |
updated | ? | ? |
deactivated | ? | ?(停用時(shí)觸發(fā)) |
activated | ? | ?(激活時(shí)觸發(fā)) |
destroyed | ?(組件銷毀時(shí)觸發(fā)) | ?(緩存超限或手動(dòng)銷毀時(shí)觸發(fā)) |
4. 實(shí)際應(yīng)用場(chǎng)景
場(chǎng)景 1:頁(yè)面切換時(shí)保留滾動(dòng)位置
export default { data() { return { scrollY: 0 }; }, activated() { // 恢復(fù)滾動(dòng)位置 window.scrollTo(0, this.scrollY); }, deactivated() { // 保存滾動(dòng)位置 this.scrollY = window.scrollY; }, };
場(chǎng)景 2:列表頁(yè)滾動(dòng)加載數(shù)據(jù)
export default { data() { return { page: 1, loading: false }; }, activated() { if (!this.loading) { this.fetchMoreData(); // 刷新數(shù)據(jù) } }, };
5. 注意事項(xiàng)
狀態(tài)管理:
• 緩存組件不會(huì)銷毀實(shí)例,因此需謹(jǐn)慎處理狀態(tài)(如避免重復(fù)請(qǐng)求數(shù)據(jù))。
• 推薦結(jié)合 Vuex 或本地存儲(chǔ)管理全局狀態(tài)。
性能優(yōu)化:
• 使用 max
屬性限制緩存數(shù)量,避免內(nèi)存占用過(guò)高。
• 在 deactivated
中清理不必要的資源(如定時(shí)器、事件監(jiān)聽(tīng))。
組件名匹配:
• 確保被緩存的組件顯式聲明了 name
屬性(include/exclude
依賴組件名匹配)。
總結(jié)
<keep-alive>
的生命周期機(jī)制通過(guò) activated
和 deactivated
鉤子,實(shí)現(xiàn)了組件狀態(tài)的暫停與恢復(fù)。
到此這篇關(guān)于Vue keepalive學(xué)習(xí)用法的文章就介紹到這了,更多相關(guān)Vue keepalive用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- vue3中使用keepAlive緩存路由組件不生效的問(wèn)題解決
- Vue3之組件狀態(tài)保持KeepAlive的簡(jiǎn)單使用
- vue3項(xiàng)目keepAlive使用方法詳解
- Vue中KeepAlive內(nèi)置緩存使用詳解
- 詳解如何優(yōu)雅運(yùn)用Vue中的KeepAlive組件
- Vue keepAlive頁(yè)面強(qiáng)制刷新方式
- vue如何使用router.meta.keepAlive對(duì)頁(yè)面進(jìn)行緩存
- Vue?keepAlive實(shí)現(xiàn)不同的路由共用一個(gè)組件component的緩存問(wèn)題(推薦)
- vue3中使用router4 keepalive的問(wèn)題
相關(guān)文章
Vue3中createWebHistory和createWebHashHistory的區(qū)別詳析
這篇文章主要給大家介紹了關(guān)于Vue3中createWebHistory和createWebHashHistory區(qū)別的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-06-06解決vue net :ERR_CONNECTION_REFUSED報(bào)錯(cuò)問(wèn)題
這篇文章主要介紹了解決vue net :ERR_CONNECTION_REFUSED報(bào)錯(cuò)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08vue中數(shù)據(jù)不響應(yīng)的問(wèn)題及解決
這篇文章主要介紹了vue中數(shù)據(jù)不響應(yīng)的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09vue項(xiàng)目純前端實(shí)現(xiàn)的模板打印功能示例代碼
在Vue項(xiàng)目中,通過(guò)使用vue-print-nb插件,可以實(shí)現(xiàn)頁(yè)面的打印功能,這篇文章主要介紹了vue項(xiàng)目純前端實(shí)現(xiàn)的模板打印功能的相關(guān)資料,需要的朋友可以參考下2024-10-10vue中el-table樹(shù)狀表格末行合計(jì)實(shí)現(xiàn)
本文主要介紹了vue中el-table樹(shù)狀表格末行合計(jì)實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11vue 監(jiān)聽(tīng)屏幕高度的實(shí)例
今天小編就為大家分享一篇vue 監(jiān)聽(tīng)屏幕高度的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09關(guān)于Vue的URL轉(zhuǎn)跳與參數(shù)傳遞方式
這篇文章主要介紹了關(guān)于Vue的URL轉(zhuǎn)跳與參數(shù)傳遞方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03Vue設(shè)置別名聯(lián)想路徑即@/生效的方法
這篇文章主要給大家介紹了Vue設(shè)置別名聯(lián)想路徑即@/生效的方法,文中有詳細(xì)的代碼示例和圖文講解,具有一定的參考價(jià)值,需要的朋友可以參考下2023-11-11Vue實(shí)現(xiàn)星級(jí)評(píng)價(jià)效果實(shí)例詳解
這篇文章主要介紹了Vue實(shí)現(xiàn)星級(jí)評(píng)價(jià)效果的實(shí)例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12Vue中Vue-Baidu-Map基本使用方法實(shí)例
最近有一個(gè)項(xiàng)目需要用到地圖來(lái)展示位置并進(jìn)行數(shù)據(jù)交互,用vue-baidu-map實(shí)現(xiàn)出來(lái),下面這篇文章主要給大家介紹了關(guān)于Vue中Vue-Baidu-Map基本使用的相關(guān)資料,需要的朋友可以參考下2023-03-03