vue3 KeepAlive实操

news2024/12/29 11:34:27

一.相关文档

  • KeepAlive 官方文档
  • Vue Router 文档
  • Pinia 文档

二.需求

  1. 首页->列表 —不缓存列表
  2. 列表->详情 —缓存列表
  3. 详情->列表 — 恢复列表缓存

三.代码如下

1.定义pinia
export const useStore = defineStore('store', {
    state: () => ({
        cachedList: [] //缓存白名单,详细表述见最后【补充】
    }),
    actions: {
        // 添加缓存
		addCachedList(view) {
			if (this.cachedList.includes(view.name))  return;
			this.cachedList.push(view.name);
        },
        // 移除缓存
        delCachedList(view) {
			const index = this.cachedList.indexOf(view.name);
			index > -1 && this.cachedList.splice(index, 1);
		}
	}
})
2.router meta定义
const router = createRouter({
    history: createWebHashHistory(import.meta.env.BASE_URL),
    routes: [
    	{
            path: '/index',
            name: 'Index',
            component: () => import('../views/index.vue')
        },
        {
            path: '/list',
            name: 'List',
            meta: {
                keepAlive: true //标识需要缓存的页面
            },
            component: () => import('../views/list.vue')
        },
        {
            path: '/info',
            name: 'Info',
            component: () => import('../views/info.vue')
        },
    ]
})
3.视图处理
<template>
    <router-view v-slot="{ Component }">
        <keep-alive :include="cachedList">
            <component :is="Component" :key="$route.fullPath" />
        </keep-alive>
    </router-view>
</template>
<script setup>
import { computed, watch } from 'vue';
import { useRoute } from 'vue-router';
import { useStore } from '@/stores/index';
let store = useStore();
let { addCachedList } = store;
let route = useRoute();
let cachedList = computed(() => store.cachedList);
// 监听路由变化 
watch(
    route,
    (val) => {
        const { name, meta: { keepAlive } } = val;
        if (name && keepAlive) { // 自动添加到缓存数组
            addCachedList(val);
        }
    },
    { immediate: true }
);
</script>
4.列表页逻辑
#list.vue
<script setup>
import { onBeforeRouteLeave } from 'vue-router';
import { useStore } from '@/stores/index';

let { delCachedViews } = useStore();
onBeforeRouteLeave((to, from, next) => {
    const names = ['Info'];
    if (!names.includes(to.name)) {
        delCachedViews(from); //移除缓存
    }
    next();
});
</script>

补充:

在这里插入图片描述
但下面场景会生成一样的 name ,此时需要自定义 name
在这里插入图片描述

自定义name的方式
方式一:新增 script标签
<script>
  export default {
    name: 'HomePage'
  }
</script>
方式二: 利用unplugin-vue-define-options/vite
#安装
npm i unplugin-vue-define-options -D

#vite 配置
import DefineOptions from 'unplugin-vue-define-options/vite';
export default defineConfig({
	...
	plugins: [
	   ...
	   DefineOptions(),
	   ...
	]
})

#组件内使用
<script setup>
defineOptions({
    name: 'HomePage'
});
</script>
方式三:利用vite-plugin-vue-setup-extend
#安装
npm i vite-plugin-vue-setup-extend -D

#vite
import { defineConfig, Plugin } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueSetupExtend from 'vite-plugin-vue-setup-extend'

export default defineConfig({
  plugins: [vue(), vueSetupExtend()],
})

#组件内使用
<template>
  <div>hello world {{ a }}</div>
</template>

<script lang="ts" setup name="App">
  const a = 1
</script>

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

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

相关文章

校园课表微信小程序全栈项目

遇到的第一个问题关于npm start 首先找到对应的后端项目 crtl shift (esc键下的波浪号) 召唤终端 Error:Cannot find module dotenv 解决问题: npm install dotenv 简写 npm i dotenv 然后遇到第二个问题 Port 3000 is already in use 我的3000接口被占用 那就要去检…

【直到用了Tabby这款开源好用的终端工具,直接和Xshell、Putty、FinalShell告别】

&#x1f680; AI破局先行者 &#x1f680; &#x1f332; AI工具、AI绘图、AI专栏 &#x1f340; &#x1f332; 如果你想学到最前沿、最火爆的技术&#xff0c;赶快加入吧✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;CSDN-Java领域优质创作者&#x1f3c6;&am…

红队攻击:初始访问

聆听你的声音 如果你有独到的想法和建议&#xff0c;欢迎私信与我一同分享&#xff01; 公众号&#xff1a;安全攻防渗透 0x01 windows-多账户同时登陆 描述 攻击者可能会获取并滥用本地帐户的凭据&#xff0c;以获取初始访问权限&#xff0c;持久性&#xff0c;权限提升或…

未设置Strict-Transport-Security响应头【原理扫描】

IIS环境检测到网站存在响应头缺失漏洞解决办法: 1.webconfig中添加响应头 <?xml version"1.0" encoding"UTF-8"?> <configuration><system.webServer><directoryBrowse enabled"false" /><httpProtocol><cu…

Elasticsearch 8.8.1安装及启动

华为云的镜像去下载 ElasticSearch: https://mirrors.huaweicloud.com/elasticsearch/?CN&OD logstash: https://mirrors.huaweicloud.com/logstash/?CN&OD kibana: https://mirrors.huaweicloud.com/kibana/?CN&OD 原文链接&#xff1a;https://blog.csdn.ne…

AI加速财务智能化,实在智能、优贲财税、楚云科技共探数字员工新未来

