开源一个react路由缓存库

Github仓库

背景

  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路由缓存的文章。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/51588.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu上部署vue项目到ngixn中+SpringBoot项目+postgresql数据库

文章目录 前提1.Ubuntu上安装ngix2.部署Vue项目2.1上传vue项目2.2.配置 3.Ubuntu上安装Postgres4.部署springboot项目 前提 记一次在ubuntu部署前端vue和后端springboot项目&#xff0c;以及数据库postgresql的安装以及启动、停止等常用的命令。 1.Ubuntu上安装ngix 1、检查…

java解决全排列问题

java解决全排列问题 全排列问题1 给定一个可包含重复数字的序列 nums &#xff0c;按任意顺序返回所有不重复的全排列。 思路 我们把问题看成n个排列成一行的空格&#xff0c;从左往右依次填入给定的n个数&#xff0c;每个数只能使用一次&#xff0c;可以使用回溯法。 递归函数…

Cuppa CMS v1.0 任意文件读取漏洞(CVE-2022-25578)

前言 春秋云镜靶场是一个专注于网络安全培训和实战演练的平台&#xff0c;旨在通过模拟真实的网络环境和攻击场景&#xff0c;提升用户的网络安全防护能力和实战技能。这个平台主要提供以下功能和特点&#xff1a; 实战演练&#xff1a; 提供各种网络安全攻防演练场景&#…

yolo模型训练出的.pt文件过大

当我们使用yolov8训练时候&#xff0c;保存的模型变大&#xff0c;如下图&#xff1a; 原模型 训练出来的模型 经过仔细调查&#xff0c;发现是保存的模型中多了很多数据。 原模型 训练出来的模型 只需要把文件中.pt文件读取&#xff0c;重写一遍保存。 from ultralytics im…

深入源码:解析SpotBugs (6)jvm 字节码简介

文章目录 一、JVM字节码概述一、文件结构概述二、详细解析1. 魔数和Class文件的版本2. 常量池3. 访问标志4. 类索引、父类索引与接口索引集合5. 字段表和方法表6. 属性表 字节码Spotbugs 作为一名资深的Java开发工程师&#xff0c;对JVM及其字节码有着深入的理解。现在&#xf…

Linux基于centOS7 【进度条】【Git】【gdb】学习

目录 进度条 进度条的前置准备 sleep &#xff08;秒&#xff09;& usleep&#xff08;微秒&#xff09; sleep加\n和不加\n的区别 IO函数的缓冲区 回车&换行 10秒倒计时 进度条编写 git的使用 为什么要有git&#xff08;git版本控制器&#xff09; git的主要…

windows上启动Kafka

官网下载 如&#xff1a;kafka_2.13-2.4.0.tgz 新版集成了Zookeeper ,无需另行下载 解压 至D:\Kafka\kafka_2.13-2.4.0 下 配置Kafka&#xff08;可跳过&#xff09; Zookeeper配置 kafka\config\zookeeper.properties下修改dataDir路径(Zookeeper数据目录)dataDirD:\\Program…

江科大/江协科技 STM32学习笔记P13

文章目录 TIM定时中断1、TIM简介计数器PSC预分频器ARR自动重装寄存器 2、定时器类型基本定时器主模式触发DAC 通用定时器高级定时器 3、定时器原理定时中断基本结构预分频器时序计数器时序RCC时钟树 TIM定时中断 1、TIM简介 定时器的基准时钟一般都是主频72MHz&#xff0c;如果…

Java 不可变Map练习 (2024.7.28)

