模拟根据后端返回列表数据,先包装成树结构,包装路由数据格式。

1.后端接口返回的数据格式

 dataList: [
        { id: 2, pid: 0, path: "/course", name: "Course", title: "课程4管理" },
        {
          id: 3,
          pid: 2,
          path: "course",
          name: "Course1",
          title: "课程4管理",
          link: "/course/c22"
        },
        { id: 5, pid: 2, path: "/course", name: "Course", title: "课程33管理" },
        {
          id: 6,
          pid: 0,
          path: "/student",
          name: "Course1",
          title: "xues管理",
          link: "/course/c3"
        },
        {
          id: 7,
          pid: 6,
          path: "operate",
          name: "Course333",
          title: "课1程管理"
        },
        {
          id: 8,
          pid: 6,
          path: "add",
          name: "Course1",
          title: "课程23管理",
          link: "/course/c12"
        }
      ]

2.先包装成树,再包装成路由格式。

    function returnTree(data) {
      let parents = data.filter(item => item.pid === 0),
        children = data.filter(item => item.pid !== 0);
      toTree(parents, children);
      function toTree(parents, children) {
        parents.map(p => {
          children.map((c, i) => {
            if (c.pid === p.id) {
              let _c = JSON.parse(JSON.stringify(children));
              _c.splice(i, 1);
              toTree([c], _c);
              if (p.children) {
                p.children.push(c);
              } else {
                p.children = [c];
              }
            }
          });
        });
      }
      return parents;
    }
    
    let treeList = returnTree(this.dataList);
    
    function generateRouter(data) {
      let newRoutes = data.map(r => {
        let routes = {
          path: r.path,
          name: r.name,
          component: () => import(`@/views/${r.name}`)
        };
        if (r.children) {
          routes.children = generateRouter(r.children);
        }
        return routes;
      });
      return newRoutes;
    }

    let userRoutes = generateRouter(treeList);
    
    console.log(userRoutes)
    

3.补充说明或总结

  1. 如果后端直接返回的菜单已经是树结构,以上代码可只取包装路由的部分。
  2. 以上代码定义的变量,方法,参数,根据自己代码修改。
  3. 源数据只要知道id和pid关系(父子关系),就能包装成树形。
  4. 可以学习递归用法,也可以是vue项目,动态菜单-动态路由的某个环节。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值