首页 > 其他分享 >适用于react、vue菜单格式化工具函数

适用于react、vue菜单格式化工具函数

时间:2024-07-12 15:52:18浏览次数:19  
标签:vue 格式化 component react 菜单 routes path 路由 const

场景

在一个动态菜单场景中,你向接口获取树形菜单,但最后拿到的树未能达到你的预期,这个时候就需要手写递归重新处理这颗树

适用于react、vue菜单格式化工具函数

包含功能

1. 当前路由是否存在返回按钮

判断逻辑:只要存在左侧可点击的菜单都不具备返回按钮,其他则具有返回按钮

2. 错误路由过滤提醒

假设有这么一个菜单

const router = [
  {
    path: '/test',
    children: [
      {
        path: '/test/page2',
      },
      {
        path: '/otest/page2',
      },
    ],
  },
];

可以看到`/otest/page2`属于无效路由,在react中,这可是致命错误,将破环整个项的运行

这个工具则可以过滤出这种错误路由,并且给出对应提示

3. 递归获取当前菜单下的可用路由

 

解释一下这种布局,顶部一级菜单,左侧二级菜单

当用户点击顶部菜单时,展示左侧菜单并选中第一个二级可用菜单,正常情况下其实用户点击了顶部菜单是无法知道二级菜单哪个菜单是可用的

因为二级里面还包含二级,正常应该获取二级菜单里面存在组件的菜单

 

上工具代码

/**
 * @desc 获取动态菜单中第一项可用菜单
 * 正常情况第一项可用菜单就是路由第一个路由中的二层嵌套的第一项菜单
 * */

export const firstAvailableRouter = (routes) => {
  const [router] = routes;
  if (!router?.component && router?.children?.length && !router.redirect) {
    return firstAvailableRouter(router.children);
  } else {
    return router;
  }
};

/**
 *  格式化菜单树
 * @param tree {Array} 树形菜单
 * @param parent {Array} 递归时做为临时存储用
 * */
export const formatTreeMenu = ({
  tree = [],
  parent = []
}: {
  tree: Record<string, any>[];
  parent?: Record<string, any>;
}) => {
  if (!tree || !Array.isArray(tree)) {
    return [];
  }
  /** 先检查所有子集是否都满足要求 */
  const filteredTree = tree
    .filter((item) => item.path)
    .filter((item) => {
      const parentPath = parent.path || '/';
      const hasErrorRouter = parentPath && !item.path.startsWith(parentPath);
      if (hasErrorRouter) {
        console.warn(`路由:'${item.path}'配置错误,已被过滤`);
      }
      return !hasErrorRouter;
    });
  return filteredTree.map((node) => {
    const {
      title,
      layout = undefined,
      routes,
      hideInMenu = false,
      path,
      icon,
      component,
      id
    } = node;
    const hasBack = parent.path === path ? parent.hideInMenu : hideInMenu;
    const firstUsefulRoute =
      firstAvailableRouter({ routes, childrenKye: 'routes' }) || {};
    const formattedNode: Record<string, any> = {
      path,
      name: title,
      layoutWrap: layout,
      hideInMenu,
      roles: ['admin'],
      hasBack,
      component,
      id,
      firstUsefulRoute //第一个有用路由
    };
    if (icon) {
      formattedNode.icon = icon;
    }
    if (Array.isArray(routes) && routes.length > 0) {
      formattedNode.children = formatTreeMenu({
        tree: routes,
        parent: node
      });
    }
    return formattedNode;
  });
};

 

测试数据

const router = [
  {
    name: 'portalRegist',
    path: '/portalRegist',
    hideInMenu: true,
    layout: false,
    component: './pages/Portal/regist',
    children: [
      {
        path: './',
        redirect: 'readme',
      },
      {
        path: '/portalRegist/:id',
        component: './pages/Portal/regist/readme',
      },
      {
        name: 'portalReadme',
        path: '/portalRegist/readme/:id',
        component: './pages/Portal/regist/readme',
      },
      {
        name: 'portalAuth',
        path: '/portalRegist/auth/:id',
        component: './pages/Portal/regist/auth',
      },
    ],
  },
  {
    path: '/carbon/greenCompliance/energyUsage',
    name: 'xx',
    component: './pages/GreenCompliance/EnergyUsage',
    hideInMenu: true,
  },
];

 

