Vue核心知識:KeepLive全方位分析

KeepAlive 是 Vue 組件中的一個重要功能,主要用于緩存組件,以提升性能和用戶體驗。

在這里插入圖片描述

目錄

      • 一、`KeepAlive` 基本概念
      • 二、`KeepAlive` 的核心原理
      • 三、`KeepAlive` 關鍵屬性解析
        • 1. `include`:指定需要緩存的組件
        • 2. `exclude`:指定不需要緩存的組件
        • 3. `max`:最大緩存組件數
      • 四、`KeepAlive` 生命周期
      • 五、具體使用場景
      • 六、常見問題及解決方案
        • 1. **`activated` 和 `deactivated` 不觸發**
        • 2. **`keep-alive` 組件緩存過多導致內存占用**
        • 3. **如何手動清除緩存**
        • 4. **如何手動清除 `keep-alive` 緩存**
      • 七、完整示例:結合 Vue Router
      • 八、總結


在這里插入圖片描述

一、KeepAlive 基本概念

KeepAlive 是 Vue 內置的一個抽象組件,通常用于包裹動態組件,使其在切換時保持狀態,而不是被銷毀和重新創建。

主要作用:

  1. 緩存組件,避免重復創建和銷毀,提升性能。
  2. 保持組件狀態,例如表單填寫、用戶滾動位置等不會丟失。
  3. 適用于router-viewcomponent動態組件

基礎使用示例:

<template><keep-alive><component :is="currentView"></component></keep-alive>
</template><script>
import A from "./A.vue";
import B from "./B.vue";export default {data() {return {currentView: "A"};},components: { A, B }
};
</script>

在上述代碼中,<component :is="currentView">會根據currentView的值動態切換組件,但由于keep-alive的存在,被切換出去的組件不會被銷毀,而是被緩存。


二、KeepAlive 的核心原理

  1. 組件掛載與緩存

    • Vue 在創建組件時,會判斷是否被 KeepAlive 包裹,如果是,則不會銷毀,而是將其存儲在 cache 對象中。
    • 當組件被切換回來時,會從 cache 取出,而不會重新創建實例。
  2. 緩存管理

    • KeepAlive 組件通過 includeexclude 規則控制哪些組件需要緩存,哪些不需要。
  3. 生命周期鉤子

    • activated():組件被緩存后激活時觸發。
    • deactivated():組件被緩存但切換出去時觸發。

三、KeepAlive 關鍵屬性解析

1. include:指定需要緩存的組件

可以是字符串、正則表達式或數組:

<keep-alive :include="['A', 'B']"><router-view></router-view>
</keep-alive>

這樣只有 AB 組件會被緩存。

2. exclude:指定不需要緩存的組件
<keep-alive :exclude="/^Temp/"><router-view></router-view>
</keep-alive>

所有以 Temp 開頭的組件都不會被緩存。

3. max:最大緩存組件數
<keep-alive :max="2"><router-view></router-view>
</keep-alive>

最多緩存 2 個組件,超過后會刪除最久未使用的組件。


四、KeepAlive 生命周期

組件被 keep-alive 緩存時,不會觸發 createdmounted,但會觸發以下鉤子:

  1. activated():組件從緩存中激活
  2. deactivated():組件被緩存但未銷毀

示例:

<script>
export default {created() {console.log("組件創建");},mounted() {console.log("組件掛載");},activated() {console.log("組件被激活");},deactivated() {console.log("組件被緩存");}
};
</script>

生命周期觸發順序

  • 首次進入createdmountedactivated
  • 切換離開deactivated
  • 再次進入activated

五、具體使用場景

  1. 配合 router-view,緩存某些路由

    <keep-alive><router-view></router-view>
    </keep-alive>
    
    • 這樣切換路由時,已訪問的組件會被緩存。
  2. 結合 include 指定緩存頁面

    <keep-alive :include="['Home', 'Profile']"><router-view></router-view>
    </keep-alive>
    
    • 只有 HomeProfile 頁面會被緩存。
  3. 結合 exclude 過濾不需要緩存的頁面

    <keep-alive :exclude="['Login']"><router-view></router-view>
    </keep-alive>
    
    • Login 頁面不會被緩存,其他頁面都會緩存。
  4. 動態組件緩存

    <keep-alive><component :is="currentComponent"></component>
    </keep-alive>
    
    • 切換組件時不會銷毀原組件。

六、常見問題及解決方案

1. activateddeactivated 不觸發
  • 確保組件確實被 keep-alive 包裹,并且是動態組件。
2. keep-alive 組件緩存過多導致內存占用
  • 使用 max 限制緩存數:
    <keep-alive :max="3"><router-view></router-view>
    </keep-alive>
    
3. 如何手動清除緩存
this.$destroy(); // 清除當前組件緩存

或者

this.$parent.$forceUpdate(); // 強制更新
4. 如何手動清除 keep-alive 緩存