作为财务发展的最新前沿&#xff0c;智能财务正在逐步渗入日常工作中&#xff0c;加快企业数字化转型步伐&#xff0c;促进我国财务信息化建设的快速发展。在当前形势下&#xff0c;企业应如何进行数字化转型以重塑业务、财务和税务等关系&#xff0c;形成管理闭环&#xff0c;…

注解和反射03(Java)

#拓展开题&#xff1a; 类的加载与ClassLoader的理解 什么时候会发生类初始化&#xff1f; 类加载器的作用 动态创建对象执行方法 有了Class对象&#xff0c;能做什么&#xff1f; newInstance()是一个Java中使用反射创建对象实例的方法&#xff0c;通过该方法可以获取类的构…

智能物流监控系统的数据平台技术研究

完整资料进入【数字空间】查看——baidu搜索"writebug" 1.1 项目背景 物联网技术是利用传感器嵌入各种末端设备&#xff0c;通过无线或有线网络接入互联网以实现人与物、物与物实时互联的新兴技术[1]。 智能物流监控系统是在物流量越来越大、物流价值越来越贵重的背…

【Distributed】zookeeper+kafka的应用及部署

文章目录 一、zookeeper1. zookeeper的概述1.1 Zookeeper 定义1.2 Zookeeper 工作机制1.3 Zookeeper 特点1.4 Zookeeper 数据结构1.5 Zookeeper 应用场景1.6 Zookeeper 选举机制第一次启动选举机制非第一次启动选举机制选举Leader规则 2. 部署 Zookeeper 集群2.1 安装前准备2.2…

MySQL数据库表数据的基本操作

目录 1.创建表 2.插入数据 3.修改表数据 3.1、将所有员工薪水修改为5000元 ​3.2、将姓名为张三的员工薪水修改为3000元 ​3.3、将姓名为李四的员工薪水修改为4000元gender改为女 ​3.4、将王五的薪水在原有基础上增加1000元 4、MySQL字符集 1.创建表 创建员工表emplo…

【技巧】Latex在线工具:公式编辑器、表格编辑器

找到什么再补充 目录 表格编辑器 公式编辑器 表格编辑器 https://www.tablesgenerator.com/ 公式编辑器 https://www.latexlive.com/

数据库开发和数据库管理有什么区别?

数据库开发&#xff08;Database Development&#xff09;和数据库管理&#xff08;Database Administration&#xff09;是数据库领域中的两个关键角色和职责。 我这里刚好有嵌入式、单片机、plc的资料需要可以私我或在评论区扣个6 数据库开发人员专注于以下方面&#xff1a…

windows安装gitlab-runner提交gitlab自动打包maven包

运行环境&#xff1a; 私服gitlab,想使用gitlab的ci/cd自动打包&#xff0c;不需要将打好的包部署到远程服务器而是保存在本地的&#xff0c;可以在本地安装gitlab-runner,打好的包直接在本地生成 本地是window环境 1 本地安装maven https://maven.apache.org/download.cgi …

Python批量对word文件重命名

一、背景 在日常工作或学习中&#xff0c;我们可能会遇到需要对大量的 Word 文件进行重命名的情况。手动一个一个修改文件名费时费力&#xff0c;而编写一个 Python 脚本则可以自动化完成这个任务&#xff0c;提高效率。 二 、开发环境 为了实现批量对 Word 文件进行重命名的功…

leaflet在天地图上添加poi兴趣点

前言 书接上节&#xff0c;在上一篇博客加载的天地图的基础上&#xff0c;加载poi兴趣点。 上节传送&#xff1a;使用leaflet在html中加载天地图且去掉左上角的缩放图标以及右下角的logo 一、加载poi的方法 leaflet通过 L.marker 方法用来加载poi&#xff0c;我们只需填入p…

嵌入式Linux领域中的C++:应用层主力与挑战

嵌入式Linux领域中&#xff0c;C是应用层的主要编程语言之一。尽管QT/C在某些领域被Android/Java逐渐替代&#xff0c;但在医疗、工控、车载导航等领域仍占主导地位。对于嵌入式人员学习C的观点存在一定片面性。C的难点在于移动语义、模板偏特化、lambda表达式、模板元编程等知…

Unity实现全景图

1.前言 实现全景查看有两种方式&#xff0c;一种是创建天空盒&#xff0c;另外一种是全景图渲染到一个球形上&#xff0c;从内球内部看。两者都可以用天空盒材质Skybox实现。 2.创建天空盒材质 先创建一个材质球命名为Sky&#xff0c;在 Shader 下拉选单中&#xff0c;单击 Sk…

视觉算法知识荟萃

文章目录 视觉算法知识荟萃视觉算法八股手写卷积Delta KAbs RelRMSESilogVNLSoftMaxCrossEntropySwin-TransformerTransformerAdam&#xff0c;SGD如何修改SGD&#xff0c;使其不陷入局部最小值 NMSSoftNMS 边缘检测算法SobelLaplacianCanny Pooling Layer手写 Pooling LayerPo…

OpenGauss ustore查询过程的流程

查询流程&#xff1a; 以 Select c2 from tb1 where c1 1为例&#xff1a; 1、根据索引找到TID(1,2)的元组指针&#xff0c;即linePointer。 2、计算其事务xid是否可见&#xff0c;在Map中计算其csn和快照csn的大小关系。 3、如果大于快照CSN&#xff0c;那么不可见&#xff0…

智能仪表在铁塔行业应用 安科瑞 许敏

应用场景 可应用于基站的交直流配电箱及对基站内的动力设备进行数据采集和控制。 功能 1. 对多个回路进行全电参量测量&#xff0c;实现基站内各回路用电能耗的集中管理&#xff1b; 2. 丰富的DI/DO输入输出&#xff0c;NTC测温&#xff0c;温湿度测量等非电参量监测&#x…