Vue 中 KeepAlive 内置缓存使用

news2024/9/23 7:24:33
KeepAlive 介绍及使用场景

KeepAlive 是 vue 中的内置组件,当多个组件动态切换时可以对实例状态进行缓存,用法如下

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

router-view 中定义了一个信号槽,来渲染跳转后的组件,将keep-alive 标签封装在 组件的外面,即可实现路由跳转组件的缓存效果

KeepAlive 使用实例

下图有两个组件 页面1 和 页面2,组件页面切换 通过 点击按钮 实现

在这里插入图片描述

页面1 是一个计数器,加一减一,默认初始值为 0;点击按钮 页面2 ,会跳转一个 含有输入框的页面,输入框默认为空;

正常情况下,组件切换都会将组件置为初始化状态,不会缓存历史数据;如当页面1 中通过触发 增加减少按钮将当前值置为 5 后,当切换到页面2 再切换至 页面1 ,当前值会被重置为0,原有历史数据并没有被缓存下来

而 keepAlive 可以在切换时将组件内的原有状态数据进行缓存;使用时只需要将需要缓存的组件外面包裹一层 <keepAlive></keepAlive> 标签即可,如下:

<template>
  <div class="main-test">


    <div style="margin-top:20px;margin-left: 20px;">
      <a-space>

        <a-button type="primary" style="color: blue; font-size: 14px" @click="changePageName"
          :disabled="pageName === 'A'">
          页面1
        </a-button>
        <a-button type="primary" style="color: blue; font-size: 14px" @click="changePageName"
          :disabled="pageName === 'B'">
          页面2
        </a-button>

      </a-space>
    </div>
    <keep-alive>
      <Page1 v-if="pageName === 'A'" style="margin-left: 20px; font-size: 16px; margin-top: 25px;">
      </Page1>
    </keep-alive>
    <keep-alive>
      <Page2 v-if="pageName === 'B'" style="margin-left: 20px; font-size: 16px; margin-top: 25px;">
      </Page2>
    </keep-alive>
  </div>
</template>

<script setup>
import { ref, onMounted } from 'vue'
import { useRouter } from 'vue-router'
import Page1 from '@/components/test/Page1.vue';
import Page2 from '@/components/test/Page2.vue';

const pageName = ref('A')

function changePageName() {
  pageName.value = pageName.value === 'A' ? 'B' : 'A'
}

</script>

Page1 组件

<template>
    <div style="color: black;">
        当前值为{{ pageName }}
        <div style="margin-top: 20px;">
            <a-space>

                <a-button @click="addNum" type="primary">
                    增加
                </a-button>
                <a-button @click="minusNum" type="primary">
                    减少
                </a-button>
            </a-space>
        </div>
    </div>
</template>
  
<script setup>
import { ref } from 'vue'

const pageName = ref(0)

function addNum() {
    pageName.value += 1
}
function minusNum() {
    pageName.value -= 1
}

</script>
  
  
<style scoped lang="less">
.main-test {
    font-size: large;
    color: red;
    font-weight: bold;
}
</style>

Page2 组件

<template>
    <div style="color: black;">
        输入值
        <a-input v-model:value="pageName" style="margin-top: 20px; width: 300px;" placeholder="请输入需要添加的值"></a-input>
    </div>
</template>
  
<script setup>
import { ref } from 'vue'
const pageName = ref('')

</script>
  
  
<style scoped lang="less">
.main-test {
    font-size: large;
    color: red;
    font-weight: bold;
}
</style>

页面 Page1 和 页面 Page2 组件的外层都加了一层 <keep-alive></keep-alive> 标签,这样无论从页面1切换到 2 还是2 切换到1 ,两个组件内的数据状态都会得到缓存,不需要重新加载

在这里插入图片描述

借助 Include /Exclude 属性 条件缓存

KeepAlive 默认缓存标签内所有组件,提供 includeexclude 属性可以实现条件缓存,支持逗号分隔、正则表达式,或者类型数组等三种形式

具体用法如下:

<!-- 逗号隔离的字符串,匹配 name 为 a 或 b 的组件  -->
<KeepAlive include="a,b">
  <component :is="view" />
</KeepAlive>

<!--正则表达式 ,匹配 name 不为 a 或 b 的组件-->
<KeepAlive :exclude="/a|b/">
  <component :is="view" />
</KeepAlive>

<!--数组 ,匹配 name 为 a 或 b 的组件 -->
<KeepAlive :include="['a', 'b']">
  <component :is="view" />
</KeepAlive>

上面属性内容匹配的都是组件 的 name option ,当组件需要被 keepAlive 条件缓存时,都需要指定 组件的 name

