Vue keepalive學習用法

在Vue中,<keep-alive>include屬性用于指定需要緩存的組件,其實現方式如下:

1. 基本用法

? 字符串形式:通過逗號分隔組件名稱,匹配到的組件會被緩存。

<keep-alive include="ComponentA,ComponentB"><component :is="currentComponent"></component>
</keep-alive>

此時僅緩存名稱為ComponentAComponentB的組件。

? 正則表達式:使用v-bind動態綁定正則表達式,匹配組件名稱。

<keep-alive :include="/Component[A-Z]/"><component :is="currentComponent"></component>
</keep-alive>

此時匹配名稱以Component開頭且后續為大寫字母的組件。

? 數組形式:通過數組動態指定緩存組件。

<keep-alive :include="['ComponentA', 'ComponentB']"><component :is="currentComponent"></component>
</keep-alive>

支持動態計算屬性返回數組,例如結合路由元信息。


2. 動態控制緩存

? 結合路由元信息:在路由配置中通過meta字段標記需緩存的組件,再通過計算屬性動態生成include值。

// 路由配置
const routes = [{ path: '/pageA', component: PageA, meta: { keepAlive: true } },{ path: '/pageB', component: PageB, meta: { keepAlive: false } }
];// 動態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. 注意事項

? 組件需設置name屬性include通過組件名稱匹配,因此被緩存組件必須顯式定義name屬性。
? 優先級:若同時存在includeexcludeexclude的優先級更高。例如:

<keep-alive include="A,B" exclude="B"><component :is="currentComponent"></component>
</keep-alive>

此時僅緩存組件A,因B被排除。


4. 生命周期鉤子

被緩存的組件會觸發activated(激活時)和deactivated(停用時)鉤子,而非createdmounted,需在對應鉤子中處理狀態更新。


1. <keep-alive> 的生命周期流程

當組件被包裹在 <keep-alive> 內時,其生命周期會分為以下階段:

階段觸發條件回調鉤子行為說明
初次進入組件首次被渲染created, mounted正常初始化,執行邏輯
切換至其他組件組件被切換到非活動狀態deactivated停用回調,保存狀態或清理資源
再次被激活組件重新進入活動狀態activated激活回調,恢復狀態或刷新數據
組件銷毀緩存達到 max 限制或手動銷毀destroyed銷毀組件實例,釋放內存

2. 關鍵生命周期鉤子詳解

(1) activated 鉤子

? 觸發時機:組件從緩存中被重新激活時(例如用戶返回到該頁面)。
? 典型用途
? 加載最新數據(例如從服務端獲取)。
? 恢復動態修改的 DOM 狀態(如滾動位置、定時器)。
? 更新組件內部狀態(如重置表單或重新計算數據)。
? 示例

