返回

ant design pro + umi4 菜单与路由,轻松搞定!

前端

使用 Ant Design Pro 和 Umi4 实现动态菜单和路由

Ant Design Pro 和 Umi4 是强大的框架,可用于构建动态菜单和路由,从而创建用户界面,根据用户的权限或其他条件动态调整。在本指南中,我们将逐步介绍如何使用这两个框架来实现此功能。

安装和项目创建

首先,使用以下命令安装 Ant Design Pro 和 Umi4:

npm install ant-design-pro umi

然后,创建一个新的项目:

umi new my-app

定义菜单和路由配置

src/layouts/BasicLayout.js 中,添加菜单和路由配置:

import { Menu, Route, Switch } from 'umi';
import { useModel } from 'umi';

const BasicLayout = () => {
  const { menuData, routerData } = useModel('@@initialState');
  return (
    <Layout>
      <Header>
        <Menu
          theme="dark"
          mode="horizontal"
          defaultSelectedKeys={['/']}
          items={menuData}
        />
      </Header>
      <Content>
        <Switch>
          {routerData.map(({ path, component }) => (
            <Route key={path} path={path} component={component} />
          ))}
        </Switch>
      </Content>
    </Layout>
  );
};

export default BasicLayout;

在模型中定义菜单和路由数据

src/models/@@initialState.js 中,定义菜单和路由数据:

import { getMenuData } from '@/services/menu';

export default {
  namespace: '@@initialState',
  state: {
    menuData: [],
    routerData: [],
  },
  effects: {
    *fetchMenuData(_, { call, put }) {
      const data = yield call(getMenuData);
      yield put({
        type: 'save',
        payload: {
          menuData: data,
        },
      });
    },
  },
  reducers: {
    save(state, action) {
      return {
        ...state,
        ...action.payload,
      };
    },
  },
};

添加子路由

src/pages/index.js 中,添加子路由:

export default () => {
  return (
    <div>
      <h1>欢迎来到首页</h1>
      <Link to="/about">关于我们</Link>
    </div>
  );
};

启动项目

最后,使用以下命令启动项目:

npm start

常见问题解答

1. 子路由为空时,父结点数据被清除

在这种情况下,使用以下代码清除父结点数据:

const handleEmptyChildRoutes = (routerData) => {
  routerData.forEach((route) => {
    if (route.routes && route.routes.length === 0) {
      delete route.routes;
    }
  });
};

2. 使用 patchClientRoutes 修改默认路由跳转

要修改默认路由跳转,请使用以下代码:

const patchClientRoutes = () => {
  const { routes } = window.__UMI_APP_STATE__;
  routes.forEach((route) => {
    if (route.path === '/') {
      route.redirect = '/home';
    }
  });
};

3. 布局页 BasicLayout 子 children 消失

要解决此问题,请将子 children 手动传递给路由组件:

const BasicLayout = ({ children }) => {
  const { menuData, routerData } = useModel('@@initialState');
  return (
    <Layout>
      <Header>
        <Menu
          theme="dark"
          mode="horizontal"
          defaultSelectedKeys={['/']}
          items={menuData}
        />
      </Header>
      <Content>
        <Switch>
          {routerData.map(({ path, component }) => (
            <Route key={path} path={path} component={component} />
          ))}
        </Switch>
        {children}
      </Content>
    </Layout>
  );
};

export default BasicLayout;

结论

Ant Design Pro 和 Umi4 提供了实现动态菜单和路由的强大功能。遵循本指南中的步骤,您可以轻松地创建根据用户权限或其他条件进行调整的用户界面。

5 个附加的常见问题解答

  1. 如何使用 Layout 组件创建自定义布局?
  2. 如何处理路由权限控制?
  3. 如何动态加载子路由?
  4. 如何使用 React Hooks 访问模型状态?
  5. 如何实现多级菜单?