关于javascript:umi30-配置全局路由及菜单

背景介绍

接上一篇《应用umi.js 3.0搭建React开发框架》(查看),咱们在文中实现了React开发环境的根本实现,然而在用umi3.0搭建React我的项目时通常须要如下的性能:一个全局的菜单,能够始终显示,点击后能够跳转到不同的页面。具体的实现成果如下图所示,本文就该问题做简略的介绍

性能拆解

能够将以上的需要拆分成如下的几个性能

  1. 构建全局的layout界面
  2. 可能实现路由跳转
  3. 可能在全局layout中依据路由配置生成具体的菜单

实现步骤

Step 1: 构建全局layout 官网参考文档


在src/文件夹下依照上图所示建设layouts文件夹及index.js文件

建设实现后输出如下代码:

export default withRouter(({ children, location }) => {
  
  return (
    <div>
      
      <div>
        <Switch location={location}>{children.props.children}</Switch>
      </div>
    </div>
  );
});

同时在.umirc.ts中做如下配置

routes: [
  {
    path: '/',
    component: '@/layouts/index',
    routes: [
      {
        exact: true,
        path: '/Demo1',
        name: 'Demo1',
        component: '@/pages/Demo1/index',
        icon: 'SettingOutlined',
      },
      {
        exact: true,
        path: '/Demo2',
        name: 'Demo2',
        component: '@/pages/Demo2/index',
        icon: 'AppstoreOutlined',
      },
    ],
  },
];

联合这两局部咱们能够实现全局路由调整,umi.js在调整时首先载入@/layouts/index组件,即咱们刚刚定义的全局的layout,而后再调整到具体的路由载入另一个页面。

实现了全局路由跳转后,问题在于咱们要路由跳转只能手动在浏览器上输出路由,于是咱们须要在全局layout中退出一个菜单不便咱们跳转。

Step2: 依据路由配置构建菜单

此处的菜单应用antd 的Menu组件来实现,其界面成果如下

咱们依据路由配置信息联合Menu组件的参数配置应用动静生成的形式实现,具体代码如下:

import React, { Fragment, useState } from 'react';
import { withRouter, Switch, history } from 'umi';
import { Menu } from 'antd';
import * as Icon from '@ant-design/icons';
import routerConfig from '../../config/router.config';

const { SubMenu } = Menu;

const getIcon = (iconName) => {
  const res = React.createElement(Icon[iconName], {
    style: { fontSize: '16px' },
  });
  return res;
};

const getSubMenu = (routesData) => {
  routesData.map((item) => {
    return <Menu.Item key={item.path}>{item.name}</Menu.Item>;
  });
};

const getMenu = (routesData) => {
  const menuData = [];
  for (let i = 0; i < routesData.length; i += 1) {
    if (Object.prototype.hasOwnProperty.call(routesData[i], 'routes')) {
      menuData.push(
        <SubMenu
          key={routesData[i].path}
          title={routesData[i].name}
          icon={getIcon(routesData[i].icon)}
        >
          {getSubMenu(routesData[i].routes)}
        </SubMenu>,
      );
    } else {
      menuData.push(
        <Menu.Item key={routesData[i].path} icon={getIcon(routesData[i].icon)}>
          {routesData[i].name}
        </Menu.Item>,
      );
    }
  }
  return menuData;
};
const CreateMenu = () => {
  const [levelOne] = routerConfig;
  const { routes } = levelOne;
  return <Fragment>{getMenu(routes)}</Fragment>;
};

export default withRouter(({ children, location }) => {
  const [current, setCurrent] = useState('');
  const handleClick = (e) => {
    history.push(e.key);
    setCurrent(e.key);
  };

  return (
    <div>
      <Menu onClick={handleClick} selectedKeys={[current]} mode="horizontal">
        {CreateMenu()}
      </Menu>
      <div>
        <Switch location={location}>{children.props.children}</Switch>
      </div>
    </div>
  );
});

其中getMenu函数是构建菜单的具体实现函数。

具体的demo能够参考

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理