vue多级路由使用keep alive无法缓存

在这里将他二级以上的路由扁平化即可

路由规则:

复制代码
 
import Layout from '../components/Layout/index.vue'
import COM from '../components/index.vue'
{
        path:'home'',
        name:'home',
        component:Layout,
        children:[
            {
                path:'/index',
                name:'index',
                component:COM,
                children:[
                    { path:'menu',
                    name:'menu',
                    component:()=>import('@/views/menu/index.vue'),
                    meta:{
                        title:"menu",
                        icon:'',
                        affix: true,  // 加入保护
                        keepAlive:true,
                    }
                    },
                    { path:'/role',
                    name:'role',
                    component:()=>import('@/views//role/index.vue'),
                    meta:{
                        title:"role",
                        icon:'',
                        affix: true,  // 加入保护
                        keepAlive:true,
                    }
                    }
                ]
            }
        ]
    }
复制代码

然后/components/index.vue中写入

复制代码
<template>
  <div>
     <router-view />
  </div>
</template>

<script>
export default {
 name: 'index'
}
</script>

<style>

</style>
复制代码

定义拍扁方法

复制代码
const handleKeepAlive = (to) => {
    // 判断目标路由记录是否大于2
    if (to.matched && to.matched.length > 2) {
      // 遍历路由记录,制作面包屑导航列表,并删除依赖于AppMain组件的中间路由,实现路由扁平化
      for (let i = 0; i < to.matched.length; i++) {
        const element = to.matched[i]
        // /* 从这里开始处理面包屑 */
        // if (to.meta.breadcrumb && element.name !== 'index') {
        //   ;(to.meta.breadcrumb).push({
        //     name: element.name,
        //     label: element.meta.label,
        //     type: element.meta.type
        //   })
        // }
        // if (!to.meta.breadcrumb) {
        //   to.meta.breadcrumb = []
        // }
        // /* 从这里结束处理面包屑 */
        if (element.components.default.name === 'index') {
            
           let data= to.matched.splice(i, 1)
           console.log(data);
          handleKeepAlive(to)
        }
      }
    } else {
      // 当路由已经扁平化完毕的时候,将目标路由自身加入面包屑中
      /* 从这里开始处理面包屑 */
    //   const toBreadcrumb = to.meta.breadcrumb
    //   if (!toBreadcrumb) return
    //   const isToInToBreadcrumb = toBreadcrumb.some(
    //     (item) => item.name === to.name
    //   )
    //   if (!isToInToBreadcrumb) {
    //     ;(to.meta.breadcrumb).push({
    //       name: to.name,
    //       label: to.meta.label,
    //       type: to.meta.type
    //     })
    //   }
      /* 从这里结束处理面包屑 */
    }
  }
复制代码

然后在前置守卫中执行拍扁方法

router.beforeEach(async (to, from, next) => {
handleKeepAlive(to)
)}

至此,就可以缓存了

posted @   龙丶谈笑风声  阅读(585)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示