当前位置: 首页 > news >正文

vue中的keep-alive是什么,有哪些使用场景,使用了什么原理,缓存后如何更新数据

<keep-alive> 是 Vue.js 提供的一个内置组件,用于缓存动态组件,避免频繁的销毁和重建。这在某些场景下可以显著提升性能,特别是在组件频繁切换的情况下。以下是对 keep-alive 的详细讲解,包括它的定义、使用场景、原理分析、如何使用以及缓存后如何更新数据。

什么是 keep-alive

<keep-alive> 是一个抽象组件,它不会渲染为一个 DOM 元素,也不会出现在父组件链中。它的主要作用是缓存动态组件的实例,而不是每次切换时销毁和重新创建它们。这对于提升性能和用户体验非常有用。

使用场景

<keep-alive> 适用于以下几种场景:

  • 路由组件缓存:在单页应用中,用户在不同路由之间切换时,可以使用 keep-alive 缓存路由组件,避免每次切换时重新加载和初始化组件。
  • 标签页切换:在一个页面中有多标签页时,可以使用 keep-alive 缓存每个标签页的内容,避免用户在切换标签页时重新加载数据。
  • 列表项缓存:在列表组件中,当用户滚动时,可以使用 keep-alive 缓存已经加载过的列表项,避免重复请求数据。

原理分析

<keep-alive> 的工作原理主要包括以下几个方面:

  • 缓存机制<keep-alive> 会维护一个缓存对象,存储被包裹的组件实例。当组件被激活时,从缓存中取出组件实例并复用;当组件被停用时,将组件实例存储到缓存中。
  • 生命周期钩子<keep-alive> 会注入两个额外的生命周期钩子:activateddeactivatedactivated 在组件被激活时调用,deactivated 在组件被停用时调用。
  • 条件缓存:通过 includeexclude 属性,可以指定哪些组件需要被缓存,哪些组件不需要被缓存。

如何使用

在 Vue.js 中使用 <keep-alive> 非常简单。<keep-alive> 是一个内置组件,用于缓存动态组件,避免频繁的销毁和重建。

1. 基本用法
1.1 单个组件缓存

假设你有一个组件 MyComponent,你希望在切换时缓存它,可以这样做:

<template><div><button @click="showComponent = !showComponent">Toggle Component</button><keep-alive><MyComponent v-if="showComponent" /></keep-alive></div>
</template><script setup>
import { ref } from 'vue'
import MyComponent from './MyComponent.vue'const showComponent = ref(true)
</script>

在这个例子中,MyComponent 会在 showComponenttrue 时显示,并且会被 keep-alive 缓存。当 showComponent 切换为 false 时,MyComponent 不会被销毁,而是被缓存起来。再次切换回 true 时,MyComponent 会从缓存中恢复,而不是重新创建。

1.2 动态组件缓存

你也可以使用 <keep-alive> 来缓存动态组件。假设你有多个组件 ComponentAComponentB,你希望在切换时缓存它们:

<template><div><button @click="currentComponent = 'ComponentA'">Show Component A</button><button @click="currentComponent = 'ComponentB'">Show Component B</button><keep-alive><component :is="currentComponent"></component></keep-alive></div>
</template><script setup>
import { ref } from 'vue'
import ComponentA from './ComponentA.vue'
import ComponentB from './ComponentB.vue'const currentComponent = ref('ComponentA')
</script>

在这个例子中,<component :is="currentComponent"> 会根据 currentComponent 的值动态切换组件,并且这些组件会被 keep-alive 缓存。

2. 控制缓存
2.1 includeexclude

你可以使用 includeexclude 属性来控制哪些组件需要被缓存,哪些组件不需要被缓存。这些属性可以接受字符串、正则表达式或数组。

