vite+react 使用 react-activation 实现缓存页面

news2024/12/23 7:00:05

对应的版本


"react": "^18.2.0",
"react-activation": "^0.12.4",
"react-dom": "^18.2.0",
"react-router-dom": "^6.15.0",

react-activation

这是一个npm包,在react keep alive中用的人数应该是最多的包.
这是GitHub地址react-activation

安装

yarn add react-activation
# 或者
npm install react-activation
# 或者
pnpm install react-activation 

   现在 main.tsx  入口文件中 使用 

import ReactDOM from "react-dom/client";
import { BrowserRouter } from "react-router-dom";
import App from "./App.tsx";
import { AliveScope } from "react-activation";

const { VITE_PROJECT_BASE } = import.meta.env;

ReactDOM.createRoot(document.getElementById("root")!).render(
      <BrowserRouter basename={VITE_PROJECT_BASE}>
        <AliveScope>  //  添加这个 AliveScope
          <App />
        </AliveScope>
      </BrowserRouter>
);

  route.ts 路由文件中的使用

import { Outlet } from "react-router-dom";
import { RoutesTypes } from "@/types/routesType";
import { TableOutlined } from "@ant-design/icons";
import KeepAlive from "react-activation";  // 添加这个 包裹对应的组件
// id  是 用作 唯一标识的  name 的 是 后期 调用  react-activation 对应方法,去除,和刷新组件

// 房间
import RoomList from "@/pages/RoomManagement/RoomList/index.tsx";

// 公播
import PublicBroadcastingList from "@/pages/PublicBroadcastingManagement/PublicBroadcastingList/index.tsx";
import DefaultPublicBroadcasting from "@/pages/PublicBroadcastingManagement/DefaultPublicBroadcasting/index.tsx";

// 设备
import DeviceList from "@/pages/DeviceManagement/DeviceList/index.tsx";
import DeviceConfiguration from "@/pages/DeviceManagement/DeviceConfiguration/index.tsx";

const routes: RoutesTypes[] = [
  {
    sort: 1,
    path: "/layout/sass-platform",
    element: <Outlet />,
    meta: {
      title: "测试平台",
    },
    children: [
      {
        path: "/layout/sass-platform/room-management",
        element: <Outlet />,
        meta: {
          title: "房间管理",
          icon: TableOutlined,
        },
        children: [
          {
            path: "/layout/sass-platform/room-management/room-list",

            element: (
              <KeepAlive
                id="/layout/sass-platform/room-management/room-list"
                name="/layout/sass-platform/room-management/room-list"
              >
                <RoomList />
              </KeepAlive>
            ),
            meta: {
              title: "房间列表",
              icon: TableOutlined,
            },
          },
        ],
      },
      {
        path: "/layout/sass-platform/public-broadcasting-management",
        element: <Outlet />,
        meta: {
          title: "公播管理",
          icon: TableOutlined,
        },
        children: [
          {
            path: "/layout/sass-platform/public-broadcasting-management/public-broadcasting-list",
            element: (
              <KeepAlive
                id="/layout/sass-platform/public-broadcasting-management/public-broadcasting-list"
                name="/layout/sass-platform/public-broadcasting-management/public-broadcasting-list"
              >
                <PublicBroadcastingList />
              </KeepAlive>
            ),
            meta: {
              title: "公播列表",
              icon: TableOutlined,
            },
          },
          {
            path: "/layout/sass-platform/public-broadcasting-management/default-public-broadcasting",
            element: (
              <KeepAlive
                id="/layout/sass-platform/public-broadcasting-management/default-public-broadcasting"
                name="/layout/sass-platform/public-broadcasting-management/default-public-broadcasting"
              >
                <DefaultPublicBroadcasting />
              </KeepAlive>
            ),
            meta: {
              title: "默认公播",
              icon: TableOutlined,
            },
          },
        ],
      },
      {
        path: "/layout/sass-platform/device-management",
        element: <Outlet />,
        meta: {
          title: "设备管理",
          icon: TableOutlined,
        },
        children: [
          {
            path: "/layout/sass-platform/device-management/device-list",
            element: (
              <KeepAlive
                id="/layout/sass-platform/device-management/device-list"
                name="/layout/sass-platform/device-management/device-list"
              >
                <DeviceList />
              </KeepAlive>
            ),
            meta: {
              title: "设备列表",
              icon: TableOutlined,
            },
          },
          {
            path: "/layout/sass-platform/device-management/device-configuration",
            element: (
              <KeepAlive
                id="/layout/sass-platform/device-management/device-configuration"
                name="/layout/sass-platform/device-management/device-configuration"
              >
                <DeviceConfiguration />
              </KeepAlive>
            ),
            meta: {
              title: "设备配置",
              icon: TableOutlined,
            },
          },
        ],
      },
    ],
  },
];

