Vue3-43-组件- 组件状态保持 KeepAlive 的简单使用

作用说明

一个应用场景
当我们在进行路由跳转的时候,会用到 <router-view> 来作为 组件渲染的出口, 此时,组件的状态是不会被保持的。
比如 : 当前在【组件A】中有一个响应式状态 num 的值通过 自加的方式 从初始值0 变成了 100;
然后跳转到 【组件B】,
再次跳转 回到 【组件A】 的时候,num 的值会 恢复为初始值 0。

如何实现 回到 【组件A】的时候,仍然保持 num 的数据状态为 100 呢?
这就是本文要介绍的 KeepAlive 组件的作用。
它就是用来做组件状态保持的,或者叫做 缓存组件实例。

KeepAlive的简单介绍

1、 直接使用 <keep-alive> 标签,将目标组件包起来,就实现了组件的缓存;

2、配合路由的时候,需要使用到下面的格式 : 这个格式是固定的

    <router-view v-slot="{ Component }"><keep-alive><component :is="Component" /></keep-alive></router-view>

3、组件在缓存的时候,有两个声明周期钩子可以配合使用:
onActivated : 组件在被激活时触发
onDeactivated : 组件在跳转走被缓存时触发

4、KeepAlive 有两个属性 :
include : 指定缓存的组件
exculde : 指定 不要 缓存的组件
以上两个属性 的值是 组件的名称, 可以是 数组的形式指定多个组件。
例如 : 有 两个组件,name 分别是 a 和 b
例1 :<keep-alive include="a">
例2 : <keep-alive :include="['a','b']">
注意,当是数组的时候,需要使用 :的形式。

代码案例

本案例 有两个普通的组件,分别包含了响应式状态,
App.vue 中通过 按钮 进行两个组件的切换;
观察 1:两个组件的响应式状态是否保存了 ;
观察2 :两个组件的声明周期钩子。

本案例的项目结构如下:
projectName| -- src| -- App.vue            # 根组件| -- componentA.vue     # 组件A| -- componentB.vue     # 组件B| -- main.ts            # 程序入口文件| -- router.ts          # 路由配置文件| -- index.html             # 项目的入口文件

案例代码

组件A componentA.vue

<template><div class="diva">这是组件A<br>countNum : {{ countNum }}<br><button @click="countNum++">+</button><button @click="countNum--">-</button></div></template><script setup lang="ts">// 指定组件名称defineOptions({name:'ca'})import { ref,onMounted,onUnmounted,onActivated,onDeactivated} from 'vue'const countNum = ref(0)// 组件挂载成功后onMounted(()=>{console.log('组件A onMounted')})// 组件卸载成功后onUnmounted(() => {console.log('组件A onUnmounted')}),// 组件激活onActivated(()=>{console.log('组件A onActivated')})// 组件失活onDeactivated(()=>{console.log('组件A onDeactivated')})</script><style scoped>.diva{width: 300px;height: 200px;background: red;}
</style>

组件B componentB.vue

<template><div class="divb">这是组件B<br>message : {{ message }}<br>输入框 :<input type="text" v-model="message" /></div></template><script setup lang="ts">// 指定组件名称defineOptions({name:'cb'})import { ref,onMounted,onUnmounted,onActivated,onDeactivated} from 'vue'const message = ref('')// 组件挂载成功后onMounted(()=>{console.log('组件B onMounted')})// 组件卸载成功后onUnmounted(() => {console.log('组件B onUnmounted')}),// 组件激活onActivated(()=>{console.log('组件B onActivated')})// 组件失活onDeactivated(()=>{console.log('组件B onDeactivated')})</script><style scoped>.divb{width: 250px;height: 150px;background: green;}
</style>

路由配置 router.ts


// 导入 定义路由的两个方法
import {createRouter,createWebHistory}  from 'vue-router'// 懒加载写法 : 先声明,下面直接使用
const componentA = () => import('./componentA.vue')
const componentB = () => import('./componentB.vue')// 声明路由跳转的路径与组件的对应关系
const routsList = [// 直接使用上面声明的组件{path:'/a',name:'aroute',component:componentA},{path:'/b',name:'broute',component:componentB}
]// 创建路由的实例对象
const routerConfigObj = createRouter({history:createWebHistory('abc'), // 带一个参数,表示是路由的一个前缀routes:routsList // 指定路由的配置列表
})// 导出路由的对象
export default routerConfigObj;

根组件 App.vue

