解决keep-alive同一个组件不缓存问题

 更新时间:2024年02月11日 11:00:09   作者:_jeneen  
这篇文章给大家介绍了如何解决keep-alive同一个组件不缓存问题,文中通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下

问题描述

发现左侧菜单打开的路径和组件不同时
即如下配置的 User.vueLogin.vue 这两个页面时,keep-alive会生效,但是 切换到 /app/1/false就不会进行缓存。
在各组件中的生命周期加上打印信息,包括 activated, deactivated

// 路由配置
{  // tab3
  path: '/user',
  name: 'User',
  component: () => import('../User.vue'),
},
{
  path: '/',
  name: 'Login',
  component: () => import('../Login.vue'),
},
{ // tab1, tab2
  path: '/app/:id/:single',
  name: 'App',   // 实际每个菜单的 name  和 path 一样
  component: () => import('../App.vue'),
},

// 绿色框组件中
<transition name="fade-transform" mode="out-in">
    <el-main>
      <keep-alive :include="cachedTags">
        <router-view :key="key" />
      </keep-alive>
    </el-main>
  </transition>

get cachedTags() {
    return TagsViewModule.cachedTags  即 // 菜单的 name 的组合
  }

  get key() {
    return this.$route.path
}
菜单namepath
tab1/app/1/false/app/1/false
tab2/app/2/false/app/2/false
tab3/user/user
操作:点击顺序
1->2->3->2->3
// 打印如下
created in App.vue
mounted in App.vue
id: 2 // 切换 tab2 时,数据发生变化
created in User.vue // 切换 tab3 
mounted in User.vue
activated in User.vue
created in App.vue  // 切换 tab2 
deactivated in User.vue  
mounted in App.vue
activated in User.vue  // 切换 tab3

// cachedTags : [ '/user',  '/app/1/false',  '/app/2/true' ]

tab3第一次进入时会触发 created, 之后每次切换都是走 activated钩子,其缓存了搜索输入;
在 tab1->tab2时只根据路由中的 id信息进行了响应式变化操作,tab3 -> tab2时,又重新渲染了 App.vue组件

解决方案

针对 带 附带信息的路由的 name进行统一处理。

// 处理后 cachedTags : [ 'User', 'App' ]
const viewName = this.$route.name
if (view.name.startsWith('app/')) {
  viewName = 'App'  // 注意要与 App.vue 组件里的 name 一致
}
// 缓存依据于 router name
if (viewName === null) return
if (this.cachedTags.includes(viewName)) return
this.cachedTags.push(viewName)

问题分析/总结

看到这个解决办法,应该考虑就是 keep-alive对 includes中的哪些才能生效的问题?
找到 keep-alive源码查看( .\node_modules\vue\src\core\components\keep-alive.js)

即要 includes内的数据和组件的 name配置对比进行的缓存的操作。

到此这篇关于解决keep-alive同一个组件不缓存问题的文章就介绍到这了,更多相关keep-alive同一个组件不缓存内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Vue3.0中ElementPlus<input输入框自动获取焦点>

    详解Vue3.0中ElementPlus<input输入框自动获取焦点>

    这篇文章主要给大家介绍了关于Vue3.0中ElementPlus<input输入框自动获取焦点>的相关资料,文中通过实例代码介绍的非常详细,对大家学习或者使用vue3.0具有一定的参考学习价值,需要的朋友可以参考下
    2023-04-04
  • vue时间组件DatePicker组件的手写示例

    vue时间组件DatePicker组件的手写示例

    这篇文章主要为大家介绍了vue时间组件DatePicker组件的手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Vue密码登陆加密RSA实现方案

    Vue密码登陆加密RSA实现方案

    这篇文章主要介绍了Vue密码登陆加密RSA实现方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Vuex 模块化使用详解

    Vuex 模块化使用详解

    这篇文章主要介绍了Vuex 模块化使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Vue中如何给Window对象添加方法

    Vue中如何给Window对象添加方法

    这篇文章主要介绍了Vue中如何给Window对象添加方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • vue3 实现右键菜单编辑复制粘贴功能

    vue3 实现右键菜单编辑复制粘贴功能

    在浏览器中,Vue3编辑器自带默认右键菜单,然而,在Electron桌面应用中,这一功能需自行编写代码实现,本文详细介绍了如何在Vue3中手动实现右键菜单的编辑、复制、粘贴功能,并提供了代码示例,更多细节和相关教程可参考脚本之家的其他文章
    2024-10-10
  • 关于vue项目部署后刷新网页报404错误解决

    关于vue项目部署后刷新网页报404错误解决

    这篇文章主要介绍了关于vue项目部署后刷新网页报404错误解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • 详解vue如何给特殊字段设置插槽

    详解vue如何给特殊字段设置插槽

    这篇文章主要为大家详细介绍了vue如何实现给特殊字段设置插槽,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以学习一下
    2023-09-09
  • 一文带你上手vue3中的pinia

    一文带你上手vue3中的pinia

    这篇文章主要以vue3+vite+ts举例,为大家详细介绍了vue3中pinia的安装与使用,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-09-09
  • vue实力踩坑 当前页push当前页无效的解决

    vue实力踩坑 当前页push当前页无效的解决

    这篇文章主要介绍了vue实力踩坑 当前页push当前页无效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04

最新评论