export default routes;

缓存的路由的不能懒加载

最后 路由的显示

Outlet 放置位置

文档:https://github.com/CJY0208/react-activation/blob/master/README_CN.md

手动控制缓存

使用 withAliveScope 或 useAliveController 获取控制函数

import KeepAlive, { withAliveScope, useAliveController } from 'react-activation'

//hook 函数式组件
function app(){
    const { drop, dropScope, clear, getCachingNodes } = useAliveController()
}

//class 类组件
@withAliveScope
class App extends Component {
    render() {
        const { drop, dropScope, clear, getCachingNodes } = this.props
    }
}
  • drop(name) 卸载缓存,不包括嵌套的KeepAlive
  • dropScope(name) 卸载缓存,包括嵌套的所有KeepAlive
  • refresh(name) 刷新缓存状态,不包括嵌套的KeepAlive
  • refreshScope(name) 刷新缓存状态,包括嵌套的所有KeepAlive
  • clear() 清空所有缓存
  • getCachingNodes() 获取所有缓存中的节点

KeepAlive属性 

属性名类型备注
whenBoolean、Array、Function

Boolean (true-卸载时缓存 false-卸载时不缓存)

Array (第 1 位参数表示是否需要在卸载时缓存

第 2 位参数表示是否卸载 <KeepAlive> 的所有缓存内容,包括 <KeepAlive> 中嵌的 <KeepAlive>

// 例如:以下表示卸载时不缓存,并卸载掉嵌套的所有 `<KeepAlive>`
<KeepAlive when={[false, true]}>
  ...
  <KeepAlive>
    ...
    <KeepAlive>...</KeepAlive>
    ...
  </KeepAlive>
  ...
</KeepAlive>

Function (返回值为上述 Boolean 或 Array)

saveScrollPosition

Boolean自动保存滚动位置(默认true)
namestring缓存标识

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

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

相关文章

Linux服务器查看CPU相关信息

文章目录 一、基本概念cpu个数cpu核数超线程技术 二、查看命令查看CPU型号查看物理CPU个数&#xff08;物理层面&#xff09;查看每个物理CPU中core个数(核数)查看逻辑CPU个数&#xff08;逻辑层面&#xff09; 三、以上概念的关系参考资料 一、基本概念 cpu个数 物理cpu个数…

图神经网络系列之序章

文章目录 一、为什么需要图神经网络&#xff1f;二、图的定义1.图的定义和种类2.一些关于图的重要概念2.1 子图2.2 连通图2.3 顶点的度、入度和出度2.4 边的权和网2.5 稠密图、稀疏图 3.图的存储结构3.1 邻接矩阵3.2 邻接表3.3 边集数组3.4 邻接多重表3.5 十字链表3.6 链式前向…

华为云HECS云服务器docker环境下安装mysql

华为云HECS云服务器&#xff0c;已经安装了docker环境&#xff0c;准备下docker环境下安装mysql。 一、HECS云服务器安装docker 登录华为HECS云服务器&#xff0c;安装docker环境。 安装docker参考如下文章&#xff1a; 华为云HECS安装docker并安装mysql-CSDN博客 二、拉取…

Linux下的Docker安装,以Ubuntu为例

Docker是一种流行的容器化平台&#xff0c;它能够简化应用程序的部署和管理。 Docker安装 1、检查卸载老版本Docker&#xff08;为保证安装正确&#xff0c;尽量在安装前先进行一次卸载&#xff09; apt-get remove docker docker-engine docker.io containerd runc 2、Dock…

【栈与队列面试题】用队列实现栈(动图演示)

两个队列实现一个栈 前言&#xff1a; &#x1f4a5;&#x1f388;个人主页:​​​​​​Dream_Chaser&#xff5e; &#x1f388;&#x1f4a5; ✨✨刷题专栏:http://t.csdn.cn/UlvTc ⛳⛳本篇内容:力扣上栈与队列的面试OJ题目 目录 两个队列实现一个栈 队列的实现&#xf…

Java毕业设计-基于SpingBoot的网上图书商城

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1. 简介2 技术栈3.1系统功能 4系统设计4.1数据库设计 5系统详细设计5.1系统功能模块5.1系统功能…

Python 图像处理库PIL ImageOps笔记

# 返回一个指定大小的裁剪过的图像。该图像被裁剪到指定的宽高比和尺寸。 # 变量size是要求的输出尺寸&#xff0c;以像素为单位&#xff0c;是一个&#xff08;宽&#xff0c;高&#xff09;元组 # bleed&#xff1a;允许用户去掉图像的边界&#xff08;图像四个边界&#xff…

APP产品经理的职责(合集)

APP产品经理的职责1 职责&#xff1a; 1、根据部门发展规划、主动发掘业务需求&#xff0c;独立负责线上用户产品线的完整业务规划、产品设计、产品管理等工作; 2、负责协调BD、运营、研发、市场等各部门&#xff0c;共同推进新产品开发&#xff0c;确保产品能够保质按时上线…

C语言指针,深度长文全面讲解

指针对于C来说太重要。然而&#xff0c;想要全面理解指针&#xff0c;除了要对C语言有熟练的掌握外&#xff0c;还要有计算机硬件以及操作系统等方方面面的基本知识。所以本文尽可能的通过一篇文章完全讲解指针。 为什么需要指针&#xff1f; 指针解决了一些编程中基本的问题。…

linus调试器---gdb的操作介绍

目录 一.背景 二.gdb的常用的操作介绍 小技巧&#xff1a;gdb会记住上一次的命令&#xff0c;按回车即可打出上次的命令。 1.看代码 2.打断点 3.删断点 4.禁用与开启断点 5.查看断点信息 6.调试 7.调试 8.查看变量 9.运行至某行 10.打印变量值 11.从一断点直接运行…

《深入浅出OCR》第一章:OCR技术导论

✨专栏介绍&#xff1a; 经过几个月的精心筹备&#xff0c;本作者推出全新系列《深入浅出OCR》专栏&#xff0c;对标最全OCR教程&#xff0c;具体章节如导图所示&#xff0c;将分别从OCR技术发展、方向、概念、算法、论文、数据集等各种角度展开详细介绍。 &#x1f468;‍&…

github 网页显示不全?

问题 解决 1、检查网页&#xff0c;打开 network&#xff0c;重新刷新 github 网页 2、查看无法加载的资源&#xff08;如 css 文件&#xff09; 3、查看域名地址 https://tool.chinaz.com/dns/&#xff0c;github.githubassets.com&#xff08;检查网页元素&#xff0c;点击无…

奥威BI系统,BI界便宜大碗国货

奥威BI系统&#xff08;软件&#xff09;是BI行业高性价比典范&#xff0c;不仅是因为“BI方案”极大地降低项目周期、实施成本&#xff0c;也是因为奥威BI系统具备先进的技术和架构和卓越的性能&#xff0c;有简单易用的特点&#xff0c;也提供了丰富的功能。 1、先进的技术和…

linux系统报“INFO: task java:xxx blocked for more than 120 seconds.”解决办法

1、问题描述 linux系统&#xff0c;输入dmesg -T&#xff0c;报“INFO: task java:xxx blocked for more than 120 seconds.”&#xff0c;如下 一般情况下&#xff0c;linux会把可用内存的40%的空间作为文件系统的缓存。当缓存快满时&#xff0c;文件系统将缓存中的数据整体同…

基于SSM的民宿管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

安达发|APS排单软件中甘特图的应用

近几年来&#xff0c;企业对生产效率和管理水平的要求越来越高。为了提高生产效率&#xff0c;降低生产成本&#xff0c;许多企业开始引入先进的生产计划与调度系统&#xff08;APS&#xff09;&#xff0c;实现生产过程的自动化、智能化管理。APS排产软件是一种能够根据企业的…

【JDK 8-集合框架】5.1 Stream 实战

一、什么是 stream 二、操作步骤 三、概览stream接口源码 四、实战 执行结果&#xff1a; 一、什么是 stream Stream 中文称为“流” 通过将集合转换为“流”的元素队列 通过声明性方式&#xff0c;能够对集合中的每个元素进行一系列并行或串行的流水线操作 元素是特定类…

为何消费者宁愿买iPhone14,也不买国产5G手机?差距太大了

随着iPhone15的上市&#xff0c;国产5G手机与苹果的较量也正式展开&#xff0c;让人意外的是不仅是iPhone15备受追捧&#xff0c;连带着旧款的iPhone14Pro也取得了销量的上涨&#xff0c;与国产5G手机形成了鲜明的对比。 一、iPhone的优势 苹果的A系处理器在性能方面遥遥领先毋…

C++简单模板介绍——template

一、泛型编程 概念&#xff1a; 在c语言中&#xff0c;同一种功能的函数&#xff0c;由于参数类型不同&#xff0c;虽然可以用函数重载&#xff0c;但可能需要重复多次的定义&#xff0c;又或者是不同类型的数据需要用到同一种数据结构时&#xff0c;需要定义大部分重复的类&…

thrift的简单使用

写在前面 本文一起看下一种由facebook出品的rpc框架thrift。 源码 。 1&#xff1a;开发步骤 1:编写thrift idl文件 2&#xff1a;根据thrift idl文件生成java模板代码 3&#xff1a;继承模板代码的*.Iface接口给出server的具体服务实现 4&#xff1a;使用模板的HelloWorldSe…