Vue keepalive学习用法

news2025/3/28 6:50:07

在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.coloradmin.cn/o/2319152.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何理解分布式光纤传感器?

关键词&#xff1a;OFDR、分布式光纤传感、光纤传感器 分布式光纤传感器是近年来备受关注的前沿技术&#xff0c;其核心在于将光纤本身作为传感介质和信号传输介质&#xff0c;通过解析光信号在光纤中的散射效应&#xff0c;实现对温度、应变、振动等物理量的连续、无盲区、高…

PMP-项目运行环境

你好&#xff01;我是 Lydia-穎穎 ♥感谢你的陪伴与支持 ~~~ 欢迎一起探索未知的知识和未来&#xff0c;现在lets go go go!!! 1. 影响项目的要素 项目存在在不同的环境下&#xff0c;环境对于项目的交付产生不同的影响。需了解环境对于项目的影响&#xff0c;采取相应措施应对…

shell 脚本搭建apache

#!/bin/bash # Set Apache version to install ## author: yuan# 检查外网连接 echo "检查外网连接..." ping www.baidu.com -c 3 > /dev/null 2>&1 if [ $? -eq 0 ]; thenecho "外网通讯良好&#xff01;" elseecho "网络连接失败&#x…

Huawei 鲲鹏(ARM/Aarch64)服务器安装KVM虚拟机(非桌面视图)

提出问题 因需要进行ARM架构适配&#xff0c;需要在Huawei Taishan 200k&#xff08;CPU&#xff1a; Kunpeng 920 5231K&#xff09;上&#xff0c;创建几台虚拟机做为开发测试环境。 无奈好久没搞了&#xff0c;看了一下自己多年前写的文章&#xff1a;Huawei 鲲鹏&#xf…

《Python实战进阶》No28: 使用 Paramiko 实现远程服务器管理

No28: 使用 Paramiko 实现远程服务器管理 摘要 在现代开发与运维中&#xff0c;远程服务器管理是必不可少的一环。通过 SSH 协议&#xff0c;我们可以安全地连接到远程服务器并执行各种操作。Python 的 Paramiko 模块是一个强大的工具&#xff0c;能够帮助我们实现自动化任务&…

【Kafka】深入了解Kafka

集群的成员关系 Kafka使用Zookeeper维护集群的成员信息。 每一个broker都有一个唯一的标识&#xff0c;这个标识可以在配置文件中指定&#xff0c;也可以自动生成。当broker在启动时通过创建Zookeeper的临时节点把自己的ID注册到Zookeeper中。broker、控制器和其他一些动态系…

C++特性——RAII、智能指针

RAII 就像new一个需要delete&#xff0c;fopen之后需要fclose&#xff0c;但这样会有隐形问题&#xff08;忘记释放&#xff09;。RAII即用对象把这个过程给包起来&#xff0c;对象构造的时候&#xff0c;new或者fopen&#xff0c;析构的时候delete. 为什么需要智能指针 对于…

CentOS系类普通挂载磁盘挂载命令

检查磁盘是否有分区 lsblk如果 vdb 下面没有分区&#xff08;比如 vdb1&#xff09;&#xff0c;你需要先创建分区。 创建分区&#xff08;如果需要&#xff09; fdisk /dev/vdb然后在 fdisk 交互界面&#xff1a; 输入 n 创建新分区 选择 p 创建主分区 默认分区号和大小 输…

强化学习(赵世钰版)-学习笔记(9.策略梯度法)

本章是课程的导数第二章&#xff0c;旨在讲解策略的函数化形式。 之前的方法&#xff0c;描述一个策略都是用表格的形式&#xff0c;每一行代表一个状态&#xff0c;每一列代表一个行为&#xff0c;表格中的元素对应相关状态下执行相关行为的概率。 函数化的策略表征形式是指&a…

【c++】【STL】unordered_set 底层实现(简略版)

【c】【STL】unordered_set 底层实现&#xff08;简略版&#xff09; ps:这个是我自己看的不保证正确&#xff0c;觉得太长的后面会总结整个调用逻辑 unordered_set 内部实现 template <class _Kty, class _Hasher hash<_Kty>, class _Keyeq equal_to<_Kty>…

网络安全设备配置与管理-实验4-防火墙AAA服务配置

实验4-p118防火墙AAA服务配置 从这个实验开始&#xff0c;每一个实验都是长篇大论&#x1f613; 不过有好兄弟会替我出手 注意&#xff1a;1. gns3.exe必须以管理员身份打开&#xff0c;否则ping不通虚拟机。 win10虚拟机无法做本次实验&#xff0c;必须用学校给的虚拟机。首…

【论文阅读】Contrastive Clustering Learning for Multi-Behavior Recommendation

论文地址&#xff1a;Contrastive Clustering Learning for Multi-Behavior Recommendation | ACM Transactions on Information Systems 摘要 近年来&#xff0c;多行为推荐模型取得了显著成功。然而&#xff0c;许多模型未充分考虑不同行为之间的共性与差异性&#xff0c;以…

基于协同过滤推荐算法的景点票务数据系统(python-计算机毕设)

摘 要 I ABSTRACT II 第 1 章 引言 1 研究背景及意义 1 研究背景 1研究意义 1 国内外研究现状 2 智慧旅游 3旅游大数据 3 研究内容 4本章小结 4 第 2 章 相关技术概述 5 基于内容的推荐算法 5 基于内容的推荐算法原理 5基于内容的推荐算法实现 5 协同过滤推荐算法 6 协同过…

Ubuntu 24 常用命令方法

文章目录 环境说明1、账号管理1.1、启用 root 2、包管理工具 apt & dpkg2.1、apt 简介 & 阿里源配置2.2、dpkg 简介2.3、apt 和 dpkg 两者之间的关系2.4、常用命令 3、启用 ssh 服务4、防火墙5、开启远程登录6、关闭交换分区7、build-essential&#xff08;编译和开发软…

Flask多参数模版使用

需要建立目录templates&#xff1b; 把建好的html文件放到templates目录里面&#xff1b; 约定好参数名字&#xff0c;单个名字可以直接使用&#xff1b;多参数使用字典传递&#xff1b; 样例&#xff1a; from flask import render_template # 模板 (Templates) #Flask 使用…

自然语言处理|深入解析 PEGASUS:从原理到实践

一、引言 在信息爆炸的时代&#xff0c;互联网上的文本数据以极快的速度增长。无论是新闻资讯、学术论文、社交媒体动态&#xff0c;还是各类报告文档&#xff0c;我们每天接触到的文字信息量巨大。如何快速、准确地提取关键内容成为一项重要任务。文本摘要技术通过将长篇文本…

Spring AI Alibaba快速使用

AI 时代&#xff0c;Java 程序员也需要与时俱进&#xff0c;这两个框架必须掌握。 一个是 Spring AI一个是 Spring Alibaba AI。 Spring AI 是一个AI工程领域的应用程序框架&#xff0c;它的目标是将 Spring生态系统的设计原则应用于人工智能领域。 但是&#xff0c; Spring…

socks 协议介绍

SOCKS协议详解 一、基本定义与核心功能 SOCKS&#xff08;Socket Secure&#xff09;是一种网络传输协议&#xff0c;主要用于通过代理服务器转发客户端与目标服务器之间的通信请求。其核心功能包括隐藏用户真实IP地址、穿透防火墙限制以及支持多种网络协议&#xff08;如TCP…

Linux --centos安装显卡驱动

显卡下载页面 https://www.nvidia.com/en-us/drivers/unix/ 随便下载一个即可 安装过程 查看当前设备的显卡信息 lspci | grep -i vga安装gcc相关依赖 yum update -y yum update gcc yum install build-essential yum install gcc-multilibdkms yum groupinstall "Dev…

统信UOS中使用Vscode编程

写在前面&#xff1a;统信UOS其实就是套壳的Linux系统&#xff0c;所以有问题如果搜不到解决方法&#xff0c;可以参考Linux下的解决方法。 1.环境配置 Vscode : 1.85.0 Vscode就直接下载安装就行&#xff0c;然后安装插件&#xff1a;Volar、中文汉化包 node&#xff1a;18…