可以使用 key 強制重新渲染:

<keep-alive><component :is="currentComponent" :key="currentKey"></component>
</keep-alive>

每次切換 currentKey,都會重新渲染組件。


七、完整示例:結合 Vue Router

<template><div><button @click="currentView = 'Home'">Home</button><button @click="currentView = 'About'">About</button><keep-alive><component :is="currentView"></component></keep-alive></div>
</template><script>
import Home from "./Home.vue";
import About from "./About.vue";export default {data() {return {currentView: "Home"};},components: { Home, About }
};
</script>

在這里:

  • HomeAbout 組件可以自由切換,并且會被 keep-alive 緩存。

八、總結

  1. KeepAlive 主要用于緩存動態組件,避免重復創建和銷毀,提高性能。
  2. 關鍵屬性:
    • include 指定緩存組件。
    • exclude 排除不需要緩存的組件。
    • max 限制最大緩存數。
  3. 組件生命周期:
    • activated() 組件被激活
    • deactivated() 組件被緩存
  4. 適用于 router-viewcomponent 組件,適合緩存列表、表單、復雜頁面狀態。

如果在項目中正確使用 KeepAlive,可以大幅提升前端性能,避免頁面狀態丟失,提高用戶體驗。

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

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

相關文章

【電力——tarjan割點,求連通塊】

題目 分析 這是割點的板子 代碼 #include <bits/stdc.h> using namespace std;const int N 1e410; const int M 3e410;int h[N], e[M], ne[M], idx; int dfn[N], low[N], tot; int root, ans;void add(int a, int b) // 添加一條邊a->b {e[idx] b, ne[idx] h…

【HTTP】解碼網絡通信的奧秘:HTTP,IP 地址,端口,DNS及NAT地址轉換的協同之舞

引言 每文學習一句詩&#xff1a;行一棋不足以見智&#xff0c;彈一弦不足以見悲 ——《淮南子說林訓》 譯文&#xff1a;走一個棋子&#xff0c;不足以現出智慧&#xff1b;彈一根琴弦&#xff0c;不能夠使人產生悲哀之情。 自述&#xff1a;互聯網現如今已經成為每個人都離不…

18、深拷貝與淺拷貝的區別【中高頻】

淺拷貝 淺拷貝只是拷貝了一個指針&#xff0c;并沒有開辟一塊新的內存。拷貝的指針和原來的指針 指向同一塊地址。當一個對象修改了資源&#xff0c;另一個對象也會受到影響&#xff0c;因此淺拷貝是有風險的&#xff1a;當兩個對象都銷毀 并調用析構函數時&#xff0c;會造成…

【Linux】從入門到精通:Make與Makefile完全指南

歡迎來到 CILMY23 的博客 &#x1f3c6;本篇主題為&#xff1a;從入門到精通&#xff1a;Make與Makefile完全指南 &#x1f3c6;個人主頁&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列專欄&#xff1a;C | C語言 | Linux | Python | 數據結構和算法 | 算法專題 &#x1…

利用PyQt簡單的實現一個機器人的關節JOG界面

在上一篇文章中如何在Python用Plot畫出一個簡單的機器人模型&#xff0c;我們介紹了如何在Python中畫出一個簡單的機器人3D模型&#xff0c;但是有的時候我們需要通過界面去控制機器人每一個軸的轉動&#xff0c;并實時的顯示出當前機器人的關節位置和末端笛卡爾位姿。 那么要實…

iOS 使用消息轉發機制實現多代理功能

在iOS開發中&#xff0c;我們有時候會用到多代理功能&#xff0c;比如我們列表的埋點事件&#xff0c;需要我們在列表的某個特定的時機進行埋點上報&#xff0c;我們當然可以用最常見的做法&#xff0c;就是設置代理實現代理方法&#xff0c;然后在對應的代理方法里面進行上報&…

XGBoost和LightGBM機器學習算法對比及實戰

文章目錄 1. XGBoost 原理核心思想關鍵技術點2. LightGBM 原理核心思想關鍵技術點3. XGBoost vs LightGBM 對比4. 適用場景選擇5. 總結1. 數據準備2. XGBoost 示例安裝庫代碼實現3. LightGBM 示例安裝庫代碼實現4. 關鍵參數對比5. 注意事項6. 輸出示例XGBoost 和 LightGBM 是兩…

局域網自動識別機器名和MAC并生成文件的命令

更新版本&#xff1a;添加了MAC 地址 確定了設備唯一性 V1.1 局域網自動識別機器名和MAC并生成文件的批處理命令 echo off setlocal enabledelayedexpansionREM 設置輸出文件 set outputFilenetwork_info.txtREM 清空或創建輸出文件 echo Scanning network from 192.168.20.1…

基于Python+Vue開發的體育用品商城管理系統源碼+開發文檔+課程作業

