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