vue2 中 单文件 组件 指定 name 方式如下

<template>
 <div>
 </div>
</template>
<script>
export default {
  name: 'test'
}
</script>

vue3 中 单文件 组件 name 指定,自 3.2.34 以后版本自动将 文件的文件名指定为 name,移除了手动声明方式

max 指定 最大缓存实例 次数

<KeepAlive> 中 通过指定 max 属性来限制组件实例的最大缓存次数,当缓存实例次数达到max 值,则将最少访问 实例 销毁 为新示例创建预留空间

<KeepAlive :max="10">
  <component :is="activeComponent" />
</KeepAlive>
实例缓存的钩子函数

被 KeepAlive 缓存的组件实例,当组件挂载或销毁时会分别触发 activated()deactivated()钩子 函数,而不是 unmounted()mounted()

如果要在实例挂载或销毁时做一些操作,可以把相关逻辑写入两个钩子函数里:

<script setup>
import { onActivated, onDeactivated } from 'vue'

onActivated(() => {
  // called on initial mount
  // and every time it is re-inserted from the cache
})

onDeactivated(() => {
  // called when removed from the DOM into the cache
  // and also when unmounted
})
</script>
参考

https://vuejs.org/guide/built-ins/keep-alive.html#basic-usage

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

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

相关文章

Adobe Photoshop2018-2024mac/win合集:轻松掌控设计世界

Adobe Photoshop&#xff0c;简称“PS”&#xff0c;是由Adobe Systems公司开发和发行的图像处理软件。Adobe Photoshop主要处理以像素所构成的数字图像。使用其众多的编修与绘图工具&#xff0c;可以有效地进行图片编辑工作。 Adobe Photoshop在图像、图形、文字、视频、出版等…

京东商品数据:8月京东环境电器行业数据分析

8月份&#xff0c;环境电器大盘市场整体下滑。鲸参谋数据显示&#xff0c;8月京东平台环境电器的大盘将近570万&#xff0c;环比下滑约29%&#xff0c;同比下滑约10%&#xff1b;销售额为25亿&#xff0c;环比下滑约23%&#xff0c;同比下滑约8%。 *数据源于鲸参谋-行业趋势分析…

数字经济和法治背景下国企合规数字化转型思考

近年来&#xff0c;数字经济的快速发展已经深刻影响了各行各业的运营方式和商业模式。在这个数字化时代&#xff0c;企业要想保持竞争力和可持续发展&#xff0c;必须紧跟时代潮流&#xff0c;进行数字化转型。而对于国有企业来说&#xff0c;数字化转型中的合规问题显得尤为重…

景联文科技:AI大模型强势赋能,助力自动驾驶迭代升级

我国一直以来都将自动驾驶作为新兴产业发展的重点领域之一&#xff0c;工信部等相关部委出台了一系列自动驾驶发展战略、规划和标准&#xff0c;一些地方政府也在积极开展关于自动驾驶的地方立法&#xff0c;为自动驾驶技术的研发和应用提供更加具体的法律保障。例如&#xff0…

记录:Unity脚本的编写3.0

目录 前言前置控制方法查看效果移动方式 前言 前面记录了一些通过脚本控制对象模型移动和通过用户的操作对模型进行变化的方法&#xff0c;那么为了让我们创造的不论是地形还是模型都拥有真实的物理引擎&#xff08;大雾&#xff09;&#xff0c;那么这次就使用脚本控制模型感…

purr map walk 学习教程 完整版

Function reference • purrrhttps://purrr.tidyverse.org/reference/index.htmlMap over multiple input simultaneously (in "parallel") — pmap • purrr

linux python 保存图形savefig import matplotlib.pyplot as plt

import matplotlib.pyplot as plt # 绘制图形 mod.plot_history(20)# 保存图形 plt.savefig("my_training_ephoes_plot.png") # 保存为PNG格式 # 保存图形并设置dpi参数 plt.savefig("my_plot.png", dpi600) # 保存为PNG格式&#xff0c;设置dpi为300

Conv1d与Conv2d函数用法

Conv1d 和 Conv2d 分别是卷积神经网络&#xff08;CNN&#xff09;中的两种卷积层操作&#xff0c;它们在处理不同维度的数据上有联系和区别&#xff0c;本文是一篇学习笔记。 本文主要包括以下内容&#xff1a; 1.联系2.区别3.Conv1d卷积4.Conv2d卷积5.图解Conv1d卷积&#x…

一文告知HTTP GET是否可以有请求体