<template><div><button @click="currentComponent = 'ComponentA'">Show Component A</button><button @click="currentComponent = 'ComponentB'">Show Component B</button><button @click="currentComponent = 'ComponentC'">Show Component C</button><keep-alive :include="['ComponentA', 'ComponentB']"><component :is="currentComponent"></component></keep-alive></div>
</template><script setup>
import { ref } from 'vue'
import ComponentA from './ComponentA.vue'
import ComponentB from './ComponentB.vue'
import ComponentC from './ComponentC.vue'const currentComponent = ref('ComponentA')
</script>

在这个例子中,只有 ComponentAComponentB 会被缓存,ComponentC 不会被缓存。

3. 生命周期钩子

<keep-alive> 会注入两个额外的生命周期钩子:activateddeactivated。这些钩子分别在组件被激活和停用时调用。

<template><div><h1>{{ title }}</h1><p>{{ content }}</p></div>
</template><script setup>
import { ref, onActivated, onDeactivated } from 'vue'
import { fetchData } from './api'const title = ref('')
const content = ref('')onActivated(async () => {console.log('Component activated')// 检查数据是否需要更新if (shouldUpdateData()) {const data = await fetchData()title.value = data.titlecontent.value = data.content}
})onDeactivated(() => {console.log('Component deactivated')
})function shouldUpdateData() {// 根据实际情况判断是否需要更新数据return Math.random() > 0.5 // 示例:随机决定是否更新
}
</script>
4. 缓存后如何更新数据
4.1 使用 activated 钩子

activated 钩子中,可以检查数据是否需要更新,并重新获取数据。

<template><div><h1>{{ title }}</h1><p>{{ content }}</p></div>
</template><script setup>
import { ref, onActivated } from 'vue'
import { fetchData } from './api'const title = ref('')
const content = ref('')onActivated(async () => {// 检查数据是否需要更新if (shouldUpdateData()) {const data = await fetchData()title.value = data.titlecontent.value = data.content}
})function shouldUpdateData() {// 根据实际情况判断是否需要更新数据return Math.random() > 0.5 // 示例:随机决定是否更新
}
</script>
4.2 使用 watch 监听路由参数

如果组件是通过路由参数传递数据的,可以使用 watch 监听路由参数的变化,并在参数变化时更新数据。

<template><div><h1>{{ title }}</h1><p>{{ content }}</p></div>
</template><script setup>
import { ref, watch } from 'vue'
import { useRoute } from 'vue-router'
import { fetchData } from './api'const route = useRoute()
const title = ref('')
const content = ref('')watch(() => route.params.id,async (newId) => {if (newId) {const data = await fetchData(newId)title.value = data.titlecontent.value = data.content}},{ immediate: true } // 立即执行一次
)
</script>
4.3 使用 key 属性

通过在 keep-alive 包裹的组件上添加 key 属性,可以强制组件重新渲染。当 key 发生变化时,keep-alive 会认为这是一个新的组件实例,从而重新创建和缓存。

<template><div><button @click="switchComponent">Switch Component</button><keep-alive><component :is="currentComponent" :key="currentKey"></component></keep-alive></div>
</template><script setup>
import { ref } from 'vue'
import ComponentA from './ComponentA.vue'
import ComponentB from './ComponentB.vue'const currentComponent = ref(ComponentA)
const currentKey = ref(1)const switchComponent = () => {currentComponent.value = currentComponent.value === ComponentA ? ComponentB : ComponentAcurrentKey.value += 1 // 改变 key,强制重新渲染
}
</script>

总结

<keep-alive> 是 Vue.js 中一个非常有用的组件,用于缓存动态组件,提升性能和用户体验。通过理解其基本用法、控制缓存、生命周期钩子以及如何在缓存后更新数据,可以更好地利用 <keep-alive> 来优化应用。

相关文章:

vue中的keep-alive是什么,有哪些使用场景,使用了什么原理,缓存后如何更新数据