項目簡介 該項目是基于PythonVue開發的體育用品商城管理系統&#xff08;前后端分離&#xff09;&#xff0c;這是一項為大學生課程設計作業而開發的項目。該系統旨在幫助大學生學習并掌握Python編程技能&#xff0c;同時鍛煉他們的項目設計與開發能力。通過學習基于Python的體…

pyQT5簡易教程(一):制作一個可以選擇本地圖片并顯示的桌面應用

可以參考之前的教程安裝 PyQt 和 PyQt Designer https://blog.csdn.net/smx6666668/article/details/145909326?spm=1011.2415.3001.10575&sharefrom=mp_manage_link 一、打開pycharm中的QTdesigner 二、設計界面 和之前一樣,使用 PyQt Designer 來設計界面并保存為 .u…

LeetCode 解題思路 6(Hot 100)

解題思路&#xff1a; 初始化窗口元素&#xff1a; 遍歷前 k 個元素&#xff0c;構建初始單調隊列。若當前索引對應值大于等于隊尾索引對應值&#xff0c;移除隊尾索引&#xff0c;將當前索引加入隊尾。遍歷結束時當前隊頭索引即為當前窗口最大值&#xff0c;將其存入結果數組…

基于redis的位圖實現簽到功能

基于Redis位圖實現簽到功能是一種高效且節省內存的方法。以下是分步實現的詳細方案&#xff1a; 1. 鍵設計策略 采用 sign:<userId>:<YYYYMM> 格式存儲每月簽到數據 # 示例&#xff1a;用戶1001在2023年8月的簽到數據 sign_key "sign:1001:202308"2.…

C++ Qt OpenGL渲染FFmpeg解碼后的視頻

本篇博客介紹使用OpenGL渲染FFmpeg解碼后的視頻,涉及到QOpenGLWidget、QOpenGLFunctions、OpenGL shader以及紋理相關,播放效果如下: 開發環境:Win11 C++ Qt6.8.1、FFmpeg4.0、x64 ??注意:Qt版本不同時,Qt OpenGL API及用法可能差別比較大,FFmpeg版本不同時API調用可能…

deepseek部署:ELK + Filebeat + Zookeeper + Kafka

## 1. 概述 本文檔旨在指導如何在7臺機器上部署ELK&#xff08;Elasticsearch, Logstash, Kibana&#xff09;堆棧、Filebeat、Zookeeper和Kafka。該部署方案適用于日志收集、處理和可視化場景。 ## 2. 環境準備 ### 2.1 機器分配 | 機器編號 | 主機名 | IP地址 | 部署組件 |-…

2.數據結構:1.Tire 字符串統計

1.Tire 字符串統計 #include<algorithm> #include<cstring> #include<iostream>using namespace std;const int N100010; int son[N][26];//至多 N 層&#xff0c;每一層至多 26 個節點&#xff08;字母&#xff09; int cnt[N];//字符串至多 N 個&#xff…

算法(四)——位運算與位圖

文章目錄 位運算、位圖位運算基本位運算異或運算交換兩個數無比較返回最大值缺失的數字唯一出現奇數次的數唯二出現奇數次的數唯一出現次數少于m次的數 位運算進階判斷一個整數是不是2的冪判斷一個整數是不是3的冪大于等于n的最小的2的冪[left, right]內所有數字&的結果反轉…

本地部署deepseek大模型后使用c# winform調用(可離線)

介于最近deepseek的大火&#xff0c;我就在想能不能用winform也玩一玩本地部署&#xff0c;于是經過查閱資料&#xff0c;然后了解到ollama部署deepseek,最后用ollama sharp NUGet包來實現winform調用ollama 部署的deepseek。 本項目使用Vs2022和.net 8.0開發&#xff0c;ollam…

SpringBoot原理-02.自動配置-概述

一.自動配置 所謂自動配置&#xff0c;就是Spring容器啟動后&#xff0c;一些配置類、bean對象就自動存入了IOC容器當中&#xff0c;而不需要我們手動聲明&#xff0c;直接從IOC容器中引入即可。省去了繁瑣的配置操作。 我們可以首先將spring項目啟動起來&#xff0c;里面有一…

P10265 [GESP樣題 七級] 迷宮統計

題目描述 在神秘的幻想?陸中&#xff0c;存在著 n 個古老而神奇的迷宮&#xff0c;迷宮編號從 1 到 n。有的迷宮之間可以直接往返&#xff0c;有的可以?到別的迷宮&#xff0c;但是不能?回來。玩家小楊想挑戰?下不同的迷宮&#xff0c;他決定從 m 號迷宮出發。現在&#x…

Spring框架中的工廠模式

在Spring框架里&#xff0c;工廠模式的運用十分廣泛&#xff0c;它主要幫助我們創建和管理對象&#xff0c;讓對象的創建和使用分離&#xff0c;提高代碼的可維護性和可擴展性。下面為你詳細介紹Spring框架中工廠模式的具體體現和示例&#xff1a; 1. BeanFactory 作為工廠模式…