react-keepalive-router实现路由缓存方案
项目背景:react项目使用Route进行路由切换,需求是不同的路由切换后,页面进行缓存,重新切换页面之后,使用缓存的页面不再重新请求接口数据
原本实现:原来没有实现路由缓存,然后实现了操作页面dom进行display:none来进行页面隐藏,实现上述要求
优化:使用react-keepalive-router实现路由改造
1.首先实现一下通过react-keepalive-router进行路由缓存优化
实现原理:
初始化:选择该页面,读取页面内容
切换页面:将当前页面存入缓存,查看当前页面是否在缓存中,是的话直接读取缓存,否的话打开新页面
销毁页面:当缓存进行清除
实现过程:
(1)安装
npm install react-keepalive-router --save
(2)缓存域
import { KeepaliveRouterSwitch, KeepaliveRoute, addKeeperListener } from 'react-keepalive-router' <KeepaliveRouterSwitch> <KeepaliveRoute exact path='/' render={() => <Redirect to='/dashboard' />} /> {routes.map( ({ isKeepDisabled = false, path, ...dynamics }, key) => { return <KeepaliveRoute shouldKeep={shouldKeep} key={key} exact path={path} component={dynamic({ app, ...dynamics })} /> } )} </KeepaliveRouterSwitch>
(3)清除缓存
cacheDispatch({ type:'reset' }) cacheDispatch({ type:'reset',payload:'cacheId' }) cacheDispatch({ type:'reset',payload:['cacheId1','cacheId2'] })
其实本质上也是实现dom的隐藏与显示
2.使用dom显示与隐藏来进行路由缓存
通过包装keepRoute,在其上实现路由问题
<Route exact path='/' render={() => <Redirect to='/dashboard' />} /> {routes.map( ({ isKeepDisabled = false, path, ...dynamics }, key) => { const Component = isKeepDisabled ? Route : KeepRoute; return <Component shouldKeep={shouldKeep} key={key} exact path={path} component={dynamic({ app, ...dynamics })} /> } )}
const KeepRoute = withRouter(keep(Route)) render() { const { matched, pageRoot } = this.state; return matched ? <div className={this.props.path} ref={this.savePageRoot} style={{ height: '100%' }}> <KeepContext.Provider value={{ matched, pageRoot, onPageShow: this.onPageShow, onPageHide: this.onPageHide }}> {<Route {...this.props} />} </KeepContext.Provider> </div> : null }
参考文档:https://juejin.cn/post/6922340460136513549(强推,写的很好)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构