<keep-alive> 是 Vue.js 提供的一个内置组件&#xff0c;用于缓存动态组件&#xff0c;避免频繁的销毁和重建。这在某些场景下可以显著提升性能&#xff0c;特别是在组件频繁切换的情况下。以下是对 keep-alive 的详细讲解&#xff0c;包括它的定义、使用场景、原理分析、…...

LeetCode105.从前序与中序遍历构造二叉树

题目要求 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 提示: 1 < preorder.length < 3000inorder.length preorder.length-3000 < pr…...

LeetCode654.最大二叉树

LeetCode刷题记录 文章目录 &#x1f4dc;题目描述&#x1f4a1;解题思路⌨C代码 &#x1f4dc;题目描述 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。 递归地在最大值 左边 的 子…...

C# 字段和属性

在 C# 中&#xff0c;字段和属性是定义类和结构体数据的两种方式。 字段用于直接存储数据&#xff0c;而属性提供了对字段的封装和访问控制。 1. 字段&#xff08;Fields&#xff09; 定义 字段是类或结构体中用于存储数据的变量。字段可以是任何数据类型&#xff0c;包括基…...

【leetcode】N皇后 回溯法c++

目录 51.N皇后 52.N皇后II 51.N皇后 51. N 皇后 - 力扣&#xff08;LeetCode&#xff09; 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间…...

Ubuntu 系统端口查询与管理详细分析

目录 前言1. 查询端口占用情况2. 释放占用的端口3. 修改应用程序的端口 前言 Window的端口被占用&#xff0c;类似的知识点&#xff1a;重装mysql时3306端口被占用解决方法 事情起因是宝塔的CPU负载过大&#xff0c;重启服务进程之后还是爆&#xff0c;后续发现是端口被占用&…...

Unity中使用StartCoroutine协程和Lerp方法,使GameObject缓慢移动

移动方法&#xff08;传入需要移动的instance和目标位置&#xff09; public Transform targetPosition; //目标位置 Vector3 target targetPosition.position;private IEnumerator MoveTowardsTarget(GameObject instance, Vector3 target){// 缓慢移动到目标的方法Vector3 …...

C++根据特定字符截取字符串

前言 在 C 中&#xff0c;如果根据特定字符进行字符串的截取&#xff0c;可以使用 std::string 类的成员函数 find() 来查找字符的位置&#xff0c;然后使用 substr() 来截取字符串。以下是一个示例&#xff0c;展示了如何根据指定字符截取字符串。 示例 #include <iostr…...

【How AI Works】读书笔记3 出发吧! AI纵览 第二部分

目录 1.说明 2.第二部分(P9~P10) 机器学习算法总结(监督学习) 3.单词 4.专业术语 1.说明 书全名:How AI Works From Sorcery to Science 作者 Ronald T.Kneusel 2.第二部分(P9~P10) 总结机器学习算法 作者把机器学习的过程比喻成输入-->黑盒-->输出 这里的标签可…...

No Module named pytorchvideo.losses问题解决

问题描述 最近在跑X3D的源码时发现&#xff0c;在conda powershell prompt中安装了pytorchvideo&#xff0c;但是仍然报错&#xff1a;No Module named pytorchvideo.losses 解决方案&#xff1a; 直接去https://gitcode.com/gh_mirrors/py/pytorchvideo/overview?utm_sour…...

Mac终端字体高亮、提示插件

一、安装配置“oh my zsh” 1.1 安装brew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 按照步骤安装即可&#xff0c;安装完成查看版本 brew -v 1.2 安装zsh brew install zsh 安装完成后查看版本 zsh --version 1.3 …...

Flowable 构建后端服务(后端以及数据库搭建) Flowable Modeler 设计器搭建(前端)

案例地址&#xff1a;xupengboo-flowable-example Flowable 构建后端服务&#xff08;后端以及数据库搭建&#xff09; 以 Spring Boot 项目为例&#xff1a; 引入 Flowable 必要依赖。 <!-- flowable 依赖 --> <dependency><groupId>org.flowable</gr…...

[Java]微服务拆分

