完美解决vue3 keep-alive多个路由使用同一个组件的缓存问题

news/2024/10/19 2:20:11/

之前页面少的话 用keep-live结合router-view,使用keep-live的include属性就可以自己决定keep-live缓存那些组件不缓存那些组件,直到遇到个问题。

平时写的代码如下:

    <router-view v-slot="{ Component, route }"><keep-alive :include="[...visitedViewPaths]"><component :is="Component"/></keep-alive></router-view>

其中 visitedViewPaths表示的是一个放Component name的数组,可以去看文档 https://cn.vuejs.org/guide/built-ins/keep-alive.html#include-exclude

如果配置的路由A用A组件,路由B用A组件,因为include属性是靠组件的name来决定缓存与不缓存的,还有这种情况,路由里配置的{ path: ‘/users/:id’, component: User },这样的配置也是多个路由使用同一个组件的情况,现在这种路由对应的组件实例name是相同的,这就不好处理了,想到的解决方案如下:

    <router-view v-slot="{ Component, route }"><keep-alive :include="[...visitedViewPaths]"><component :is="formatComponentInstance(Component,route)"/></keep-alive></router-view>function formatComponentInstance(){component.type = {...component.type,name:route.path,};return component;}

为什么要这么写,因为主要原因就是改个name的嘛,component.type放的是该组件对象,不能直接改,两个component.type所指向的对象是同一个,所以用一个新对象来。
以为解决了,结果报错,报啥错就不说了,我觉得应该是vue用那个弱引用map把组件对象当作key,存了一个其他数据,对象变了就取不到该数据了。
以为没法解决了,结果百度到了一个方法完美解决 https://blog.csdn.net/qq_42611074/article/details/127206469

思路还是一样,改组件name,这次不是改原组件name,直接新建一个组件出来,如下:

<router-view v-slot="{ Component, route }"><keep-alive :include="[...visitedViewPaths]"><component :is="formatComponentInstance(Component,route)"/></keep-alive>
</router-view>// 用来存已经创建的组件
const wrapperMap = new Map();
// 将router传个我们的组件重新换一个新的组件,原组件包里面
function formatComponentInstance(component, route) {let wrapper;if (component) {const wrapperName = route.path;if (wrapperMap.has(wrapperName)) {wrapper = wrapperMap.get(wrapperName);} else {wrapper = {name: wrapperName,render() {return h(component);},};wrapperMap.set(wrapperName, wrapper);}return h(wrapper);}
}

其中 visitedViewPaths 是你自己的需要缓存的name列表,现在组件名字由你控制了,就已经解决了
多谢原文章大佬,https://blog.csdn.net/qq_42611074/article/details/127206469
总算是解决了这个疑难问题哇


http://www.ppmy.cn/news/89842.html

相关文章

java面试应聘时的满分回答参考模板

java面试应聘时的满分回答参考模板 1、请你自我介绍一下自己好吗?2、你觉得你个性上最大的优点是什么?3、说说你最大的缺点?4、你对薪资的要求?5、你对加班的看法?6、如果通过这次面试我们录用了你,但工作一段时间却发现你根本不适合这个职位,你怎么办?7、谈谈你对跳槽…

第3章 单元测试-测验题-作业

在单元测试中&#xff0c;&#xff08;B &#xff09;是用来代替被测模块的子模块的。 驱动模块桩模块通讯模块代理模块在下面列举的测试覆盖中&#xff0c;&#xff08;D &#xff09;是最强的逻辑覆盖准则。 语句覆盖条件覆盖判定覆盖条件组合覆盖一个判定中的复合条件表达式…

【A卡,Windows】stable diffusion webui下载安装避坑指南

观前提醒 本文内容都是本人亲身经历的&#xff0c;一个一个安装下载测试所感&#xff0c;当然如果你更想用傻瓜式集成包的&#xff0c;那还是跳过这篇文章吧。 当然我不推荐这篇文章的操作&#xff0c;因为我用了差不多1h才有一副图&#xff0c;有N卡&#xff0c;就用N卡&…

零基础如何入门网络安全?2023年专业学习路线看这篇就够了

前景 很多零基础朋友开始将网络安全作为发展的大方向&#xff0c;的确&#xff0c;现如今网络安全已经成为了一个新的就业风口&#xff0c;不仅大学里开设相关学科&#xff0c;连市场上也开始大量招人。 那么网络安全到底前景如何&#xff1f;大致从市场规模、政策扶持、就业…

RockChip3568 MPP硬解码和gstreamer1.0编译

MPP视频硬件解码编译 一、配置rock sdk的环境 当前使用的rockchip 给的rk3568的sdk包&#xff0c;版本不详&#xff0c;应该比较新。 编译前配置环境&#xff1a; source envsetup.sh 选择rk3568配置 &#xff08;67 rockchip_rk3568&#xff09;注意&#xff1a; 每次在s…

内网渗透(八十四)之ADCS配置启用基于SSL的LDAP(LDAPS)

ADCS配置启用基于SSL的LDAP(LDAPS) 打开AD CS,选择证书颁发机构 选择证书模板,右键管理 选择Kerberos身份验证,右键 复制模板 然后会有一个Kerberos身份验证的副本,右键更改名称,更改为LDAPS 选择LDAPS,右键属性 设置模板属性,请求处理——>允许导出私钥(O) 创建证书…

基于中序有序的二叉搜索树

文章目录 什么是二叉搜索树二叉搜索树的中序遍历二叉搜索树的查找查找的非递归写法查找的递归写法 二叉搜索树的插入非递归递归 二叉搜索树的删除非递归递归 二叉搜索树的使用场景k模型kv模型 什么是二叉搜索树 二叉搜索树是普通二叉树的升级&#xff0c;普通二叉树除了存储数…

PB 的 error.number 列表

PB 的 error.number 列表string ls_msg choose case error.numbercase 1//by zerols_msg = "发生被 0 除错误"case 2//2 Null object reference ls_msg = "空对象引用"case 3//3 Array boundary exceeded ls_msg = "数组越界"case 4//4 Enumera…