百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Umi4.0多页签设计(页签功能)

ccwgpt 2024-10-01 08:05 32 浏览 0 评论

大家好,我是Echa哥。

在平常的后台系统开发中,常常需要缓存一些之前打开的页面,方便操作,多页签就是用来管理页面的,如下图

Umi4.0 版本发布到现在已经有一段时间,全新的框架当然需要学习一下新的特性和功能,由于 Umi4.0 使用了react-router6,所以路由有较大改动,多页签设计也需要重新调整。

文章分为三部分

  1. 设计思路
  2. 遇到的问题
  3. 扩展到自建路由

一、设计思路

之所以要设计多页签,是因为现有的框架路由只能单开,Vue 里面即使有 keep-alive,当面对类似/detail:id这种路由时也只能同时存在一个。

多页签结构如下:路由与组件一对一,组件与实例一对多,实例与页签一对一

以组件实例为维度构建页签,因此需劫持渲染。多页签之所以能劫持渲染是因为其就是一个高阶组件,监听路由变化生成对应的实例。自己维护当前展示的组件列表,从框架提供的全局路由信息生成对应的组件实例,向下渲染。从路由配置里面表现为所有的组件路由都是多页签路由的子路由。

{
  path: '/',
  //多页签对应的组件
  component: '@/layouts/MultiTagRoute.jsx',
  flatMenu: true,
  routes:[
    //以下是实际路由
    {
      name: '组件1',
      path: '/one',
      component: './one',
      icon: 'cluster',
    },
    {
      name: '组件2',
      path: '/two',
      component: './two',
      icon: 'cluster',
    },
  ]
}

那么具体的代码思路如下

  1. 从框架提供的路由信息里面拿到生成组件实例的方法,维护一个页签队列
  2. 监听路由变化,路由不在队列就加入,已经存在就激活,缓存使用 display:'none',因为这里是显示的高阶组件式缓存,可操作性比较高。不是类似 keepalive 那种缓存内置。
  3. 拿到对应的路由信息生成组件实例,向下渲染

二、遇到的问题

react-router6 使用 <Outlet/> 渲染路由,同时还提供了 useOutLet 这个 hooks 获取当前渲染信息。useOutLet 这个 hook 返回的 outlet 比较有意思,它不是传统意义上的类似 children 的 dom 结构。「使用 isValidElement 检测为 true,但是使用 cloneElement 向其传递 props 却不会生效」。因此想要传递 props,只能按照<Outlet context={{}}/>的方式进行参数传递。此外 umi 框架在 prolayout 里面已经使用了<Outlet/>,因此这里只能使用{outlet}这种方式渲染。

umi 还有有一个 useAppData 方法,可以返回组件实例

declare function useAppData(): {
  routes: Record<id, Route>;
  routeComponents: Record<id, Promise<React.ReactComponent>>;
  clientRoutes: ClientRoute[];
  pluginManager: any;
  rootElement: string;
  basename: string;
  clientLoaderData: { [routeKey: string]: any };
  preloadRoute: (to: string) => void;
};

routeComponents 里面包含了每一个组件的工厂函数,可以直接使用<Component>进行渲染。这种方式使用 props 就可以传递参数,可以根据实际情况选择。

监听路由变化使用 useLocation,在多页签里面使用 useEffect 监听 location,此外 location 也能携带一些参数,用于丰富多页签的功能,例如刷新当前页签、跳转前关闭当前页签,跳转后自动刷新等功能,只要在 query 参数里面约定好即可。

三、扩展到自建路由

有了上面的设计思路,平时开发中也会遇到自建路由的需求。路由本质就是路径字符串到组件的映射。我们自建路由的配置也应如下

{
  name: '多页签',
  component: React.lazy(() => import('./multiTag')),
  path: '/',
  children: [
    {
      name: '组件A',
      path: '/componentA',
      component: React.lazy(() => import('./componentA')),
    },
    {
      name: '组件B',
      path: '/componentB',
      component: React.lazy(() => import('./componentB')),
    }
  ]
}

使用 context 维护全局字符串路径,向下传递自建跳转方法就可以模拟路由跳转,自建的路径信息数据结构与 location 保持一致就可以。

这里还有一点需要注意的地方,传统异步加载是这样的方式() => import('./componentA'),没有添加 React.lazy,这样加载出来的文件会被解析为 module。

图片

它不是一个 react 组件,如果使用了 hooks 在某些情况会出现render more than one hooks 的报错,使用时需要注意。

四、总结

以上就是多页签的总体设计思路,大家有什么想法,欢迎在评论区交流。

相关推荐

谷歌正在为Play商店进行Material Design改造

