Ant Design Pro模板无多标签页解决方案

白嫖了无尽岁月,我也来写个博客。希望能帮到你!

网上一些方案都是把官方模板替换成自己写的。本人的方案是在模板的基础上进行添砖加瓦,理解起来更容易!

解决思路是:

  记录页面切换时的路由(onPageChange),在内容部分进行动态渲染(myhref)。

注:

使用useState对数组进行更新时,需要以新数组的形式对赋值。如:sethref([...array]);

 

/**
 * Ant Design Pro v4 use `@ant-design/pro-layout` to handle Layout.
 *
 * @see You can view component api by: https://github.com/ant-design/ant-design-pro-layout
 */
import ProLayout, { DefaultFooter, SettingDrawer, getMenuData } from '@ant-design/pro-layout';
import React, { useEffect, useMemo, useRef, useState } from 'react';
import { Link, useIntl, connect, history } from 'umi';
import { Result, Button, Tabs } from 'antd';
import Authorized from '@/utils/Authorized';
import RightContent from '@/components/GlobalHeader/RightContent';
import { getMatchMenu } from '@umijs/route-utils';
import logo from '../assets/logo.svg';

const { TabPane } = Tabs;
const pagesNum = 2; // 设置页签数量
const noMatch = (
  <Result
    status={403}
    title="403"
    subTitle="Sorry, you are not authorized to access this page."
    extra={
      <Button type="primary">
        <Link to="/user/login">Go Login</Link>
      </Button>
    }
  />
);

/** Use Authorized check all menu item */
const menuDataRender = (menuList) =>
  menuList.map((item) => {
    const localItem = {
      ...item,
      children: item.children ? menuDataRender(item.children) : undefined,
    };
    return Authorized.check(item.authority, localItem, null);
  });

const defaultFooterDom = (
  <DefaultFooter copyright={`${new Date().getFullYear()} XXXX`} links={[]} />
);

const BasicLayout = (props) => {
  const {
    dispatch,
    children,
    settings,
    location = {
      pathname: '/',
    },
    route = {
      routes: [],
    },
  } = props;
  const [myhref, sethref] = useState([]);
  const menuDataRef = useRef([]);
  useEffect(() => {
    if (dispatch) {
      dispatch({
        type: 'user/fetchCurrent',
      });
    }
  }, []);
  /** Init variables */

  const handleMenuCollapse = (payload) => {
    if (dispatch) {
      dispatch({
        type: 'global/changeLayoutCollapsed',
        payload,
      });
    }
  }; // get children authority

  const authorized = useMemo(
    () =>
      getMatchMenu(location.pathname || '/', menuDataRef.current).pop() || {
        authority: undefined,
      },
    [location.pathname],
  );
  const { formatMessage } = useIntl();

  const { routes = [] } = route;
  const { breadcrumb } = getMenuData(routes);

  /**
   * 记录切换路由历史
   */
  const pageChange = (local) => {
    const value = breadcrumb[local.pathname];
    const array = myhref;
    let flag = false; // 标识没有相同值
    for (let i = 0; i < array.length; i += 1) {
      if (value.key === array[i].key) {
        flag = true;
      }
    }
    if (!flag) {
      if (array.length > pagesNum) {
        array.splice(0, 1);
      }
      array.push(value);
      sethref([...array]);
    }
  };

  const onChange = (key) => {
    for (let i = 0; i < myhref.length; i += 1) {
      if (key === myhref[i].key) {
        history.push(myhref[i].key);
        break;
      }
    }
  };

  const onEdit = (targetKey, action) => {
    const array = myhref;
    for (let i = 0; i < myhref.length; i += 1) {
      if (targetKey === myhref[i].key) {
        array.splice(i, 1);
        sethref([...array]);
        break;
      }
    }
  };
  return (
    <>
      <ProLayout
        logo={logo}
        // formatMessage={formatMessage} 关闭语言国际化
        {...props}
        {...settings}
        onPageChange={pageChange}
        onCollapse={handleMenuCollapse}
        onMenuHeaderClick={() => history.push('/')}
        menuItemRender={(menuItemProps, defaultDom) => {
          if (
            menuItemProps.isUrl ||
            !menuItemProps.path ||
            location.pathname === menuItemProps.path
          ) {
            return defaultDom;
          }

          return <Link to={menuItemProps.path}>{defaultDom}</Link>;
        }}
        breadcrumbRender={(routers = []) => [
          {
            path: '/',
            breadcrumbName: formatMessage({
              id: 'menu.home',
            }),
          },
          ...routers,
        ]}
        itemRender={(route, params, routes, paths) => {
          const first = routes.indexOf(route) === 0;
          return first ? (
            <Link to={paths.join('/')}>{route.breadcrumbName}</Link>
          ) : (
            <span>{route.breadcrumbName}</span>
          );
        }}
        footerRender={() => {
          if (settings.footerRender || settings.footerRender === undefined) {
            return defaultFooterDom;
          }

          return null;
        }}
        menuDataRender={menuDataRender}
        rightContentRender={() => <RightContent />}
        postMenuData={(menuData) => {
          menuDataRef.current = menuData || [];
          return menuData || [];
        }}
      >
        <Authorized authority={authorized.authority} noMatch={noMatch}>
          <Tabs hideAdd type="editable-card" onChange={onChange} onEdit={onEdit}>
            {myhref.map((pane) => (
              <TabPane tab={pane.name} key={pane.key}></TabPane>
            ))}
          </Tabs>
          {children}
        </Authorized>
      </ProLayout>
      <SettingDrawer
        settings={settings}
        onSettingChange={(config) =>
          dispatch({
            type: 'settings/changeSetting',
            payload: config,
          })
        }
      />
    </>
  );
};

export default connect(({ global, settings }) => ({
  collapsed: global.collapsed,
  settings,
}))(BasicLayout);

以下是效果图:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Ant Design Pro 是一个开箱即用的企业级前端框架和设计语言,它是由蚂蚁金服团队开发的,用于快速构建产品原型和中后台应用。 Ant Design Pro 的特点有以下几点: 1. 卓越的用户体验:Ant Design Pro 提供了丰富的组件和模板,可以帮助开发人员快速构建出美观、易用的用户界面。它还内置了许多常见的设计模式,如表格、表单、图表等,开发人员可以直接使用这些模式,而不用从零开始开发。 2. 高度可定制性:Ant Design Pro 提供了丰富的配置选项和插件,可以根据实际需求来定制应用。开发人员可以自定义主题色、布局样式、路由配置等,满足不同项目的需求。同时,Ant Design Pro 还提供了丰富的插件机制,可以方便地扩展功能。 3. 开发效率高:Ant Design Pro 提供了丰富的模板和脚手架,可以快速创建项目,并提供了一套完整的开发工具链,如自动化构建、代码检查、模拟数据等,帮助开发人员提高开发效率。 4. 良好的生态环境:Ant Design Pro 是基于 Ant Design 这个成熟的前端设计语言开发的,它拥有庞大的开发者社区和丰富的插件资源,开发人员可以方便地分享和复用代码。 总之,Ant Design Pro 是一款功能强大、易用、高效的前端开发框架,适用于快速构建企业级中后台应用。无论是构建企业内部管理系统,还是开发独立的产品原型,Ant Design Pro 都能够帮助开发人员快速落地,提高开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值