HTTP GET是否可以有请求体 先说结论&#xff1a; HTTP协议没有规定GET请求不能携带请求体&#xff0c;但是部分浏览器会不支持&#xff0c;因此不建议GET请求携带请求体。 HTTP 协议没有为 GET 请求的 body 赋予语义&#xff0c;也就是即不要求也不禁止 GET 请求带 body。大多数…

教资一年可以考几次 教资考试每年次数介绍

教师资格证一年可以考两次。根据教师资格证考试规定&#xff0c;为了满足报考人员的工作需求&#xff0c;达到市场供求均衡的状态&#xff0c;教师资格证区别于其他的技术资格类的考试&#xff0c;会每年举行两次考试&#xff0c;分别在上半年和下半年各举行一次考试。 上半年…

设计模式 - 行为型模式考点篇:策略模式(概述 | 案例实现 | 优缺点 | 使用场景)

目录 一、行为型模式 1.1、策略模式 1.1.1、概论 1.1.2、案例实现 1.1.3、优缺点 1.1.4、使用场景 一、行为型模式 1.1、策略模式 1.1.1、概论 策略模式设计的每一个算法都封装了起来&#xff0c;使他们可以相互替换&#xff0c;通过一个对象委派不同的算法给相应的客户…

【网络安全】关于CTF那些事儿你都知道吗?

关于CTF那些事儿你都知道吗&#xff1f; 前言CTF那些事儿内容简介读者对象专家推荐 本文福利 前言 CTF比赛是快速提升网络安全实战技能的重要途径&#xff0c;已成为各个行业选拔网络安全人才的通用方法。但是&#xff0c;本书作者在从事CTF培训的过程中&#xff0c;发现存在几…

Ant Design of React 创建项目及运行环境

Ant Design of React 学习笔记&#xff08;1&#xff09; 创建项目及运行环境 本文使用 create-react-app 创建一个 TypeScript 项目&#xff0c;并引入 antd。 1.命令行cd到对应的目录&#xff0c;这里是npm下回车运行&#xff0c;其他如pnpm yarn参考官网 npx create-reac…

Java实验(头歌) -Java继承和多态接口

/*** 编写程序&#xff0c;实现两个数的求和运算和比较*/ // 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码 /********** Begin **********/ // 定义一个接口类 Compute// 第一个为 sum()&#xff0c;实现两个数的相加&#xff0c;返回值为 int// 第二个为 max()…

【软件测试】APP 上架指南:iOS App Store 首次上架被拒原因分析与解决方案

目录 一、前言 二、APP 审核备案新规 &#xff08;1&#xff09;iOS 上架审核申请被拒 &#xff08;2&#xff09;苹果应用商店重大调整 &#xff08;3&#xff09;首次备案流程 ① 阿里云备案 ② 华为云备案 ③ 腾讯云备案 三、iOS 首次上架拒审原因分析 &#…

动捕设备推动舞蹈表演动作捕捉动画制作突破边界

动捕设备是音乐动画制作中获得巨大创作潜力的一种全新途径。使用全身动捕设备可以花更少的时间编辑预制动画资产&#xff0c;从而节省时间投入到创建更为丰富的动画制作环境中。 如广州虚拟动力对于舞蹈表演动作捕捉动画制作服务&#xff0c;能够提供惯性动捕设备vdsuit full以…

ctfshow-web2(SQL注入)

打开题目链接&#xff0c;是一个登录框&#xff0c;尝试弱口令登录 没什么反应 尝试万能密码登录 页面发生了变化 并未登录进去&#xff0c;但是有回显&#xff0c;大概率是SQL注入了 这里尝试了很久&#xff0c;尝试过程就不写了&#xff0c;最终判断它的注入点在用户名&…

C++ 类和对象篇(七) 运算符重载

目录 一、运算符重载 1. 运算符重载是什么&#xff1f; 2. 为什么要运算符重载&#xff1f; 3. 怎么进行运算符重载&#xff1f; a. 运算符重载函数的格式 b. 参数的个数和要重载的运算符操作数相同 c. 运算符重载函数必须有一个类类型参数 4. 注意事项 二、 赋值运算符重载 1.…

提升企业形象与效率,申请办理400电话客服中心

引言&#xff1a; 随着企业竞争的日益激烈&#xff0c;提供优质的客户服务成为企业赢得市场份额的关键。而400电话客服中心的建立&#xff0c;不仅可以提升企业形象&#xff0c;还能提高客户满意度和工作效率。本文将介绍400电话客服中心的申请办理过程&#xff0c;以及其对企业…

Starrc读lef遇到的常见错误

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 ERROR: the definition cell "BUFXX" instantiated as xx in DEF file xx is not found.(SX-2144) ERROR: Instance xx has no definition. (SX-2505) 这个问题就是典型的lef数据不全,…