<template><div class="basediv">APP.vue 中的 msg : {{ msg }}<br><button @click="$router.push('/a')">跳转到A</button><button @click="$router.push('/b')">跳转到B</button><br><!-- 核心 : keep-alive 的使用 --><router-view v-slot="{ Component }"><!--  :exclude="['ca','cb']" --><keep-alive :include="['ca','cb']"><component :is="Component" /></keep-alive></router-view></div></template><script setup lang="ts">// 引入 provide 方法import { ref } from 'vue'// 声明父组件的一个变量const msg = ref('这是App根组件的msg变量')</script><style scoped>.basediv{width: 600px;height: 400px;border: 1px solid red;}
</style>

运行结果

》1、初始状态 : 组件A中的数字执行几次自增
在这里插入图片描述

》2、点击 跳转到 组件B

点击前跳转后
在这里插入图片描述在这里插入图片描述

》3、组件B中的输入框输入内容
在这里插入图片描述

》4、点击跳转回 组件A
在这里插入图片描述

》5、再次跳转回 组件B
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/605738.shtml

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

相关文章

猫长期吃猫粮好吗?主食冻干猫粮那种好吃又健康

许多铲屎官可能认为&#xff0c;只需给猫咪喂食猫粮就足够了。然而&#xff0c;猫咪实际上是肉食动物&#xff0c;对蛋白质的需求非常高。冻干猫粮采用低温真空干燥处理技术&#xff0c;将鲜肉经过预冻、升华、解析三个过程&#xff0c;去除水分的同时保持蛋白质等营养物质不变…

弹窗找不到iutils.dll是怎么回事?需要怎么解决呢?分享多种方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“iutils.dll丢失”。iutils.dll是一款系统的动态链接库文件&#xff0c;主要用于支持某些软件和游戏的启动和运行。如果开机提示iutils.dll丢失&#xff0c;可能会导致相关软件和游戏无法正…

校园跑腿小程序(前后端已完成)可做项目,可当毕设,支持二创

此小程序为我单独在小程序上运行的结果&#xff0c;图片信息、列表信息等没有出现是因为服务器到期了&#xff0c;资源被释放了&#xff0c;无法显示。但是后端是已经实现了的&#xff0c;有兴趣的同学可以私聊我。 效果预览

建筑模板每平方价格怎么算?

在建筑行业中&#xff0c;建筑模板是一种常用的辅助材料&#xff0c;主要用于浇筑混凝土时形成所需的结构形状。了解建筑模板的定价方式对于预算控制和成本估算至关重要。本文将详细介绍建筑模板每平方米价格的计算方法。 1. 建筑模板的类型和特点建筑模板的种类繁多&#xff0…

Linux ls命令

目录 一. 配置项1.1 ls -l1.2 ls -a1.3 ls -lrt1.4 ls -ld .?* 二. 案例2.1 查看指定文件夹下文件的数量2.2 查看多个文件夹下文件信息 一. 配置项 1.1 ls -l ⏹ ls 列出当前文件夹下所有文件名称(不包含隐藏文件) jmw_num_00 jmw_num_02 jmw_num_04 jmw_num_06 jmw_n…

try catch 应该在 for 循环里面还是外面

正文 首先 &#xff0c; 话说在前头&#xff0c; 没有什么 在里面 好 和在外面好 或者 不好的 一说。 本篇文章内容&#xff1a; 使用场景 性能分析 个人看法 1. 使用场景 为什么要把 使用场景 摆在第一个 &#xff1f; 因为本身try catch 放在 for循环 外面 和里面 …

【sgPasswordInput】自定义组件:带前端校验密码强度的密码输入框,能够提供密码强度颜色提示和文字提示

特性&#xff1a; 有密码强度颜色提示密码强度进度条提示支持设置默认输入提示和密码长度 sgPasswordInput源码 <template><div :class"$options.name" style"width: 100%"><el-inputstyle"width: 100%"ref"psw"type&…

LED驱动芯片SM901K:可用于消除led无极调光频闪

LED驱动芯片SM901K/KF是一款专门用于消除100/120Hz LED电流纹波的芯片。当LED灯串中的LED电流发生纹波时&#xff0c;会影响到LED的亮度和寿命&#xff0c;因此消除这种电流纹波对于LED灯串的稳定工作非常重要。 SM901K LED驱动芯片SM901K/KF采用了先进的控制技术&#xff0c;…

基于Java SSM框架实现点餐系统网站系统项目【项目源码

基于java的SSM框架实现点餐系统网站系统演示 JAVA简介 JAVA语言是目前软件市场上应用最广泛的语言开发程序。可以在多种平台上运用的&#xff0c;兼容性比较强&#xff0c;适应市面上大多数操作系统&#xff0c;不会出现乱码的现像&#xff0c;其扩展性和维护性都更好&#xf…

