补充 vue3用户管理权限(路由控制)

有人问我二级路由3级路由是如何添加的,我这里大概说一下吧,我们添加动态路由的时候,最好是在路由上添加meta内容,里面写入我们的该路由的父路由的name信息,(一级路由写就可以了),如下图

const routerlist = [
  {
    path: "/defa",
    name: "defa",
    component: () => import("@/views/DefaCat.vue"),
    meta:"home", //写入父路由的name信息。这里的意思就是把这个路由归置到home路由下边
    children: [
      {
        path: "/defa/fase1",
        name: "homelist1",
        component: () => import("@/views/UserZi.vue"),
        meta:"defa",
        children:[
          {
            path: "/defa/fase1/fase3",
            name: "homelist4",
            component: () => import("@/views/ComData.vue"),
            meta:"homelist1",
          }
        ]
      },
    ],
  },
  {
    path: "/defa/fase2",
    name: "homelist2",
    component: () => import("@/views/UserZi.vue"),
    meta:"home",
  },
];

我这里写了一个处理函数,假设后端返回给我们的是一个这个的路由权限数组["/defa","/defa/fase1","/defa/fase1/fase3"]  按照之前的逻辑是,这个数组会存放在vuex当中,我这里就是在路由前置守卫这里获取到vuex的里的路由表,然后在通过我下方的这个处理函数,将动态路由表里如果匹配不上后端返回路由表里的数据的话,会将内容给剔除掉。代码如下:

const filterRoutes = (targetPaths:any, sourceRoutes:any) => {
  return sourceRoutes.map((route:any) => {
    const filteredChildren = route.children
      ? filterRoutes(targetPaths, route.children) // 递归处理子路由
      : [];

    return {
      ...route,
      children: filteredChildren,
    };
  }).filter((route:any) => route.children.length > 0 || targetPaths.includes(route.path));
};

在调用,循环,依次传入addrouter里即可,处理函数filterrouter第一个接收的参数是后端传入的路由数组,第二个参数是我们的动态路由,我们不仅路由这里需要处理函数,在我们导航栏那里,也需要我们的处理函数将动态路由处理完后在进行递归渲染我们的导航栏

    filterRoutes(arrlist,routerlist).map((item: any) => {
        router.addRoute(item.meta,item); //这里的第一个参数是我们要添加路由的父路由,这个会把我们的路由归属到第一个参数的路由下面,第一个参数是父路由的name属性  
      
    });

第二种解析办法,稍微简单点

const filterRoutes=(router:any,role:any)=>{
  return router.filter((item:any)=>{
    return role.indexOf(item.path)!=-1;
  }).map((item:any)=>{
    if(item.children){
      item.children=filterRoutes(item.children,role)
    }
    return item
  })
}

也是利用了递归的方法,对一个数字进行数据筛选,这里给大家分段解释下。代码都是死的,主要是思路和想法,以想法来驱动代码。

const filterRoutes=(router:any,role:any)=>{  //1.接收一个路由数据和权限数组
  return router.filter((item:any)=>{  //2.这里首先对第一层的数据进行修改 这里使用了filter方法,这个犯法是判断回调函数里的return是否是true如果是true,则保留当前循环到的哪一个数组,如果不是则不保留
    return role.indexOf(item.path)!=-1;  //3.通过indexof来判断,路由表里的path是否在role里,如果在的话返会一个具体的下标,如果不在则返回-1,这里是当不等于-1时就将筛选的数据添加进去
  }).map((item:any)=>{  //4.这里把第一层的路由表筛选完后,这时候就要筛选第二层了
    if(item.children){ //5.这里判断是否有子路由
      item.children=filterRoutes(item.children,role) //6.这里使用递归,将子路由筛选过的数据给重新赋值给子路由。将子路由的数据表筛传入函数,然后在重新执行筛选子路由,然后在将清洗后子路由的数据给赋值给当前路由的itrm.childer选项
    }
    return item //6.然后将筛选过的数据继续循环调用
  })
}

拜拜

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

香蕉麻花皮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值