标签:vue,格式化,component,react,菜单,routes,path,路由,const
From: https://www.cnblogs.com/yz-blog/p/18298572

相关文章

  • 图标组件的封装与管理(React/svg)
    一概要1.1背景最近在项目中使用了很多从iconfont拿到的图标。使用官网的导入方法有些繁琐,也不易管理。于是捣鼓了一下...1.2目的能够像组件一样使用,具有规范性。比如暴露一个type属性,根据不同的type使用不同的主题色。高自由度。可以直接在项目中管理图标,只需要处理从其......
  • 前端使用 Vue 3,后端使用 Spring Boot 构建 Hello World 程序
    前端使用Vue3,后端使用SpringBoot构建HelloWorld程序前端(Vue3)首先,创建一个Vue3项目。1.安装VueCLInpminstall-g@vue/cli2.创建Vue项目vuecreatefrontend在交互式提示中,选择默认的Vue3预设。3.修改App.vue在frontend/src目录下,修改......
  • 基于SpringBoot+Vue+数据可视化的药品商场购物系统设计和实现(源码+LW+部署讲解)
    博主介绍:✌全网粉丝50W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、P......
  • 毕业设计-基于Springboot+Vue的招生管理系统的设计与实现(源码+LW+包运行)
    源码获取:https://download.csdn.net/download/u011832806/89456200基于SpringBoot+Vue的招生管理系统开发语言:Java数据库:MySQL技术:SpringBoot+MyBatis+Vue.js工具:IDEA/Ecilpse、Navicat、Maven系统演示视频:链接:https://pan.baidu.com/s/1GwKRBbuwMiZmnxkvRN9VJg?pwd=sb......
  • 毕业设计-基于Springboot+Vue的致远汽车租赁系统的设计与实现(源码+LW+包运行)
    源码获取:https://download.csdn.net/download/u011832806/89456206基于SpringBoot+Vue的致远汽车租赁系统开发语言:Java数据库:MySQL技术:SpringBoot+MyBatis+Vue.js工具:IDEA/Ecilpse、Navicat、Maven系统演示视频:链接:https://pan.baidu.com/s/1IHfaizhpMI1q750DBZ1enA?pw......
  • 毕业设计-基于Springboot+Vue的智慧外贸平台的设计与实现(源码+LW+包运行)
    源码获取:https://download.csdn.net/download/u011832806/89456212基于SpringBoot+Vue的智慧外贸平台开发语言:Java数据库:MySQL技术:SpringBoot+MyBatis+Vue.js工具:IDEA/Ecilpse、Navicat、Maven系统演示视频:链接:https://pan.baidu.com/s/1PnEjpc6IXOgPmYxluTOr2g?pwd=kv......
  • Vue3中组件使用ref时获取组件类型推导
    本文由ChatMoney团队出品我们在使用Vue3+ts开发时,常常会用到一些第三方组件库,比如Element-PlusUI、NavieUI等,这些UI框架中有些组件常常会暴露一些方法给我们便捷的去实现各种复杂的交互,我们经常会像下面这样去给组件定义一个ref去获取组件的实例:<template><div><el-d......
  • Vue3中组件使用ref时获取组件类型推导
    本文由ChatMoney团队出品我们在使用Vue3+ts开发时,常常会用到一些第三方组件库,比如Element-PlusUI、NavieUI等,这些UI框架中有些组件常常会暴露一些方法给我们便捷的去实现各种复杂的交互,我们经常会像下面这样去给组件定义一个ref去获取组件的实例:<template><div><el-d......
  • vue 父子组件传值
    先说问题,在vue组件haul开发中,遇到了父组件往子组件传值的问题,父组件点击,子页面dialog不展示,注:这个问题浪费了我很长还见,网上找了一堆答非所问的答案都不行,记录一下父<template><v-myDialog:dialog_format="exampleDialogFormat":data_format="exampleDataFormat"......
  • vue js公共截取URL的key: value方法
    letURL=http://localhost:8080/#/ficu/?taskid=1001-2271023&pageId=146&ssid=74529457205982&channelld=IPCC&userId=xx//取值URLlethref=window.location.href//拿到完整的URLlethash=window.location.hash//取#后面的所有URL//取值方法getUrlPara......