iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >React中怎么实现状态自动保存
  • 184
分享到

React中怎么实现状态自动保存

2024-04-02 19:04:59 184人浏览 独家记忆
摘要

这篇文章给大家介绍React中怎么实现状态自动保存,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 什么是状态保存?假设有下述场景:移动端中,用户访问了一个列表页,上拉浏览列表

这篇文章给大家介绍React中怎么实现状态自动保存,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

 

什么是状态保存?

假设有下述场景:

移动端中,用户访问了一个列表页,上拉浏览列表页的过程中,随着滚动高度逐渐增加,数据也将采用触底分页加载的形式逐步增加,列表页浏览到某个位置,用户看到了感兴趣的项目,点击查看其详情,进入详情页,从详情页退回列表页时,需要停留在离开列表页时的浏览位置上

类似的数据或场景还有已填写但未提交的表单、管理系统中可切换和可关闭的功能标签等,这类数据随着用户交互逐渐变化或增长,这里理解为状态,在交互过程中,因为某些原因需要临时离开交互场景,则需要对状态进行保存

在 React 中,我们通常会使用路由去管理不同的页面,而在切换页面时,路由将会卸载掉未匹配的页面组件,所以上述列表页例子中,当用户从详情页退回列表页时,会回到列表页顶部,因为列表页组件被路由卸载后重建了,状态被丢失

如何实现 React 中的状态保存

Vue 中,我们可以非常便捷地通过 <keep-alive>[1] 标签实现状态的保存,该标签会缓存不活动的组件实例,而不是销毁它们

而在 React 中并没有这个功能,曾经有人在官方提过功能 issues[2] ,但官方认为这个功能容易造成内存泄露,表示暂时不考虑支持,所以我们需要自己想办法了

常见的解决方式:手动保存状态

手动保存状态,是比较常见的解决方式,可以配合 React 组件的 componentWillUnmount 生命周期通过 redux 之类的状态管理层对数据进行保存,通过 componentDidMount 周期进行数据恢复

在需要保存的状态较少时,这种方式可以比较快地实现我们所需功能,但在数据量大或者情况多变时,手动保存状态就会变成一件麻烦事了

作为程序员,当然是尽可能懒啦,为了不需要每次都关心如何对数据进行保存恢复,我们需要研究如何自动保存状态

通过路由实现自动状态保存(通常使用 react-router)

既然 React 中状态的丢失是由于路由切换时卸载了组件引起的,那可以尝试从路由机制上去入手,改变路由对组件的渲染行为

我们有以下的方式去实现这个功能

  1.  重写 <Route> 组件,可参考 react-live-route[4]

  重写可以实现我们想要的功能,但成本也比较高,需要注意对原始 <Route> 功能的保存,以及多个 react-router 版本的兼容

    2.  替换路由库为 react-keeper[5]

  完全替换掉路由方案是一个风险较大的事情,需要较为慎重地考虑3.

  3.  基于 <Route> 组件现有行为做拓展,可参考 react-router-cache-route[6]

  在阅读了 <Route> 的源码后发现,如果使用 component 或者 render 属性,都无法避免路由在不匹配时被卸载掉的命运

  但将 children 属性当作方法来使用,我们就有手动控制渲染的行为的可能,关键代码在此处 https://GitHub.com/ReactTraining/react-router/blob/master/packages/react-router/modules/Route.js#L41-L72

// 节选自 Route 组件中的 render 函数  if (typeof children === "function") {       childrenchildren = children(props); // children 是函数时,将对 children 进行调用得到真实的渲染结果  if (children === undefined) {         ...         children = null;       }     }  return (  <RouterContext.Provider value={props}>         {children && !isEmptyChildren(children) // children 存在时,将使用 children 进行渲染           ? children           : props.match             ? component               ? React.createElement(component, props)               : render                 ? render(props)                 : null // 使用 render 属性无法阻止组件的卸载             : null // 使用 component 属性无法阻止组件的卸载         }  </RouterContext.Provider>     );

基于上述源码探究,我们可以对 <Route> 进行拓展,将 <Route> 的不匹配行为由卸载调整为隐藏,如下

<Route exact path="/list">       {props => (           <div style={props.match ? null : { display: 'none' }}>               <List {...props} />           </div>       )}   </Route>

上述是最简的调整方式,实际情况中也需要考虑隐藏状态下 match 为 null 导致组件报错的问题,且由于不再是组件卸载,所以和 TransitionGroup 配合得不好,导致转场动画难以实现

使用 react-router-cache-route[7],得到的效果大致如下图,

React中怎么实现状态自动保存

上述探究了通过路由入手实现自动状态保存的可能,以及现有的实现,但终究不是真实的、纯粹的 KeepAlive 功能,接下来我们尝试探究真实 KeepAlive 功能的实现

模拟真实的 <KeepAlive> 功能

以下是期望的使用方式

function App() {  const [show, setShow] = useState(true)  return (  <div>  <button onClick={() => setShow(show => !show)}>Toggle</button>        {show && (  <KeepAlive>  <Test />  </KeepAlive>        )}  </div>    )  }

实现原理说起来较为简单,由于 React 会卸载掉处于固有组件层级内的组件,所以我们需要将 <KeepAlive> 中的组件,也就是其 children 属性抽取出来,渲染到一个不会被卸载的组件内,就可以实现此功能

