ant-design-pro 动态菜单-路由详解

ant-design-pro 动态菜单-路由详解
最近利用ant-design-pro开发项目要实现之前的项目嵌入到新项目里来,并且根据和后台的接口返回的数据显示侧边栏菜单。既然是是利用别人的架构那当然是从文档中找实现的方法,终于不负苦心人在https://pro.ant.design/docs/router-and-nav-cn文档那里找到初步的解决方法

进入src/layouts/Basilayout.js在官网中直接复制该代码,将原文件替换。
现在正式进入正题。

1,在src/layouts/Basilayout.js中利用connect与拉取菜单的models建立联系
我的是放在views的models下面所以代码如下
export default connect(({global, setting, views }) => ({
collapsed: global.collapsed,
layout: setting.layout,
…setting,
…views,
}))(BasicLayout);

2,在src/layouts/Basilayout.js中的生命周期函数componentDidMount里面调用拉取菜单的接口,
componentDidMount() {
const { dispatch } = this.props;
dispatch({
type: ‘views/fetch’,
});
}
我调取的是下面views.js里面的effects的fetch方法
至于model里面怎么写可以看官方文档https://pro.ant.design/docs/server-cn
这里是我写的一个views的model —(下面代码的关键字是getMenuMapArrData )

import { getMenuList } from ‘@/services/api‘
import { getMenuSessionData, getMenuMapArrData } from ‘@/utils/utils.js‘
export default {
namespace: ‘views‘,
state: {
datas: [],
urlValues: ‘https://boss.icarbonx.com/lims-ui/baselab/qcPaths/exception‘,
urlDatas: [],
},

effects: {
*fetch({ payload }, { call, put }) {
const response = yield call(getMenuList, payload);
console.log(response,‘得到列表‘)
yield put({
type: ‘save‘,
payload: response
})
},
*changeurl({ payload }, { call, put }){
yield put({
type: ‘change‘,
payload: payload
})
},
},

reducers: {
save(state, action) {
return {
...state,
datas: getMenuMapArrData(action.payload),
urlDatas: getMenuSessionData(action.payload),
}
},
change(state, action) {
return {
...state,
urlValues: action.payload,
}
},
}
}

3、getMenuList菜单接口返回的格式化,当然有些老铁直接就按照router.config.js的形式写的但是有些情况是后台人员返回的数据并不是这样这就需要我们格式化。
理想情况返回的数据是

[{
path: ‘/user‘,
component: ‘../layouts/UserLayout‘,
routes: [
{ path: ‘/user‘, redirect: ‘/user/login‘ },
{ path: ‘/user/login‘, component: ‘./User/Login‘ },
{ path: ‘/user/register‘, component: ‘./User/Register‘ },
{ path: ‘/user/register-result‘, component: ‘./User/RegisterResult‘ },
],
}]
**现实情况返回的:**
**[
{
"id": "dashboardws",
"name": "Dashboard",
"description": "Dashboard",
"url": ‘https://boss.xxx.com/qcScheme/qcPrograms‘,
component: ‘./View/home‘,
"children": []
},
{
"id": "knowledge",
"name": "Knowledge Platform",
component: ‘./View/home‘,
"url": null,
"children": [
{
"id": "gene",
"name": "Gene",
component: ‘./View/home‘,
"url": ‘https://XXX.XXX.com/qcPaths/qualityProjectQuery‘,
"children": null
},
{
"id": "phenotype",
"name": "Phenotype",
component: ‘./View/home‘,
"url": ‘https://XXX.XXX.com/lims-ui/baselab/qcPaths‘,
"children": null
},
{
"id": "microbes",
"name": "Microorganism",
component: ‘./View/home‘,
"url": ‘https://boss.xxx.com/qcPaths/qcSamplesCheck‘,
"children": null
}
]
},
{
"id": "indicatorww",
"name": "Index Platform",
"url": ‘https://baidu.com‘,
"children": []
},
{
"id": "report",
"name": "Report Platform",
"url": ‘https://boss.xxx.com/limb/qcScheme/qcSamples‘,
"children": []
}
]

这样的话不能直接用要先处理,我的话是通过utils.js里写一个名叫getMenuMapArrData的方法进行格式化将后台返回的数据处理成类似理想状态的格式,
类似于 —(下面代码的关键字是routes)

const menuListData = [
{
"id": "knowledge",
"name": "Knowledge Platform",
component: ‘./View/home‘,
"url": null,
"routes": [
{
"id": "gene",
"name": "Gene",
component: ‘./View/home‘,
"url": ‘https://XXX.XXX.com/qcPaths/qualityProjectQuery‘,
"children": null
},
{
"id": "phenotype",
"name": "Phenotype",
component: ‘./View/home‘,
"url": ‘https://XXX.XXX.com/lims-ui/baselab/qcPaths‘,
"children": null
},
{
"id": "microbes",
"name": "Microorganism",
component: ‘./View/home‘,
"url": ‘https://boss.xxx.com/qcPaths/qcSamplesCheck‘,
"children": null
}
]
},
]

主要是你格式化的这里里面要有routes这个属性,系统才能识别出你的菜单,当然没有子级菜单可以不需要改。

4、需要在router.config.js里面把你的菜单全集写出来。你动态拉取的必须是你router.config.js里面有的路由才能有效。
5、我那里是通过iframe嵌套一些页面所以我在写router.config.js的路由规则时我用到了动态路由的配置
即在router.config.js
{
path: ‘/:post’,
component: ‘./View/home’,
},
{
path: ‘/:post/:id’,
component: ‘./View/home’,
},
经过我的实验这个要写在
{
component: ‘404’,
},
的前面才不会被404 重定向

6、在src/layouts/Basilayout.js中获取处理后的菜单列表数据,在render()函数里面const menuData = this.getMenuData()这句,调取getMenuData方法,这里面通过this.props动态获取到datas,datas就是我处理后的菜单数据。
注意:如果原数据不是理想数据而又不处理,而是在这个getMenuData里处理,会发生一些意想不到的错误。

getMenuData() {
const {
datas,
route: { routes },
} = this.props;
const newRoutes = [...datas, ...routes]
return memoizeOneFormatter(Array.from([...newRoutes]));
}

7、至此就结束了应该就可以完成了

原文地址:https://www.cnblogs.com/yytwow/p/11616927.html

时间: 2024-07-31 05:27:30

ant-design-pro 动态菜单-路由详解的相关文章

Ant Design Pro路由菜单

config /config.js配置list路由指向页面../layouts/NewPage import defaultSettings from './defaultSettings'; // https://umijs.org/config/ import slash from 'slash2'; import webpackPlugin from './plugin.config'; const { pwa, primaryColor } = defaultSettings; // p

[原创]React+Ant Design设置左侧菜单导航路由的显示与隐藏(与权限无关)

最近在学习react时,用到了很流行的UI框架Ant Design,也了解了一下Ant Design Pro,发现它们都有导航组件,Ant Design框架的导航菜单在这里,Ant Design Pro是权限菜单,权限菜单简单来说就是根据登录的权限来展示不同的菜单给用户,比如管理员有给用户分配不同角色的权限,那管理员就可以看到系统管理等导航菜单,而用户A只有发布某些业务的权限,那用户A就不能看到系统管理的导航菜单等等.不过这不在我们本文的考虑范围内,有兴趣的同学可以自行去看它的API:Autho

Nginx 部署 Ant Design pro

利用Ant Design pro开发的项目,如何用Nginx部署呢? 第一步:把项目打包,打包命令如下: npm run build 运行完毕会在项目目录下生成dist文件夹. 第二步:想要测试打包好的代码是否可以正常运行,安装serve,如下命令 npm i serve -g serve安装完毕,利用serve运行打包好的代码,运行命令: serve dist 测试完毕,代码可以正常运行. 第三步:用Nginx进行部署. 1.下载Nginx:http://nginx.org/en/downlo

SpringBoot整合Ant Design Pro进行部署

一.Ant Design Pro 打包 1.1 运行 build打包 $ npm run build 1.2 将打包生成的静态文件拷贝到spring boot 项目中 构建打包成功之后,会在根目录生成 dist 文件夹,然后将dist 文件夹里的的文件复制到 spring boot 项目的 /src/main/resources/static 目录下 二.配置spring boot 项目可访问到static目录下的index.html 2.1 以gradle为例导入spring-boot-sta

3A2H地址路由详解

接着上一篇文章所说.前一篇重点说了地址划分.3A内部结构包括内部节点结构和与系统架构以及二级XBAR的地址路由和转换情况.这篇主要讲解3A2H的系统结构.将会结合3A2H的窗口寄存器具体值来分析其地址路由情况. 3A2H系统结构 3A2H的系统框图如下所示: 图1-3  3A2H系统结构图 可以看出3A和2H通过HT连接起来,3A四核处理器作为板卡上的主处理器,2H芯片作为桥片扩展外部接口.结合上篇文章中所提3A内部结构,可知3A的HT连接在一级XBAR上,而地址经过HT后发送到2H端,然后在经

关于IPB帧与恒定比特率、动态比特率的详解

之所以写这篇文章是因为有朋友对IPB帧的设置比较感兴趣,回复中说得比较简单,因此在这里详细的写一下,虽然说一般情况下我们很少去设置这个IPB帧,不过,如果真的学好了,并且清楚的了解了这个IPB帧的概念和设置后,我们能够在渲染成品的时候更加好的掌控视频的质量与体积. 在说怎么设置之前,我们先了解一下IPB帧的概念,网络上其实蛮多的,我这里稍微做一点自己的改变和理解,这样更加方便我们理解. 首先说到IPB帧,就不得不说一下帧内压缩和帧间压缩:关于压缩,我想不需要做更多的解释,简单点,就是为了在保证我

elasticsearch系列三:索引详解(分词器、文档管理、路由详解)

一.分词器 1. 认识分词器  1.1 Analyzer   分析器 在ES中一个Analyzer 由下面三种组件组合而成: character filter :字符过滤器,对文本进行字符过滤处理,如处理文本中的html标签字符.处理完后再交给tokenizer进行分词.一个analyzer中可包含0个或多个字符过滤器,多个按配置顺序依次进行处理. tokenizer:分词器,对文本进行分词.一个analyzer必需且只可包含一个tokenizer. token filter:词项过滤器,对to

ant design pro (十二)advanced UI 测试

一.概述 原文地址:https://pro.ant.design/docs/ui-test-cn UI 测试是项目研发流程中的重要一环,有效的测试用例可以梳理业务需求,保证研发的质量和进度,让工程师可以放心的重构代码和新增功能. Ant Design Pro 封装了一套简洁易用的 React 单元测试和 E2E 测试方案,在项目根目录运行以下命令就能运行测试用例. npm run test:all # 执行所有测试 二.详细 2.1.单元测试 单元测试用于测试 React UI 组件的表现.我们

ant design pro (十四)advanced 使用 CLI 工具

一.概述 原文地址:https://pro.ant.design/docs/cli-cn 为了更好以及高效的开发效率,我们提供了配套的 ant-design-pro-cli 工具. pro cli 提供了如下功能: pro new 新建一个脚手架,会自动将最新的 Ant Design Pro 脚手架下载到本地并安装 pro generate 新建一个模板,包含 model.service.page.component 二.使用过程 2.1.如何使用 使用 npm 安装到本地 npm instal