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

React如何实现Vue的keepAlive功能

前言

在React中,默认情况下组件在被卸载后会销毁状态,这与Vue的keep-alive功能不同。在Vue中,keep-alive组件可以缓存组件状态,在路由切换时重新挂载。实现这一功能在React中并不简单,但我们可以借助一个第三方库——react-activation 来模拟Vue的keep-alive功能。

react-activation简介

可以看看github介绍:react-activation
react-activation 是一个用于React的状态保持库,可以缓存组件的状态和DOM,适用于多页面应用的路由缓存等场景。它的核心功能包括:

  • 缓存组件:在不卸载组件的情况下保存其状态和DOM。
  • 恢复组件:当组件重新激活时,可以保留之前的状态和DOM,而无需重新渲染。
  • 缓存控制:可以通过配置选项控制哪些组件需要缓存,哪些不需要。

react-activation安装

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

兼容性

  • React v16 / v17 / v18

  • Preact v10+

  • 兼容 SSR

注意!!!

  • 不要使用 <React.StrictMode /> 严格模式
  • (React v18+) 不要使用 ReactDOMClient.createRoot, 而是使用 ReactDOM.render

项目里代码实现

入口文件main.tsx

在不会被销毁的位置放置 外层,一般为应用入口处

import { render } from 'react-dom';
import { AliveScope } from 'react-activation';
render(
  <AliveScope>
    <Router>
      <App />
    </Router>
  </AliveScope>,
  document.getElementById('root')
);

路由文件 router.tsx

export const routes = [
  {
    path: '/',
    element: <Home />,
    keepAlive: true
  },
  {
    path: '/home',
    element: <Home />,
    keepAlive: true
  },
  {
    path: '/xxx',
    element: <Index2 />
  },
]

App.tsx文件

这里可以根据router.tsx的配置看是否需要缓存, 引入KeepAlive组件,设置cacheKey来避免冲突

function App() {
const location = useLocation();
const route = useRoutes(
    routes.map(item => ({
      ...item,
      element: item.keepAlive ? (
        <KeepAlive cacheKey={item.path}>{item.element}</KeepAlive>
      ) : (
        item.element
      )
    }))
  );
  // 这里根据是否为首页设置z-50是因为在首页有多个Popup,缓存了首页后点击Popup的里面内容跳转别的页面,这个Popup因为层级很高,并且和root是同级节点所以会一直存在,所以给这些Popup也要设置层级z-10,这样在跳转至别的页面时,这些Popup的层级10没有50高就不会出现
return (
	<div
         className={`w-full h-screen flex justify-center  bg-primary  relative ${
           location.pathname === '/home' || location.pathname === '/'
             ? ''
             : 'z-50'
         }`}
       >
        <div className="w-[393px] h-screen">
        {route}
        </div>
    </div>
	)
}

总结

react-activation 是一个非常实用的库,能够帮助我们在React中实现类似于Vue keep-alive的缓存功能。在单页面应用中,合理地使用KeepAlive来缓存组件,可以显著提升用户体验,减少重复渲染带来的性能消耗。 引入KeepAlive组件,设置cacheKey来避免冲突,是最重要的!


http://www.kler.cn/a/370471.html

相关文章:

  • 【数据分享】1929-2024年全球站点的逐日平均气温数据(Shp\Excel\免费获取)
  • K8s学习
  • Output
  • 2024年博客之星年度评选—创作影响力评审入围名单公布
  • 考前64天 学习笔记 - 形成“习惯体系”进行最小启动
  • Phi小模型开发教程:用C#开发本地部署AI聊天工具,只需CPU,不需要GPU,3G内存就可以运行,不输GPT-3.5
  • 深入了解 kotlinx-datetime:配置与使用指南
  • C++编写台达ME300变频器串口通讯实例
  • 语音提示器-WT3000A离在线TTS方案-打破语种限制/AI对话多功能支持
  • QT-使用QSS美化UI界面
  • Jenkins+RobotFramework 失败用例重执行方案
  • 高级java每日一道面试题-2024年10月22日-JVM篇-JVM堆栈概念,何时销毁对象?
  • 一二三应用开发平台自定义查询设计与实现系列2——查询方案功能实现
  • docker install redis【docker 安装 redis】
  • 【密码学】CKKS全同态加密方案浅析
  • 八大排序算法——堆排序
  • R语言机器学习算法实战系列(十三)随机森林生存分析构建预后模型 (Random Survival Forest)
  • Flutter Image和Text图文组件实战案例
  • vue使用高德地图实现轨迹显隐
  • 第6次CCF CSP认证真题解
  • CSS.导入方式
  • 字符串及正则表达式
  • vue 果蔬识别系统百度AI识别vue+springboot java开发、elementui+ echarts+ vant开发
  • 已经安装好Ubuntu,10分钟配好Anaconda3
  • Tomcat作为web的优缺点
  • 【前端基础】如何判断鼠标选中文本的方向