React + Ant Design Pro项目实现keep-alive页签

背景

PC端管理系统,采用 ant design pro 方案,它是阿里的一个管理系统框架,技术栈是react。

相比vue,react一个先天不足是不支持 keep-alive,所以管理系统中的多页签功能难以实现。

调研

由于官方不支持,只能网上寻找各方大佬的开源插件。

目前选择的是 umi-plugin-keep-alive ,它是在 react-activation 基础上,针对阿里自己的 umi 进行的定制化封装,antd pro 核心也是 umi 技术,所以 umi-plugin-keep-alive 与 antd pro 可以完美搭配。

实现

插件找到了,接下来的难点是对框架的改造。

由于 ant design pro 封装的很厉害,操作灵活性并不高,以下是改造的一个思路。

1. 创建 BaseLayout 和 BaseTabs 两个组件

这一步是标签页与缓存的实现

// BaseTabs/index.tsx
import { Tabs } from 'antd';
import React from 'react';
import { useAliveController, useHistory, useLocation } from 'umi';
const { TabPane } = Tabs;

export default (): React.ReactElement => {
  const { pathname } = useLocation();
  const history = useHistory();

  // 获取缓存列表
  const { getCachingNodes, dropScope } = useAliveController();
  const cachingNodes = getCachingNodes();

  /**
   * 点击tab,跳转页面
   */
  const clickTab = (path: string) => {
    history.push(path);
  };

  /**
   * 关闭tab,销毁缓存
   */
  const editTab = (path: any) => {
    dropScope(path);

    // 关闭当前页面,需跳转到其他页签
    if (path === pathname) {
      const index = cachingNodes.findIndex((item) => item.name === path);
      if (index > 0) {
        history.push(cachingNodes[index - 1].name as string);
      } else {
        history.push(cachingNodes[1].name as string);
      }
    }
  };

  return (
    <Tabs
      type="editable-card"
      hideAdd
      size="small"
      activeKey={pathname}
      onTabClick={clickTab}
      onEdit={editTab}
    >
      {cachingNodes.map((node) => (
        <TabPane tab={node.tabName} key={node.name} closable={cachingNodes.length > 1} />
      ))}
    </Tabs>
  );
};
// BaseLayout/index.tsx
import React from 'react';
import { KeepAlive } from 'umi';
import BaseTabs from '../BaseTabs';

export default (props: any): React.ReactElement => {
  const { children, location } = props;
  const { pathname } = location;

  return (
    <>
      <BaseTabs />
      <KeepAlive id={pathname} name={pathname} tabName={props.route.name}>
        {children}
      </KeepAlive>
    </>
  );
};

2. 将BaseLayout应用起来

这一步被卡了很久,不知道该怎么把功能和框架相关联,原来需要在路由配置里加 wrappers 属性,这个属性官方文档中没有体现,翻阅了很多网上案例才找到,代码如下。(这里是举个例子,实际可以遍历 routes统一加属性)

这样写好后,系统就可以自动根据路由,完成缓存的功能了。 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值