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
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JS-DOM树和DOM对象

作用和分类 作用&#xff1a;就是使用JS去操作html和浏览器 分类&#xff1a;DOM&#xff08;文档对象模型&#xff09;、BOM&#xff08;浏览器对象模型&#xff09; 什么是DOM DOM&#xff08;Document Object Model--文档对象模型&#xff09;是用来呈现以及与任意HTML或…

横版动作闯关游戏:幽灵之歌 GHOST SONG 中文版

在洛里安荒凉的卫星上&#xff0c;一件长期休眠的死亡服从沉睡中醒来。踏上发现自我、古老谜团和宇宙骇物的氛围2D冒险之旅。探索蜿蜒的洞穴&#xff0c;获得新的能力来揭开这个外星世界埋藏已久的秘密。 游戏特点 发现地下之物 探索这个广阔而美丽如画&#xff0c;充满密室和诡…

【算法笔记】状态压缩dp(noip)

在acwing学习算法的一点思考和总结 状态压缩dp可以用来解决两种问题&#xff1a;一种是棋盘式的&#xff0c;也就是表示一行有2^N种摆法&#xff0c;另一种是表示一类集合 状压——棋盘式 思路&#xff1a;可以类比一下蒙德里安的梦想的解题过程&#xff0c;每一行的状态都只会…

数据库悲观锁 select for update的详解

一 作用 1.1 结论 在mysql中&#xff0c;select ... for update 仅适用于InnoDB&#xff0c;且必须在事务块中才能生效。Innodb引擎默认是行锁。 Select .... from where .... for update 如果在where的查询条件字段使用了【主键|索引】&#xff0c;则此命令上行锁。否…

“Frontiers”系列多本期刊分区下跌,1本SCI被踢,2本SCI升为Top,还可投吗?

近期&#xff0c;2023年中科院分区正式发布&#xff0c;不少学者都很关心期刊变动情况。此次分区更新中&#xff0c;Frontiers出版社旗下的医学期刊表现让人大跌眼镜。 据汇总来看&#xff0c;32本大类医学SCI期刊中&#xff0c;Frontiers of Hormone Research直接从原来的医学…

C语言操作符详解与进制

目录 一&#xff1a;操作符的分类 二&#xff1a;二进制和进制转换 2.1 2进制转10进制 2.1.1 10进制转2进制数字 2.2 2进制转8进制和16进制 2.2.1 2进制转8进制 2.2.2 2进制转16进制 三&#xff1a; 原码、反码、补码 四&#xff1a;移位操作符 4.1左移操作符 4.2 右…

AOT-GAN-for-Inpainting项目解读|使用AOT-GAN进行图像修复

项目地址&#xff1a; https://github.com/researchmm/AOT-GAN-for-Inpainting 基于pytorch实现 论文地址&#xff1a; https://arxiv.org/abs/2104.01431 开源时间&#xff1a; 2021年 项目简介&#xff1a; AOT-GAN-for-Inpainting是一个开源的图像修复项目&#xff0c;其对 …

c++学习笔记-STL案例-机房预约系统3-登录模块

前言 衔接上一篇“c学习笔记-STL案例-机房预约系统2-创建身份类”&#xff0c;本文主要设计登录模块&#xff0c;建立globalFile.h头文件定义使用的文件名字符串&#xff0c;登录函数封装&#xff0c;并对学生登录、老师登录、管理员登录进行了具体实现。 目录 6 登录模块 6…

外卖骑手与行人之间的非零和博弈

一、背景 自2013年成立以来&#xff0c;美团外卖一直保持着高速增长&#xff0c;通过提供便捷、高效的外卖服务&#xff0c;满足了大量消费者的需求。美团外卖的服务不仅限于基础的送餐服务&#xff0c;还涵盖了多种生活服务&#xff0c;如超市便利、药品配送等&#xff0c;满…

记录汇川:H5U与Fctory IO测试10

主程序&#xff1a; 子程序&#xff1a; IO映射 子程序&#xff1a; 自动程序 Fctory IO配置&#xff1a; HMI配置&#xff1a; 实际动作如下&#xff1a; Fctory IO测试10