export default {activated() {console.log('組件被激活');this.fetchData(); // 刷新數據this.initTimer(); // 重啟定時器},
};
(2) deactivated 鉤子

? 觸發時機:組件被切換到緩存中(例如用戶跳轉到其他頁面)。
? 典型用途
? 取消定時器或異步操作,避免內存泄漏。
? 保存當前狀態到本地存儲或 Vuex。
? 暫停動畫或視頻播放。
? 示例

export default {deactivated() {console.log('組件被停用');clearInterval(this.timer); // 清除定時器this.saveScrollPosition(); // 保存滾動位置},
};
(3) destroyed 鉤子

? 觸發時機:當組件被徹底銷毀時(例如緩存滿后被移除,或調用 $destroy())。
? 典型用途
? 釋放強引用資源(如 WebSocket 連接)。
? 清理全局事件監聽器。
? 注意:僅在組件被銷毀時觸發,緩存中的組件不會觸發此鉤子


3. 生命周期對比(普通組件 vs <keep-alive> 組件)

鉤子普通組件<keep-alive> 組件
created??(僅第一次初始化時觸發)
mounted??(僅第一次初始化時觸發)
updated??
deactivated??(停用時觸發)
activated??(激活時觸發)
destroyed?(組件銷毀時觸發)?(緩存超限或手動銷毀時觸發)

4. 實際應用場景

場景 1:頁面切換時保留滾動位置
export default {data() {return { scrollY: 0 };},activated() {// 恢復滾動位置window.scrollTo(0, this.scrollY);},deactivated() {// 保存滾動位置this.scrollY = window.scrollY;},
};
場景 2:列表頁滾動加載數據
export default {data() {return { page: 1, loading: false };},activated() {if (!this.loading) {this.fetchMoreData(); // 刷新數據}},
};

5. 注意事項

  1. 狀態管理
    ? 緩存組件不會銷毀實例,因此需謹慎處理狀態(如避免重復請求數據)。
    ? 推薦結合 Vuex 或本地存儲管理全局狀態。

  2. 性能優化
    ? 使用 max 屬性限制緩存數量,避免內存占用過高。
    ? 在 deactivated 中清理不必要的資源(如定時器、事件監聽)。

  3. 組件名匹配
    ? 確保被緩存的組件顯式聲明了 name 屬性(include/exclude 依賴組件名匹配)。


總結

<keep-alive> 的生命周期機制通過 activateddeactivated 鉤子,實現了組件狀態的暫停與恢復

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/72958.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/72958.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/72958.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

搭建個人博客教程(Hexo)

如何快速搭建一套本地的博客系統呢&#xff1f;這里有一套gitNode.jsHexo的部署方案來進行解決。 安裝git Git 是一款免費開源的分布式版本控制系統&#xff0c;由 Linus Torvalds 于 2005 年為 Linux 內核開發設計。它通過本地倉庫和遠程倉庫實現代碼管理&#xff0c;支持分支…

手撕算法之`vector` 擴容、`string` 分割、鏈表翻轉

手寫常見操作:vector 擴容、string 分割、鏈表翻轉 (一)vector擴容 在 C++ 中,vector 的擴容機制是動態數組實現的核心特性,直接關系到性能和內存使用效率。以下是深入剖析: 1. 擴容觸發條件 vector<int> v; v.push_back(1); // 當 size() == capacity() 時觸發…

鴻蒙NEXT開發問題大全(不斷更新中.....)

目錄 問題1&#xff1a;鴻蒙NEXT獲取華為手機的udid ?問題2&#xff1a;[Fail]ExecuteCommand need connect-key? 問題3&#xff1a;測試時如何安裝app包 問題1&#xff1a;鴻蒙NEXT開發獲取華為手機的udid hdc -t "設備的序列號" shell bm get --udid 問題2&…

LiteratureReading:[2016] Enriching Word Vectors with Subword Information

文章目錄 一、文獻簡明&#xff08;zero&#xff09;二、快速預覽&#xff08;first&#xff09;1、標題分析2、作者介紹3、引用數4、摘要分析&#xff08;1&#xff09;翻譯&#xff08;2&#xff09;分析 5、總結分析&#xff08;1&#xff09;翻譯&#xff08;2&#xff09;…

ZMC600E,多核異構如何成就機器人精準控制?

ZMC600E主站控制器憑借其多核異構處理器的強大性能&#xff0c;實現了高算力與高實時性的完美平衡&#xff0c;讓機器人動作流暢、精準無誤。接下來&#xff0c;讓我們深入了解其內核結構的奧秘。 在ZMC600E主站控制器控制機器人的時候&#xff0c;可以精準的控制機器人執行各種…

一文掌握 PostgreSQL 的各種指令(PostgreSQL指令備忘)

引言 PostgreSQL 作為一款功能強大、開源的關系型數據庫管理系統&#xff08;RDBMS&#xff09;&#xff0c;以其高擴展性、SQL 標準兼容性以及豐富的功能特性&#xff0c;成為企業級應用的首選數據庫之一。無論是開發、運維還是數據分析&#xff0c;掌握 PostgreSQL 的核心指…

fastadmin后臺管理員日志指定方法不記錄

做的訂單提醒,只要在線會把日志自動存儲進去,這個又是每30s執行一次,數據庫沒多久就爆掉了,最終找到一個處理方法,可能不是最好的,僅供大家參考 具體位置: application/admin/model/AdminLog.php里面的$ignoreRegex方法 protected static $ignoreRegex [/^(.*)\/(selectpage…

Redis Sentinel(哨兵模式)高可用性解決方案

一、概述 Redis Sentinel&#xff08;哨兵模式&#xff09;是Redis的高可用性&#xff08;High Availability, HA&#xff09;解決方案&#xff0c;它通過哨兵系統和Redis實例的協同工作&#xff0c;確保了Redis服務的高可用性和數據的持久性。哨兵系統由一個或多個哨兵進程組…

密碼學(Public-Key Cryptography and Discrete Logarithms)

Public-Key Cryptography and Discrete Logarithms Discrete Logarithm 核心概念&#xff1a;離散對數是密碼學中一個重要的數學問題&#xff0c;特別是在有限域和循環群中。它基于指數運算在某些群中是單向函數這一特性。也就是說&#xff0c;給定一個群 G G G和一個生成元 …

tcp 通信在wifi 下會出現內容錯誤嗎?

TCP通信在WiFi下可能會出現內容錯誤。TCP&#xff08;Transmission Control Protocol&#xff0c;傳輸控制協議&#xff09;是一種面向連接的、可靠的、基于字節流的傳輸層通信協議。在WiFi環境下&#xff0c;由于信號干擾、信號衰減、多徑傳播等因素&#xff0c;可能會造成數據…

JVM OOM問題如何排查和解決

在 Java 開發中&#xff0c;JVM OOM&#xff08;OutOfMemoryError&#xff09;問題通常是指程序運行時&#xff0c;JVM 無法為對象分配足夠的內存空間&#xff0c;導致發生內存溢出的錯誤。這個問題往往和內存的配置、內存泄漏、或者資源過度使用等因素有關。 1. OOM 錯誤類型…

深入解析音頻編解碼器(Audio CODEC):硬件、接口與驅動開發

音頻編解碼器&#xff08;Audio CODEC&#xff09;是音頻處理系統中的核心組件&#xff0c;負責 模擬信號與數字信號的相互轉換&#xff0c;廣泛應用于 智能音箱、嵌入式系統、消費電子產品 等設備。本篇文章將從 硬件結構、接口解析、驅動開發 和 軟件配置 等方面&#xff0c;…

【QGIS_Python】在QGIS的Python控制臺生成SHP格式點數據并顯示標注

參考文章&#xff1a; 「GIS教程」使用DeepSeek輔助QGIS快速制圖 | 麻辣GIS 示例代碼說明&#xff1a;使用參考文章中的省會城市坐標點&#xff0c;左側增加一列城市序號code, 圖層標注顯示 code 城市名稱&#xff0c;同時在指定路徑下生成對應SHP格式點數據。 import os fr…

deepSpeed多機多卡訓練服務器之間,和服務器內兩個GPU是怎么通信

DeepSpeed 在多機多卡訓練時,主要依賴 NCCL 和 PyTorch Distributed 進行通信。具體來說,分為服務器之間和服務器內兩種情況: 1. 服務器之間的通信(跨節點通信) DeepSpeed 采用 NCCL(NVIDIA Collective Communications Library)作為主要的通信后端,結合 PyTorch Distr…

k8s-coredns-CrashLoopBackOff 工作不正常

本文作者&#xff1a; slience_me 問題描述 # 問題描述 # rootk8s-node1:/home/slienceme# kubectl get pods --all-namespaces # NAMESPACE NAME READY STATUS RESTARTS AGE # kube-flannel kube-flannel-ds-66bcs …

新能源電站系統建設提速!麒麟信安操作系統驅動光伏風電雙領域安全升級

在全球能源結構加速向清潔能源轉型的背景下&#xff0c;新能源電站建設正如火如荼地展開&#xff0c;麒麟信安操作系統為光伏與風電領域提供了穩定可靠的底座支持&#xff0c;目前已在中電乾陽光伏、遼寧鐵嶺風電場、清河光伏、鑫田茨溝風電場、連山風電場等新能源場站落地應用…

Oracle 19c 子分區表索引測試

一、建表語句放在最后&#xff0c;方便查看 二、創建各類索引 --創建本地的主鍵約束&#xff0c;但必須加上分區鍵、子分區鍵MT_O_CODE,M_YMD alter table MS_DMG.A_RED drop constraint MGR_PK_AREAD ; alter table MS_DMG.A_RED add constraint MGR_PK_AREAD primary key …

Linux Vim 寄存器 | 從基礎分類到高級應用

注&#xff1a;本文為 “vim 寄存器” 相關文章合輯。 英文引文&#xff0c;機翻未校。 中文引文&#xff0c;略作重排。 未整理去重&#xff0c;如有內容異常&#xff0c;請看原文。 Registers 寄存器 Learning Vim registers is like learning algebra for the first ti…

【Java/數據結構】隊列(Quque)

本博客將介紹隊列的相關知識&#xff0c;包括基于數組的普通隊列&#xff0c;基于鏈表的普通隊列&#xff0c;基于數組的雙端隊列&#xff0c;基于鏈表的雙端隊列&#xff0c;但不包括優先級隊列&#xff08;PriorityQueue&#xff09;&#xff0c;此數據結構將單獨發一篇博客&…

[數據結構]排序之 歸并排序(有詳細的遞歸圖解)

一、非遞歸 基本思想&#xff1a; 歸并排序&#xff08; MERGE-SORT &#xff09;是建立在歸并操作上的一種有效的排序算法 , 該算法是采用分治法&#xff08; Divide andConquer&#xff09;的一個非常典型的應用。將已有序的子序列合并&#xff0c;得到完全有序的序列&#x…