以下是 react-activation[8] 的实现效果

在线示例[9]

React中怎么实现状态自动保存

关于React中怎么实现状态自动保存就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: React中怎么实现状态自动保存

本文链接: https://www.lsjlt.com/news/77718.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • React中怎么实现状态自动保存
    这篇文章给大家介绍React中怎么实现状态自动保存,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 什么是状态保存?假设有下述场景:移动端中,用户访问了一个列表页,上拉浏览列表...
    99+
    2022-10-19
  • react18中react-redux状态管理怎么实现
    这篇文章主要介绍“react18中react-redux状态管理怎么实现”,在日常操作中,相信很多人在react18中react-redux状态管理怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”rea...
    99+
    2023-06-30
  • 怎么使用Laravel和SSR实现保存登录状态
    这篇“怎么使用Laravel和SSR实现保存登录状态”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使用Laravel和S...
    99+
    2023-07-05
  • React Native中怎么实现动态导入
    这篇文章主要介绍“React Native中怎么实现动态导入”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“React Native中怎么实现动态导入”文章能帮助大家解决问题。背景...
    99+
    2023-07-02
  • Android中怎么通过自定义view实现动态柱状图
    这篇文章将为大家详细讲解有关Android中怎么通过自定义view实现动态柱状图,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。自定义viewpublic class Hi...
    99+
    2023-05-30
    android view
  • react跳转前记住页面状态怎么实现
    本教程操作环境:Windows10系统、react18.0.0版、Dell G3电脑。react跳转前记住页面状态怎么实现?React 页面返回保留上次状态需求页面A跳转到页面B然后再返回页面A,页面A要还原离开前的状态;页面A和页面B有多...
    99+
    2023-05-14
    跳转 React
  • windows中navicat怎么自动保存
    这篇文章主要介绍“windows中navicat怎么自动保存”,在日常操作中,相信很多人在windows中navicat怎么自动保存问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2022-12-05
    windows navicat
  • React远程动态组件怎么实现
    这篇文章主要介绍了React远程动态组件怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇React远程动态组件怎么实现文章都会有所收获,下面我们一起来看看吧。远程动态组件实现远程动态组件库远程动态组件库项...
    99+
    2023-07-05
  • Android应用中怎么实现自定义状态栏
    这篇文章给大家介绍Android应用中怎么实现自定义状态栏,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、目标:Android5.0以上二、步骤1、在res-values-colors.xml下新建一个RGB颜色 ...
    99+
    2023-05-31
    android roi
  • 怎么在React中进行事件驱动的状态管理
    本篇内容主要讲解“怎么在React中进行事件驱动的状态管理”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么在React中进行事件驱动的状态管理”吧!Store...
    99+
    2022-10-19
  • html5怎么实现动画播放状态
    今天小编给大家分享一下html5怎么实现动画播放状态的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2022-10-19
  • vue怎么实现动态的选中状态切换效果
    这篇文章主要介绍了vue怎么实现动态的选中状态切换效果的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue怎么实现动态的选中状态切换效果文章都会有所收获,下面我们一起来看看吧。动态选中状态切换效果 H...
    99+
    2023-06-30
  • React中怎么利用DOM实现动态吸底部
    React中怎么利用DOM实现动态吸底部,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。动态吸底:开始时fixed在页面上,当页面滚动到距离底部...
    99+
    2022-10-19
  • React组件状态下移和内容提升怎么实现
    本篇内容介绍了“React组件状态下移和内容提升怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言两个简单实用的优化组件渲染性能的方...
    99+
    2023-07-04
  • 怎么实现zabbix自定义监控nginx状态
    这篇文章主要介绍“怎么实现zabbix自定义监控nginx状态”,在日常操作中,相信很多人在怎么实现zabbix自定义监控nginx状态问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么实现zabbix自定义...
    99+
    2023-06-25
  • Nginx中怎么实现状态监控
    这期内容当中小编将会给大家带来有关Nginx中怎么实现状态监控,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。NginxStatus 显示的内容意思如下:active co...
    99+
    2022-10-19
  • Java如何实现properties文件动态修改并自动保存工具类
    这篇文章主要为大家展示了“Java如何实现properties文件动态修改并自动保存工具类”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java如何实现properties文件动态修改并自动保存...
    99+
    2023-05-30
    java properties
  • ExtJs怎么使用自定义插件动态保存表头配置
    这篇文章将为大家详细讲解有关ExtJs怎么使用自定义插件动态保存表头配置,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。关于保存列表表头的配置,一般我们不需要与后台交互,直...
    99+
    2022-10-19
  • Html5 Canvas如何实现图片标记、缩放、移动和保存历史状态功能
    这篇文章主要介绍Html5 Canvas如何实现图片标记、缩放、移动和保存历史状态功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!效果预览动图是放cdn的,如果访问不了,可以登录在线尝试尝试: test.algbb...
    99+
    2023-06-09
  • 微信小程序怎么实现自动保存下载文件名
    本篇内容介绍了“微信小程序怎么实现自动保存下载文件名”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!问题的提出小程序使用wx.playVoic...
    99+
    2023-06-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作