使用keep-alive缓存页面 并解决三级菜单不能缓存的问题

直接展示代码
1.把含有3级router-view的文件改为

<template>
    <router-view />
</template>
<script>
export default {
  name: 'Blank'
}
</script>

2
1). 需要把所有页签存在vuex中,可以参考vue-element-admin项目中store有个tagsView.js文件
2). 在AppMin.vue文件中,如图加上这两句

image.png

 <keep-alive :include="cachedViews">
        <router-view :key="key" />
      </keep-alive>



cachedViews() {
      // console.log(this.$store.state.tagsView.cachedViews,'this.$store.state.tagsView.cachedViews')
      return this.$store.state.tagsView.cachedViews
    },

3.在全局路由守卫中加上这段代码:(仅仅只是满足三级菜单缓存)

image.png
if (to.matched && to.matched.length > 2) {
   for (let i = 0; i < to.matched.length; i++) {
     const element = to.matched[i]
     if (element.components.default.name === 'Blank') {
       to.matched.splice(i, 1)
     }
   }
 }

这时会出现一个问题
1.刷新页面后,首次切换页面并没有保存状态,切换后再回来操作才能保存.

解决方法
用数组存放需要保存功能的二级页面名称,只要三级路由结构的路由中含有这些名称,就把三级路由结构中的二级路由手动删除.

//saveBlankPages是拥有三级菜单的二级菜单名称合集
//我拿取这个数据是在src\components\Breadcrumb这个目录下,找到所有的二级菜单缓存起来
 if (to.matched && to.matched.length > 2) {
        for (let i = 0; i < to.matched.length; i++) {
            const element = to.matched[i]
            const Index = saveBlankPages.findIndex((item) => {return item === element.name})
            if (Index>=0) {
                to.matched.splice(i, 1)
            }
        }
    }

原文参考:https://blog.csdn.net/weixin_46995731/article/details/123665776

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容