一文读懂「Self Attention」自注意力机制

前言&#xff1a;Self-Attention是 Transformer 的重点&#xff0c;因此需要详细了解一下 Self-Attention 的内部逻辑。 一、什么是自注意力机制&#xff1f; 就上图为例&#xff0c;老实告诉我当你第一眼看到上图时&#xff0c;你的视线停留在哪个位置&#xff1f;对于我这种…

使用 Docker 和 Diffusers 快速上手 Stable Video Diffusion 图生视频大模型

本篇文章聊聊&#xff0c;如何快速上手 Stable Video Diffusion (SVD) 图生视频大模型。 写在前面 月底计划在机器之心的“AI技术论坛”做关于使用开源模型 “Stable Diffusion 模型” 做有趣视频的实战分享。 因为会议分享时间有限&#xff0c;和之前一样&#xff0c;比较简…

记一次使用mpvue开发微信小程序动画播放播放完成再播放下一个动画,实现动画队列的实战操作

微信小程序wxss支持Css的keyframes动画&#xff0c;我们想通过事件监听&#xff0c;在动画开始、动画播放阶段、动画播放结束的时候进行下一步动作。如下图&#xff0c;有一个从右飘入&#xff0c;然后从左侧出去的动画&#xff0c;我们希望的是&#xff0c;前一个出去后&#…

[VUE]4-状态管理vuex

目录 状态管理 vuex 1、vuex 介绍 2、安装 3、使用方式 4、总结 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff0c;擅长web应用开发、数据结构和算法&#xff0c;初步涉猎Python人工智…

【设计模式】迭代器模式

一起学习设计模式 目录 前言 一、概述 二、结构 三、案例实现 四、优缺点 五、使用场景 六、JDK源码解析 总结 前言 【设计模式】迭代器模式——行为型模式。 一、概述 定义&#xff1a; 提供一个对象来顺序访问聚合对象中的一系列数据&#xff0c;而不暴露聚合对象…

文本可视化之词云图的使用

环境安装&#xff1a; pip install wordcloud -i https://pypi.tuna.tsinghua.edu.cn/simple/ conda install wordcloud # -i 后面加镜像源网站​ WordCloud(background_color,repeat,max_words600,height480, width584, max_font_size,font_path colormap,mask,mode,coll…

人工智能_机器学习089_DBSCAN聚类案例_DBSCAN聚类算法效果展示_使用轮廓系数来评分DBSCAN效果---人工智能工作笔记0129

dbscan = DBSCAN(eps = 0.2,min_samples =3) 我们指定半径是0.2 然后每个圆圈至少是3个数据就可以归为一类 dbscan.fit(X) 然后进行训练 # 得到每个样本的标签,分类结果 y_ =dbscan.labels_ 然后得到结果 ,注意这里不需要进行predict,因为fit直接就相当于分类了 plt.scatte…

12 月 NFT 市场动态:强劲增长塑造年终趋势

作者&#xff1a;stellafootprint.network 数据来源&#xff1a;NFT Research 12 月加密货币和 NFT 领域出现了显著的上涨趋势&#xff0c;比特币和以太坊价格的大幅上涨标志着市场的复苏。与此同时&#xff0c;NFT 领域的交易量飙升&#xff0c;独立用户&#xff08;钱包&am…

wordcloud,一个超酷的python库

一、简单介绍一下 词云图是文本挖掘中用来表征词频的数据可视化图像&#xff0c;通过它可以很直观地展现文本数据中地高频词&#xff0c;让读者能够从大量文本数据中快速抓住重点。如下图&#xff1a; wordcloud则是一个非常优秀的词云展示python库&#xff0c;它支持自定义词…

文件夹重命名:如何一键完成简体中文文件夹名到繁体中文的批量转换

随着科技的发展&#xff0c;人类越来越依赖计算机和电子设备进行文件管理。在这个过程中&#xff0c;经常会遇到要将简体中文文件夹名转换为繁体中文的情况。这有助于统一文件名的格式&#xff0c;也能提高文件的可读性和检索性。那如何一键完成简体中文文件夹名到繁体中文的批…

CSC行业合作项目|政府公务员赴英国南安普顿大学访学交流

CSC的行业合作项目由于是单位性质及CSC资助等原因&#xff0c;申请者一般不去美国&#xff0c;而选择较易通过签证的国家&#xff0c;且访学交流的方向也偏向于非敏感领域。遵循这一原则&#xff0c;我们最终为U老师申请到英国南安普顿大学&#xff0c;使其顺利获批CSC&#xf…