vue中keep-alive组件实现多级嵌套路由的缓存
现状(问题):
keep-alive 组件对第三级及以上级的路由页面缓存失效
探索方案:
方案1、直接将路由扁平化配置,都放在一级或二级路由中
方案2、再一层缓存组件用来过渡,并将其name配置到include中
实现方式
方案1不需要例子,按规则配置路由就行重点介绍方案2
因为我用了vue-element-admin做了架构,并且项目中我将菜单和路由全部通过服务端返回做了统一配置,所以我只能用方案2来实现。
直接看原有代码(问题代码)
// src/layout/component/AppMain.vue
<template>
<section class="app-main">
<transition name="fade-transform" mode="out-in">
<keep-alive :include="cachedViews">
<router-view :key="key" />
</keep-alive>
</transition>
</section>
</template>
<script>
export default {
name: 'AppMain',
computed: {
cachedViews() {
return this.$store.state.tagsView.cachedViews
},
key() {
return this.$route.path
}
}
}
</script>我从后端那到数据后,根据树形结构做了处理(在store里写的,只展示出关键代码)
// 拿到数据先循环第一层将Layout付给组件
generateRoutes({ commit }, routeList) {
return new Promise(resolve => {
routeList.forEach(items => {
items.component = Layout
// 如果有子菜单直接再循环赋值
items.children = changeAsyncRoutes(items.children)
})
commit('SET_ROUTES', routeList)
resolve(routeList)
})
}
function changeAsyncRoutes(routes) {
const res = []
routes.forEach(route => {
const tmp = { ...route }
if (tmp.children && tmp.children.length !== 0) {
// 若有子级 先创建router-view容器,再去递归(重点重点重点)
tmp.component = {
render: c => c('router-view')
}
tmp.children = changeAsyncRoutes(tmp.children)
} else {
// 没有子级菜单直接将component字符串解析成组件对象
tmp.component = importMethod(tmp.component)
}
res.push(tmp)
})
return res
}这种写法已经很完美了,可惜,我遇到了三级菜单不能缓存的问题
直接上解决问题的代码
1、新建MenuMain.vue组件如下
// src/layout/component/MenuMain.vue
// 提供多级菜单的容器
<template>
<keep-alive :include="cachedViews">
<router-view :key="key" />
</keep-alive>
</template>
<script>
export default {
name: 'MenuMain', // 必须命名
computed: {
cachedViews() {
return this.$store.state.tagsView.cachedViews
},
key() {
return this.$route.path
}
}
}
</script>2、将此容器取代处理数据时render的 router-view 容器
// 引入组件
import MenuMain from '@/layout/components/MenuMain'
function changeAsyncRoutes(routes) {
const res = []
routes.forEach(route => {
const tmp = { ...route }
if (tmp.children && tmp.children.length !== 0) {
// 注意看着里
tmp.component = MenuMain
// {
// render: c => c('router-view')
// }
tmp.children = changeAsyncRoutes(tmp.children)
} else {
tmp.component = importMethod(tmp.component)
}
res.push(tmp)
})
return res
}3、把store中的 cachedViews 数组中始终保存MenuMain组件的名称
cachedViews: ['MenuMain']
到此这篇关于vue中keep-alive组件实现多级嵌套路由的缓存的文章就介绍到这了,更多相关vue keep-alive多级嵌套路由缓存内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
使用Vue3和Echarts 5绘制带有立体感流线中国地图(推荐收藏!)
最近接到一个需求是做一个中国地图,下面这篇文章主要给大家介绍了关于如何使用Vue3和Echarts 5绘制带有立体感流线中国地图的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下2022-04-04
vueJs函数readonly与shallowReadonly使用对比详解
这篇文章主要为大家介绍了vueJs函数readonly与shallowReadonly使用对比详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-03-03
vue created钩子函数与mounted钩子函数的用法区别
这篇文章主要介绍了vue created钩子函数与mounted钩子函数的用法区别,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-11-11


最新评论