档案数字化怎样快速整理资料

对于机构和组织来说&#xff0c;档案数字化是一个重要的信息管理和保护措施。要快速整理资料进行档案数字化&#xff0c;可以遵循以下步骤&#xff1a; 1. 准备工具和设备&#xff1a;确保有一台计算机、扫描仪和相关软件。 2. 分类和组织资料&#xff1a;先将资料分类&#xf…

一文解析Web缓存代理

Web缓存代理在现代网络架构中起着非常重要的作用&#xff0c;它可以减少网络传输延迟&#xff0c;提高网站的性能和用户体验。本文将深入解析Web缓存代理的原理、工作方式以及优势&#xff0c;帮助读者更好地理解和应用这一技术。 在Web应用中&#xff0c;数据的快速传输是至关…

[足式机器人]Part2 Dr. CAN学习笔记-Advanced控制理论 Ch04-5稳定性stability-李雅普诺夫Lyapunov

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-Advanced控制理论 Ch04-5稳定性stability-李雅普诺夫Lyapunov Stability in the sense of Lyapunov Assympototic Stability

关于白盒测试,这些技巧你得游刃有余~

对于很多刚开始学习软件测试的小伙伴来说&#xff0c;如果能尽早将黑盒、白盒测试弄明白&#xff0c;掌握两种测试的结论和基本原理&#xff0c;将对自己后期的学习有较好的帮助。今天&#xff0c;我们就来聊聊黑盒、白盒测试的相关话题。 1、黑盒测试的方法和小结 最常见黑盒…

Elasticsearch倒排索引详解

倒排索引&#xff1a; 组成 term index(词项索引 &#xff0c;存放前后缀指针) Term Dictionary&#xff08;词项字典&#xff0c;所有词项经过文档与处理后按照字典顺序组成的一个字典&#xff08;相关度&#xff09;&#xff09; Posting List&#xff08;倒排表&#xf…

Asp .Net Core 系列: 集成 Consul 实现 服务注册与健康检查

文章目录 什么是 Consul?安装和运行 ConsulAsp .Net Core 如何集成 Consul 实现服务注册和健康检查Consul.AspNetCore 中的 AddConsul 和 AddConsulServiceRegistration 方法 究竟做了什么&#xff1f;AddConsul 方法AddConsulServiceRegistration 方法 配置 Consul 检查服务封…

16 张动图讲透网络原理

网络其实存在于日常生活中的每一个角落。 你的电脑&#xff0c;打印机&#xff0c;手机&#xff0c;甚至电视等等都属于网络设备。通常&#xff0c;你需要将这些设备通过网络连接起来&#xff0c;这样就可以实现数据的传输和共享&#xff0c;让工作生活更加便捷。 如果你的连接…

云服务器哪家强?当属阿里云腾讯云or华为云?

云服务器哪家强?当属阿里云腾讯云or华为云&#xff1f;云服务器哪家便宜&#xff1f;2024最新整理你要的都在这&#xff01;头部云厂商阿里云、腾讯云、华为云、京东云、UCloud等都在降价&#xff0c;阿腾云atengyun.com分享2024年云服务器租用价格给你惊喜&#xff01; 便宜云…

乱 弹 篇(一)

题记 对于“乱弹”这个词汇的释义&#xff0c;《辞海》上仅有“ 戏曲剧种&#xff0c;亦指声腔 ”8个字。而由于“乱弹 ”的“ 弹”谐音“谈”&#xff0c;这就容易让人联想到“乱谈”。不过从文体上看&#xff0c;“乱谈”也非乱七八糟之谈&#xff0c;反倒是“东西南北&…

系分笔记数据库反规范化、SQL语句和大数据

文章目录 1、概要2、反规范化3、大数据4、SQL语句5、总结 1、概要 数据库设计是考试重点&#xff0c;常考和必考内容&#xff0c;本篇主要记录了知识点&#xff1a;反规范化、SQL语句及大数据。 2、反规范化 数据库遵循范式的设计&#xff0c;使得多表查询和连接表查询较多的时…