谷歌最近一直忙于在其应用程序中完成MaterialDesign风格的改造,而Play商店似乎是接下来的一个。9to5Google网站报道,有用户在Play商店的最新版本中发现了新界面,暗示该应用和网...

企业网站免费搭建,定制化建站CMS系统

科腾软件企业网站CMS管理系统已完成开发工作,首次开源(全部源码)发布。开发工具:VisualStudioEnterprise2022数据库:SQLite(零配置,跨平台,嵌入式)开发...

您需要的 11 个免费 Chrome 扩展程序

来源:SEO_SEM营销顾问大师Chrome扩展程序是SEO的无名英雄,他们在幕后默默工作,使您的策略脱颖而出并提高您的努力效率。从竞争对手研究到审核您的网站,速度比您说“元描述”还快,这些小工具发...

户外便携设备抗干扰困境如何破局?CMS-160925-078S-67给出答案

  在户外复杂的电磁环境中,便携式设备中的扬声器需具备出色抗干扰能力,CUID的CMS-160925-078S-67在这方面表现突出。  从其结构设计来看,矩形框架虽主要为适配紧凑空...

一个基于NetCore开发的前后端分离CMS系统

今天给大家推荐一个开源的前后端分离架构的CMS建站系统。项目简介这是一个基于.Net3构建的简单、跨平台、模块化建站系统。系统业务简单、代码清晰、层级分明、全新架构便于二次扩展开发。支持多种数据库,...

本地Docker部署ZFile网盘打造个人云存储

前言本文主要介绍如何在LinuxUbuntu系统使用Docker本地部署ZFile文件管理系统,并结合cpolar内网穿透工具实现远程访问本地服务器上的ZFile传输与备份文件,轻松搭建个人网盘,无...

pcfcms企业建站系统 免费+开源的企业内容管理系统

项目介绍pcfcms是基于TP6.0框架为核心开发的免费+开源的企业内容管理系统,专注企业建站用户需求提供海量各行业模板,降低中小企业网站建设、网络营销成本,致力于打造用户舒适的建站体验。演示站...

【推荐】一个高颜值且功能强大的 Vue3 后台管理系统框架

如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!项目介绍SnowAdmin是一款基于Vue3、TypeScript、Vite5、Pinia、Arco-Desi...

java开源cms管理系统框架PublicCMS后台管理系统

一款使用Java语言开发的CMS,提供文章发布,图片展示,文件下载,用户权限、站点模块,内容管理、分类等功能。可免费用于商业用途maven工程数据库脚本在工程中database文件夹下代码结构:效果...

一定要大量读书:当我问Deepseek,它给出的高效阅读方法厉害了!

一年一度的世界读书日,总该写点什么。于是,我去问Deepseek给我推荐人生破局必读的10本书,结果它给了我回复,竟然10本推荐的书籍里,我都曾经浏览过,同时还给出破局关键。而说浏览过,不是读过,是因...

《搜神札记》:不应磨灭的惊奇(小说《搜神记》)

□黄勃志怪传说的书写一直是文人墨客的后花园,晚近尤盛,从张岱到袁枚到纪昀,收集那些或阴森或吊诡的行状故事,遂成一类,到民国年间,周作人挟此遗传,捋袖子拿希腊神话动刀,乃兄鲁迅不甘其后,《故事新编》虎...

《如何构建金字塔》之第三章总结(构建金字塔结构的方法有)

“没有什么比一套好理论更有用了。”——库尔特.勒温这篇读后感依然引用了这句库尔特.勒温名言,这句话也是我读芭芭拉.明托这本书的初衷。今天就“如何构建金字塔”,我来谈谈我的读后心得。我热爱写作,但是写...

《助人技术》第一章助人引论内容框架

第一章内容基本呈现如何成为助人者(心理咨询师)以及一些相关基础知识,对于进入这个行业有兴趣以及希望通过心理咨询寻求帮助但存有疑虑的当事人,都值得一读。心理咨询的三个阶段(不是说严格的三个阶段,而是广义...

AI助手重构读后感写作流程:从提纲到完整性思考的转换

大家好!你有没有遇到过读完一本书,想要写读后感,却不知道从何下手的情况呢?今天我们要来探讨一下如何利用稿见AI助手来重构读后感写作流程,从提纲到完整性思考的转换。让我们一起来看看这个全新而又实用的方法...

图解用思维导图做读书笔记技巧(图解用思维导图做读书笔记技巧视频)

做阅读笔记非常有利于读后进行有效的深入思考,而思维导图这一强大的工具其最大的特点就是架构清晰,在阅读过程中对文章的分析、总结、分类起着很大的辅助作用。思维导图读书笔记步骤:1、阅读大纲。首先要快速浏览...

取消回复欢迎 发表评论: