react中的keep-alive功能

react react-activation keep-alive 实现路由跳转返回保留组件状态 阅读详情

在vue中可以很方便的实现keep-alive功能,但是在react中却不是很方便,遇事不要慌,度娘来帮忙。

react-keep-alive

首先找到的是react-keep-alive,一波操作之后,发现原来显示的页面不显示了,唉,抬下去,下一个!

react-activation

这个真香,具体怎么使用不再介绍,请查看中文文档,使用的时候要认真查看文档,同一个父节点下,相同位置的 <KeepAlive> 默认会使用同一份缓存,要想实现多份需要增加动态id属性来区分。手动控制缓存(tabBar的关闭),给需要控制缓存的 <KeepAlive /> 标签增加 name 属性,使用 withAliveScope 或 useAliveController 获取控制函数。

小瑕疵(这并不是react-activation的问题)

被缓存的组件第二次打开不会执行生命周期的钩子函数,这样导致一些依赖执行生命周期的钩子函数才能正常显示的组件出现问题。大多数情况都可以通过react-activation提供的withActivation 装饰器或者使用 useActivate 与 useUnactivate hooks 钩子解决,但是我遇到的是跨项目的(组件库项目中的某个组件依赖执行生命周期的钩子函数才能正常显示)。

详细说一下问题,被缓存的页面a中包含一个组件库中的组件B,组件B中在componentDidMount中重置大小并且监听resize事件来重新计算大小,componentWillUnmount中移除监听。使用了react-activation之后就不会执行componentWillUnmount也就没有移除监听事件,当打开a页面,之后点开b页面(包含组件B,触发resize之后),返回到a页面,a页面中B组件显示异常。

  • 使用withActivation装饰器处理

    尝试在组件库的组件B中引入react-activationd的withActivation,结果发现并不会触发对应的钩子函数,查看源码可以了解到其依赖Context,不同的Context当然不会生效。于是开始尝试把withActivation通过window进行传递,这个方法可以解决,但是这样导致两个项目的耦合度很高,这样处理并不是很好。

  • 监听路由变化,触发resize事件

    首先尝试的是使用history的监听事件listen,在路由变化的时候很好的监听到,但是浏览器的前进后退事件触发的路由变化没监听到。因此使用监听window的popstate事件,此事件包含了history的监听事件,所以只使用这一个事件监听就好了。主动触发事件使用的是dispatchEvent,使用Event构造函数创建事件不兼容IE。

    const routeChangeCB = useCallback((e) => {
        let ev = document.createEvent('Event')
        ev.initEvent('resize', true, true)
        window.dispatchEvent(ev)
      }, []);
      useEffect(() => {
        window.addEventListener('popstate', routeChangeCB, false);
        return () => {
          window.removeEventListener('popstate', routeChangeCB)
        };
      }, [location])
    
react-activation -- 页签(适用Umi项目) 思路:通过react-activation实现页面缓存,通过umi-plugin-keep-alive将react-activation注入umi框架,封装页签组件最后通过路由的wrappers属性引入页面。浏览本博客之前先看一下我的博客实现的功能是否满足需求,实现功能:- 页面缓存- 关闭当前页- 鼠标右键>关闭当前- 鼠标右键>关闭其他- 鼠标右键>关闭左侧- 鼠标右键>关闭右侧- 鼠标右键>全部关闭(默认跳转到首页)- 鼠标右键>重新加载(刷新缓存页面) 阅读详情

相关推荐

umi-plugin-keep-alive:用于基于React激活的umijs

umi-plugin-keep-alive 中文说明 | 此 <KeepAlive> 功能基于 在线示例 umi 多 tabs 示例: 使用方法 安装 npm install umi-plugin-keep-alive --save # or yarn add umi-plugin-keep-alive 从 umi 中导出 KeepAlive,包裹在需要被缓存的组件上 import { useState } from 'react' import { KeepAlive } from 'umi' function Counter() { const [count, setCount] = useState(0) return ( <div> <p>count: {count}</p> <button onClick={() => setCount(c

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

react + ant design pro项目实现keep-alive页签

wzp6010625的博客 3352

JHU ICBM DTI Atlas纤维束模板介绍

JHU ICBM DTI atlas 纤维束的定位与功能介绍

machinelearning_er的博客 6425

React项目实现页面状态缓存(keep-alive)

React项目实现页面状态缓存(keep-alive)

看陌生的风景的博客 1055

C2000 ePWM与SDFM同步配置:从寄存器到Driverlib实战解析

在嵌入式实时控制系统中,脉宽调制(PWM)是实现电机驱动、数字电源等应用的核心技术,其信号质量和时序精度直接决定了系统性能。为实现精确控制,PWM信号常需与模数转换器(ADC)或Sigma-Delta滤波器(SDFM)的采样时刻严格同步,以消除开关噪声并获取准确的反馈信号。其技术原理在于通过硬件同步机制,将PWM的特定时间点(如周期中心)作为触发源,控制数据采集的启动时刻。这种硬件级同步能有效提升闭环控制的稳定性和动态响应速度,广泛应用于伺服驱动、变频器等高性能场景。本文聚焦于TI C2000系列微控制器,

weixin_33692284的博客 443

74HC165级联踩坑实录:STM32读取32路开关状态,时序调试与常见问题排查

本文详细介绍了74HC165级联在STM32读取32路开关状态时的时序调试与常见问题排查。从硬件设计的PCB布局优化、电源噪声控制,到软件时序的精确调校和数据采集策略,提供了完整的解决方案。通过逻辑分析仪和示波器的高效使用,解决了信号延迟和干扰问题,最终实现了稳定可靠的32路信号读取。

weixin_34046298的博客 313

关于 React 的 keep-alive 功能都在这里了(上)

一些关于react的keep-alive功能相关知识在这里(上)下一篇讲这类插件的"大坑", 如果你想全面了解的话一定要读下一篇哦。背景这是在2022年开发中PM提的一个需求, 某个table被用户输入了一些搜搜条件并且浏览到了第3页, 那如果我跳转到其他路由后返回当前页面, 希望搜索条件还在, 并且仍处于第三页, 这不就是vue里面的keep-alive标签吗, 但我当...

我本可以容忍阳光,如果我不曾见过太阳,然而阳光已使我荒凉,成为更新的荒凉。 4626

一些关于react的keep-alive功能相关知识在这里(下)

一些关于react的keep-alive功能相关知识在这里(下)本篇承接上篇内部, 所以是从第九点开始九、保留页面scroll比如页面上的table里有100条数据, 我们想看第100条数据, 那就要滚动不少距离, 不少场景这种滚动距离也是有必要保留的。这里使用的方法其实比较传统啦, 首先在KeepAliveProvider 下发一个处理滚动的方法:consthandl...

我本可以容忍阳光,如果我不曾见过太阳,然而阳光已使我荒凉,成为更新的荒凉。 899

Calpuff模型实战:从气象数据预处理到污染物扩散模拟全流程指南

本文提供了一份详尽的Calpuff模型实战指南,涵盖从气象数据预处理、地形处理到污染物扩散模拟与结果可视化的全流程。重点解析了Calmet气象场构建、Calpuff核心参数配置,并与AERMOD模型进行对比,帮助环境工程师与科研人员掌握这一强大的三维非稳态拉格朗日扩散模型,以应对复杂地形、海岸熏烟等实际模拟挑战。

s4t5u6v7的博客 458

YOLOv13|损失函数优化篇:Focal EIOU 保持良好性能的同时,提供更高效的计算和更稳定的训练过程-包源码

Focal IoU与EIoU:目标检测中的损失函数优化 摘要:本文深入探讨了目标检测中两种重要的边界框回归损失函数优化方法。Focal IoU借鉴Focal Loss思想,通过(1-IoU)^γ因子调节损失权重,使模型更关注难样本(低IoU预测框),有效解决了传统IoU Loss对难易样本权重相同的问题。EIoU则在CIoU基础上改进,通过简化长宽比计算、分离宽高损失项,提升了计算效率和训练稳定性。两种方法分别从样本权重分配和损失函数结构优化角度,显著提升了目标检测性能,为实际应用提供了更高效的解决方案。文

FJN110的博客 1864

React 中实现 vue keep-alive 功能的方法

React Router 的 React.lazy 和 Suspense 可以用于动态加载组件,并且可以结合 React.memo 或自定义的缓存逻辑来实现类似 keep-alive 的功能。 2. 使用自定义的 Higher-Order Component (HOC) 3. 使用 React Context 和自定义 Hook 4. 使用第三方库 有一些第三方库可以帮助实现类似 keep-alive 的功能,例如 react-keep-alive。

前端小白的博客 469

踩遍Windows所有坑:Codex CLI桌面端+命令行双环境安装避坑实战

Windows下装Codex CLI的坑,本质上都是Windows本身的路径、环境变量、权限、编码这些历史遗留问题,和工具本身关系不大。只要避开中文路径、正确配置PATH、注意终端环境差异,其实安装非常简单。这套双环境方案配好之后,桌面端适合可视化调试、多会话管理,终端适合嵌入编辑器、脚本调用,一套配置两边通用,体验还是很流畅的。按照上面的流程走,基本不会出大问题,就算出问题也能在排查表里找到对应解法。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 300

面试题:react如何实现keep-alive功能

场景推荐方案优势非路由组件(如标签)父组件状态缓存简单直观,无需额外依赖路由组件(简单需求)React Router + 自定义缓存容器灵活控制缓存逻辑,无第三方依赖路由组件(复杂需求)第三方库成熟稳定,支持钩子、手动清缓存等功能注意:缓存组件会占用内存,需避免缓存过多组件;若组件依赖外部数据(如接口),需在 “激活” 时重新校验数据有效性(如通过onActivate钩子刷新)。

m0_47999208的博客 931

西南科技大学模拟电子技术实验二(二极管特性测试及其应用电路)预习报告

3、用二极管正向虚拟IV仪测出数据,并记录数据于虚表3和虚表4。1、按照指导书multisim仿真软件上画出三种模型电路图,1、按照指导书multisim仿真软件上画出三种模型电路图,1、按照指导书multisim仿真软件上画出三种模型电路图,表6 二极管三种模型参数测试表(电源电压=1.2V)2、用万用表测出数据,并记录数据于虚表1和虚表2。2、用万用表测出数据,并记录数据于虚表5和虚表6。表5 二极管三种模型参数测试表(电源电压=12V)二极管三种模型参数测试表(电源电压=12V)

Welcome To My6n Blog 4080

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

在React中实现和Vue一样舒适的keep-alive

写在开头在vue中有天然的keep-alive这个功能实现,react也有一个库,react-keep-alive,但是这个库是直接进行dom操作,会导致数据驱动失效,断层至于为什么会失...

petertanjinjie的博客 4027

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

在 React 中实现类似 Vue 的 Keep-Alive:原理、实现与 LRU 算法

keep-alive是 Vue 提供的一个内置组件,用于缓存动态组件。通过keep-alive包裹的组件会在切换时保留状态和 DOM,而不是完全销毁和重新创建。这种缓存方式极大地提高了应用的性能和响应速度,尤其适合需要频繁切换的视图组件(如选项卡、嵌套路由等)。主要特点状态持久化:被缓存的组件保留其内部状态和 DOM。生命周期控制:组件在被缓存时不会触发destroyed生命周期,而是触发,当从缓存中激活时会触发activated。在大型前端项目中,组件的动态缓存功能对性能有显著提升。Vue 的。

qq_36193912的博客 1467

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

React之keep-alive组件

React之keep-alive组件

在所有的事情背后,要有一颗坚定的的本心,要有一颗应对变革和提升自我的本心,世界瞬息万变,本心要坚持到底,保持学习,时刻复盘 1035

react-keep-alive 缓存使用

今天来说说,react 的路由缓存,这个在react 中很少有实质性可用的资料!此篇记录一下 demo请狠狠的戳这里¥ http://download.lllomh.com/cliect/#/product/J804099672377354 demo 请狠狠的戳这里 c https://download.csdn.net/download/lllomh/12684925 导入 之后 : import { Provider, KeepAlive, } from 're...

lllomh的博客 1842

React - keep-alive

React 没有提供类似 Vue <keep-alive> 缓存页面不销毁的功能。在 Github 上,有用户提了相关的 issues:can React support feature like keep-alive in Vue? 但 React 的开发者认为新增“缓存页面”功能需要修改原有的代码,并且“缓存页面”容易造成内存溢出,他们并不推荐用户使用/依赖该功能,并给与了其他解...

sinat_33184880的博客 1000

React 怎么实现 Vue 的 <keep-alive> 组件

如果你用过 Vue,那肯定知道它有一个非常好用的组件(keep-alive)能够保持组件的状态来避免重复重渲染。 有时,我们希望在列表页面进入详情页面后,缓存列表页面的状态;当从详情页面返回列表页面时,列表页面还是和切换前一样。 这实际上挺难实现的,因为 React 中的组件一旦卸载就无法重用。在 issue #12039 中提出了两种解决方案;通过样式来控制组件的显示(display:none ...

weixin_33984032的博客 675

如何在React中实现keep-alive?

写在开头不推荐你使用本文这个库,这个库会造成数据驱动断层(即你缓存后,切换回来,确实可以看到跟之前一样的dom,但是数据驱动此时失效了),下周我会写另外一个可以不断层的库解析❝现代框架的...

petertanjinjie的博客 7325

【React】react 中如何实现像 vue 中的 keep-alive?

React 没有内置的keep-alive最简单的方法是条件渲染时用隐藏而不是卸载;或者把子组件的状态提升到父组件,保证组件重挂载后状态不丢;另外,社区有成熟库,能提供类似 Vuekeep-alive的缓存机制。

小秀的博客 525

react-router-cache-route — 页面缓存插件

react-router-cache-route — 页面缓存插件 功能 此插件可以满足缓存上一页的功能,即:返回上一页的时候,上一页的滚动条、动作状态等等和离开这个页面时的状态保持一致。 简介 搭配 react-router 工作的、带缓存功能的路由组件,类似于 Vue 中的 keep-alive 功能。 原理 Route 中配置的组件在路径不匹配时会被卸载(render 方法中 return null),对应的真实节点也将从 dom 树中删除,利用Route暴露的children方法,让我们手动控制渲

weixin_45315794的博客 1621

react实现vue中的keep-alive

在 Vue 中,keep-alive 是一个内置组件,用于缓存组件状态并防止组件的卸载。当组件被缓存时,其状态将保持不变,从而提高性能和用户体验。你可以在 React 中自己实现类似功能的 keep-alive 组件,以便于在组件之间切换时,保持其状态。以下是一个在 React 中实现 keep-alive 的示例,并使用 React Hooks 来管理状态。

dashuforever的博客 384
上一篇: 前端搭建环境
xiaojinglyd
博客等级 码龄9年 6粉丝 29原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值