当前位置: 首页 > news >正文

开源一个react路由缓存库

Github & Demo

Github仓库

CodeSandbox Demo

背景

  1. 产品希望可以像浏览器那样每打开一个路由,会多一个tab,用户可以切换tab访问之前加载过的页面,且不会重新加载。
  2. 真就产品一句话……

Github上有轮子了吗

  1. Github上开箱即用的轮子是基于react-router-dom V5实现的,我看了一下issue作者表示不会支持V6版本。但是我的项目路由是V6版本的。
  2. 后来在Github上找到了另外一个项目是基于V6实现的,但是这是一个类似Demo的项目,没有提供API开箱即用的功能。

功能点

  1. 实现一个React版的keep-alive组件,被他包裹的组件会被缓存,下次再打开不需要重新走create生命周期
  2. Tab组件
    • 切换路由时新增一个tab,title从路由信息里面自动读取
    • tab支持关闭,下次再进入相同的路由会重新加载
    • 同时支持关闭所有tab(快捷操作,但是会保留当前tab)
  3. 实现activated、deactivated生命周期函数。
    • 在Vue2(不知道Vue3是不是)的时候activated的生命周期在首次加载时不会触发,因为它不是从未激活切换到激活的状态。这会导致create 和 activated经常要写相同的代码。
    • 我实现的activated则会在首次被激活时也会被调用,不知道算不算优化!
  4. 开箱即用的功能,不需要太多额外的配置。

安装

// npm
npm i react-route-cache -S
// pnpm
pnpm i react-route-cache -S
// yarn
yarn add react-route-cache

使用

  1. 给Layout组件的outlet加上keep-alive
// Layout.tsx
import { KeepAlive, KeepAliveScope, RouterTabs } from 'react-route-cache';
import { useOutlet } from 'react-router-dom';const Layout = () => {// 需要使用useOutletconst outlet = useOutlet();return (<KeepAliveScope><RouterTabs /><KeepAlive>{outlet}</KeepAlive></KeepAliveScope>);
};export default Layout;
  1. 路由定义需要增加name属性
// router.ts
// 也可以是createHashRouter
import Layout form './Layout'createBrowserRouter([{path: "/",element: <Layout />,loader: rootLoaderchildren: [{path: "events",element: <Event />,// 增加name属性,否则标签没有title,展示出现问题handle: { name: "事件" },}]}
]);
  1. 生命周期函数
    • useActivated返回的方法会在Deactivated的时候执行。
    • 第二个可选参数是一个依赖项数组,为了更新回调函数里的依赖,一般不会用到,功能类似useCallback,依赖变化不会执行函数。
import { useActivated, useDeactivated } from 'react-route-cache';export const Demo = () => {useActivated(() => {console.log('激活')return () => {console.log('activated返回的方法会在Deactivated的时候执行')}});useDeactivated(() => {console.log('离开组件')});return <div>123</div>;
};

其他API

  1. mode
    • 默认匹配路由path,path变化则会新增一个tab,也就是如果查询参数变化不会新增一个tab缓存组件
    • 如果希望查询参数变化也会新增一个tab需要将mode改为search
  2. nameKey:如果路由name已被占用,可以通过该字段获取handle下其他字段的信息作为tab的title
interface KeepAliveScopeProps {mode?: 'path' | 'search';nameKey?: string;
}
<KeepAliveScope mode="search" nameKey="tabName" />
  1. close、closeAll、closeNavigator
    • close方法用于关闭当前标签页
    • closeAll用于关闭除了当前激活的tab所有的标签页
    • closeNavigator是为了解决比如表单创建页,创建完之后需要跳转到其他路由。closeNavigator会关闭当前创建页标签,然后跳转到指定路由。是close()和navigator(url)的语法糖。
import { useKeepAlive } from '../hooks/use-keep-alive';
...const { close, closeAll, closeNavigator } = useKeepAlive();close()closeAll()// 是close()和navigator方法跳转到其他路由closeNavigator(url)
...

最后

  1. 都看到这了,可以给我的Github仓库点个小小的Star吗?这真的对我很重要!重要!重要!欢迎给我提Issue、共建。
  2. 有兴趣可以加我微信号:vgbire,一起了解更多前端咨询。
  3. 如果有200赞的话,我会再出一期如何实现react路由缓存的文章。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 每天一个数据分析题(四百五十七)- 分层随机抽样
  • 【Qt】QLCDNumberQProgressBarQCalendarWidget
  • JL 跳转指令的理解
  • C++初学(3)
  • JAVA同城拼桌活动报名系统支持H5小程序APP公众号源码
  • Android Studio Build窗口出现中文乱码问题
  • 得到xml所有label 名字和数量 get_xml_lab.py,get_json_lab.py
  • vue3-01创建项目
  • 聊聊在springcloud gateway如何获取请求体
  • 如何优化PyTorch以加快模型训练速度?
  • Linux基础复习(二)
  • AI大模型评测方法总结!
  • 学习008-02-04-03 Group List View Data(组列表查看数据)
  • 【基础模型】开始构建我们自己的大语言模型2:模型构建部分
  • ElementUI,el-input输入框max、min限制最大最小值失效
  • JavaScript-如何实现克隆(clone)函数
  • [iOS]Core Data浅析一 -- 启用Core Data
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • 08.Android之View事件问题
  • Babel配置的不完全指南
  • iOS | NSProxy
  • Linux gpio口使用方法
  • React+TypeScript入门
  • SpringBoot几种定时任务的实现方式
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • win10下安装mysql5.7
  • 复习Javascript专题(四):js中的深浅拷贝
  • 后端_MYSQL
  • 基于游标的分页接口实现
  • 计算机在识别图像时“看到”了什么?
  • 利用DataURL技术在网页上显示图片
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 数据结构java版之冒泡排序及优化
  • 怎样选择前端框架
  • C# - 为值类型重定义相等性
  • 阿里云移动端播放器高级功能介绍
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • #define用法
  • $.ajax()参数及用法
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (1)(1.9) MSP (version 4.2)
  • (160)时序收敛--->(10)时序收敛十
  • (c语言+数据结构链表)项目:贪吃蛇
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第1节 (全局数据、栈和堆)
  • (SERIES12)DM性能优化
  • (vue)页面文件上传获取:action地址
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (笔试题)合法字符串
  • (不用互三)AI绘画工具应该如何选择
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642