Ant-design-pro: ant design pro 2 动态菜单

Created on 9 Jan 2019  ·  15Comments  ·  Source: ant-design/ant-design-pro

我想把ant design pro 2的菜单,路由,权限 做活掉,
网上都找不到什么资料,
还请各位专家指点下,谢谢了!

Most helpful comment

肯定会的吧,问的人这么多

All 15 comments

菜单可以修改 src/models/menu.js
路由我尝试了几种方式,好像都还不行,方案待定吧。
权限可以参考 https://github.com/ant-design/ant-design-pro/pull/2928
后续官网的文档上会体现。

后续官网上会有更新这一部分?! @xiaohuoni

肯定会的吧,问的人这么多

真希望如此! @xiaohuoni

@xiaohuoni 是时候写个文档了

关于Ant design Pro 2的动态菜单,可以参考这几个文件router.config和menu.js里面的getMenuData来进行过滤生成最终的菜单信息. 其路由信息,是由umi来进行配置的,在文件config.js里面

  // 路由配置
  routes: pageRoutes,

路由指的是界面上的URL地址,对应不同的组件,这个就是路由
菜单指的就是左边生成的菜单信息,一般点击菜单后会连接到指定的路由,目前好像动态路由不太好实现,动态菜单就很简单了,参看SiderMenu组件的menuData参数就行了,在BasicLayout.js里面配置SiderMenu组件的menuData参数为后台请求即可

其实菜单的生成主要是SiderMenu组件的里面的menuData这个参数关注这个就行.目前ant design pro 2的流程大概就是这样

https://www.yuque.com/zhangjin-frt3c/tigfst/rz0e9m 可以参看这个链接,我自己写的备注说明

菜单可以修改 src/models/menu.js
路由我尝试了几种方式,好像都还不行,方案待定吧。
权限可以参考 #2928
后续官网的文档上会体现。

其实我感觉他们关注的动态菜单,而不是动态路由,动态路由放在后台个人感觉意义不大. - - !!

按照上面的说法,其实本地都要配置好路由然后在menu中配置是否显示吧,我这边有这么一个需求,就是menu 全部是指向同一个component只是参数不同 ,然后我配置好了,当点击menu的时候 路由参数是变了 但是页面还是原来的那个页面,没有动,有什么办法可以解决 点击menu后 重新刷新页面

按照上面的说法,其实本地都要配置好路由然后在menu中配置是否显示吧,我这边有这么一个需求,就是menu 全部是指向同一个component只是参数不同 ,然后我配置好了,当点击menu的时候 路由参数是变了 但是页面还是原来的那个页面,没有动,有什么办法可以解决 点击menu后 重新刷新页面

可以的,在页面中获取当前URL的参数,如果发现不对就重新刷新页面,目前想到的解决方案,但是不够优雅

菜单用了dva的model,但SiderMenu组件中还是用的React.memo(对这个不了解)
这样导致我在model.menu中修改menuData的数据不会实时生效,得点一下折叠菜单才可以.
我把React.memo改成React.Component了,这样比较好.(补充,我加route菜单变化了,但路由没挂上,是404)

model/menu.js 加两行

// 1.顶部引入
import { getFlatMenuKeys } from '@/components/SiderMenu/SiderMenuUtils';
// 2.reducers中 
save(state, action) {
      // 这里加一行处理
      state.tree = getFlatMenuKeys(action.payload.menuData);
      return {
        ...state,
        ...action.payload,
      };
    },

src/components/SiderMenu/index.js

import React from 'react';
import { Drawer } from 'antd';
import SiderMenu from './SiderMenu';
import { getFlatMenuKeys } from './SiderMenuUtils';
import { connect } from 'dva';

// const SiderMenuWrapper = React.memo(props => {
//   const { isMobile, menuData, collapsed, onCollapse } = props;
//   const flatMenuKeys = getFlatMenuKeys(menuData);
//   return isMobile ? (
//     <Drawer
//       visible={!collapsed}
//       placement="left"
//       onClose={() => onCollapse(true)}
//       style={{
//         padding: 0,
//         height: '100vh',
//       }}
//     >
//       <SiderMenu {...props} flatMenuKeys={flatMenuKeys} collapsed={isMobile ? false : collapsed} />
//     </Drawer>
//   ) : (
//     <SiderMenu {...props} flatMenuKeys={flatMenuKeys} />
//   );
// });

@connect(({ menu }) => ({ menu }))
class SiderMenuWrapper extends React.Component {
  render() {
    return this.props.isMobile ? (
      <Drawer
        visible={!this.props.collapsed}
        placement="left"
        onClose={() => this.props.onCollapse(true)}
        style={{
          padding: 0,
          height: '100vh',
        }}
      >
        <SiderMenu {...this.props} flatMenuKeys={this.props.menu.tree} collapsed={this.props.isMobile ? false : this.props.collapsed} />
      </Drawer>
    ) : (
        <SiderMenu {...this.props} flatMenuKeys={this.props.menu.tree} />
      );
  }
}

export default SiderMenuWrapper;

按照上面的说法,其实本地都要配置好路由然后在menu中配置是否显示吧,我这边有这么一个需求,就是menu 全部是指向同一个component只是参数不同 ,然后我配置好了,当点击menu的时候 路由参数是变了 但是页面还是原来的那个页面,没有动,有什么办法可以解决 点击menu后 重新刷新页面

可以的,在页面中获取当前URL的参数,如果发现不对就重新刷新页面,目前想到的解决方案,但是不够优雅

子菜单是同一组件,我加的route都是404...

按照上面的说法,其实本地都要配置好路由然后在menu中配置是否显示吧,我这边有这么一个需求,就是menu 全部是指向同一个component只是参数不同 ,然后我配置好了,当点击menu的时候 路由参数是变了 但是页面还是原来的那个页面,没有动,有什么办法可以解决 点击menu后 重新刷新页面

可以的,在页面中获取当前URL的参数,如果发现不对就重新刷新页面,目前想到的解决方案,但是不够优雅

子菜单是同一组件,我加的route都是404...

404 表示你没有注册对应的route,你检查你的route.config

@xiaohuoni 不知道各位大佬是否有了解决方案

@kzabc 你说的是啥?

Was this page helpful?
0 / 5 - 0 ratings

Related issues

suifan picture suifan  ·  3Comments

kaoding picture kaoding  ·  3Comments

lvzheng0404 picture lvzheng0404  ·  3Comments

cheung1111 picture cheung1111  ·  3Comments

Jerry-goodboy picture Jerry-goodboy  ·  3Comments