导入项目 本篇及后续的微服务学习都是基于Centos7系统下的Docker部署&#xff0c;因此需要准备: Centos7的环境SSH客户端安装好Docker会使用Docker 之前的学习, 导致虚拟机中存在黑马商城项目以及mysql数据库, 为了保持一致, 需要删除 cd /rootdocker compose down 安装mysq…...

JavaScript逆向爬虫教程-------基础篇之JavaScript混淆原理

目录 一、常量的混淆原理1.1 对象属性的两种访问方式1.2 十六进制字符串1.3 Unicode字符串1.4 字符串的ASCII码混淆1.5 字符串常量加密1.6 数值常量加密二、增加 JS 逆向者的工作量2.1 数组混淆2.2 数组乱序2.3 花指令2.4 jsfuck三、代码执行流程的防护原理3.1 流程平坦化3.2 …...

qt移植到讯为rk3568,包含一些错误总结

qt移植到arm报错动态库找不到 error while loading shared libraries: libAlterManager.so.1: cannot open shared object file: No such file or directory 通过设置环境变量 LD_LIBRARY_PATH就行了。 LD_LIBRARY_PATH是一个用于指定动态链接器在运行时搜索共享库的路径的环…...

使用阿里云快速搭建 DataLight 平台

使用阿里云快速搭建 DataLight 平台 本篇文章由用户 “闫哥大数据” 分享&#xff0c;B 站账号&#xff1a;https://space.bilibili.com/357944741?spm_id_from333.999.0.0 注意&#xff1a;因每个人操作顺序可能略有区别&#xff0c;整个部署流程如果出现出入&#xff0c;以…...

ubuntu设置自启动

1. 把要启动的程序或者脚本(比如A.sh、A1)放在 /usr/sbin 目录中。比如我的 A.sh 只是启动 A1 程序&#xff1a; #!/bin/bash/usr/sbin/A1echo "A1 finish!!!" 需要注意的是&#xff0c;脚本和程序都要有可执行的权限才行 2. 在 /etc/systemd/system 目录中创建 .…...

Paddle分布式训练报NCCL错

应该是没有装NCCL&#xff0c;但是通过NVIDIA官网方式用apt安装报错&#xff0c;说nccl签名有问题 打开官网查找对应版本的nccl&#xff1a;https://developer.nvidia.com/nccl/nccl-legacy-downloads 这里不下载local Ubuntu选项&#xff0c;下载O/S agnostic local install…...

PD3.1快充对我们到底有没有必要?

在科技飞速发展的今天&#xff0c;各种智能设备和电子产品已经渗透到了我们生活的方方面面。随之而来的&#xff0c;是对充电速度和效率的不断追求。正是在这样的背景下&#xff0c;USB联盟于2021年6月发布了最新的快充协议——PD3.1。那么&#xff0c;PD3.1快充协议对我们到底…...

Android OpenGL ES详解——立方体贴图

目录 一、概念 二、如何使用 1、创建立方体贴图 2、生成纹理 3、设置纹理环绕和过滤方式 4、激活和绑定立方体贴图 三、应用举例——天空盒 1、概念 2、加载天空盒 3、显示天空盒 4、优化 四、应用举例——环境映射:反射 五、应用举例——环境映射:折射 六、应用…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

DBLP数据库是什么?

DBLP&#xff08;Digital Bibliography & Library Project&#xff09;Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高&#xff0c;数据库文献更新速度很快&#xff0c;很好地反映了国际计算机科学学术研…...

前端高频面试题2:浏览器/计算机网络

本专栏相关链接 前端高频面试题1&#xff1a;HTML/CSS 前端高频面试题2&#xff1a;浏览器/计算机网络 前端高频面试题3&#xff1a;JavaScript 1.什么是强缓存、协商缓存&#xff1f; 强缓存&#xff1a; 当浏览器请求资源时&#xff0c;首先检查本地缓存是否命中。如果命…...