CollectionExercise3 package CollectionExercise20240728;import java.util.HashMap; import java.util.Map; import java.util.Set;public class CollectionExercise3 {public static void main(String[] args) {// 不可变的Map集合// Map中键是不可以重复的// Map中的of方法…

业绩增长新引擎:智能名片如何助力销售突破

01、智能名片&#xff0c;营销增长利器 在当今竞争激烈的市场环境下&#xff0c;企业正面临着类似品牌曝光不足、销售线索获取困难、客户关系维护复杂等诸多挑战。为帮助企业解决相关难题&#xff0c;促进业绩高效增长&#xff0c;纷享营销通的 智能名片 应运而生&#xff0…

【Linux中Shell的功能】

一、Shell概念 Shell 是指一种应用程序&#xff0c;这个应用程序提供了一个界面&#xff0c;用户通过这个界面访问操作系统内核的服务。 Shell 是一个用 C 语言编写的程序&#xff0c;它是用户使用 Linux 的桥梁。Shell 既是一种命令语言&#xff0c;又是一种程序设计语言。S…

Leetcode—74. 搜索二维矩阵【中等】

2024每日刷题&#xff08;149&#xff09; Leetcode—74. 搜索二维矩阵 实现代码 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int m matrix.size();int n matrix[0].size();int l 0;int r m * n;int mid -1…

DB-gpt + one-api + kimi-free-api 真香

# 1. 新建文件夹 one-api 和 子目录 mkdir -p /docker/one-api/data# 运行容器one-api docker run --name one-api -d --restart always -p 3333:3000 \ -e TZAsia/Shanghai -e REDIS_CONN_STRINGredis://192.168.0.3:6379 -e SYNC_FREQUENCY60 -e SQL_DSNroot:123456tcp(192.1…

springboot整合junit-用于测试用例

package impl;public interface BookDao {public void save(); }第一步&#xff1a;打开软件&#xff0c;点击file&#xff0c;点击new 然后选择module&#xff0c;在右侧选择springboot 第二步&#xff1a;选择配置和JDK以及java版本 ①选择maven类型 ②选择JDK1.8版本 ③选…

极限两边夹定理

极限两边夹定理 1. 定义 两边夹定理 (又称作夹逼定理) 说的是&#xff0c;如果一个函数 f f f 被夹在函数 g g g 和函数 h h h 之 间&#xff0c;当 x → a x \rightarrow a x→a 时&#xff0c;这两个函数 g g g 和 h h h 都收敛于同一个极限 L L L&#xff0c;那么当…

全国区块链职业技能大赛样题第9套后端源码

后端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746050 前端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746216 智能合约+数据库表设计:https://blog.csdn.net/Qhx20040819/article/details/140746646 项目预览 登录 用户管理

JavaScript获取URL参数的几种方法

前言 在前端开发中&#xff0c;处理URL参数是一个常见的任务&#xff0c;尤其是在没有框架支持的情况下。虽然许多框架提供了方便的方法来获取URL参数&#xff0c;但有时我们需要依赖原生JavaScript来完成这个任务。这也是面试中经常出现的问题之一。今天让我们一起来探讨如何…

LRTimelapse Pro 7.0 安装教程

软件介绍 LRTimelapse Pro (LRT) 是一款专业的延迟摄影编辑渲染工具&#xff0c;具有高清输出、简单易用、无缝转换等特点。是非常强大的一款延迟摄影工具&#xff01;LRTimelapse Pro可以将您的影片提升一个水准。 程序可以配合 Adobe Lightroom, Adobe Camera RAW 和 Adobe…

2024年孝感中级职称报名开始了吗?

2024年孝感中级职称申报终于开始了&#xff0c;之前参加过水测的小伙伴们&#xff0c;开始准备评审了 2024年孝感本批次申报时间&#xff1a;中级、初级职称网上申报时间:2024年8月1日至8月31日。 注意&#xff1a;个人通过“湖北省职称评审管理信息系统”申报&#xff0c;须先…

Llama 3.1 重磅发布,登顶开源大模型王座!

7月23日&#xff0c;Meta正式发布迄今为止最强大的开源模型——Llama 3.1 405B&#xff0c;同时发布了全新升级的Llama 3.1 70B和8B模型。 Meta在正式发布里也附上了长达92页的论文《The Llama 3 Herd of Models》&#xff0c;揭示了Llama 3模型的技术和训练细节。 论文地址&am…