React状态管理相关
关于React状态管理的一些想法
我最开始使用React的时候,那个时候版本还比较低(16版本以前),所以状态管理都是靠React自身API去进行管理,但当时最大的问题就是跨组件通信以及状态同步和状态共享的问题,因为React是自上而下的数据流处理方式,仅仅通过提取到公共父组件内的方式还是比较麻烦,而且当时Context的API无法透传组件的问题也导致React自身很难去解决这些问题,于是我就引入了Redux。
Redux最大的优势是在于它的状态可回溯,整个流程比较清晰且无副作用,而且对于一个多人合作的大型项目来说,它的强规约性起到了很好的作用,配合React-redux解决了刚刚提到的几个问题。
但是随着业务代码不断增多,Redux的模板代码也越来越多,特别是action和reducer这些文件夹也越来越多,一个项目几十个actionType,确实后期会比较头疼,而且改一处动全身,开发工作量增加很多。Redux本身内部是无脑的发布订阅的模式,每次dispatch一个action都会遍历所有的reducer,因此订阅多了之后计算浪费等性能问题也随之而来,尽管我使用了reselect、immutable等优化方案,但还是会有少量的页面卡顿现象,因此最终还是只能考虑别的状态管理方案。
mobx是我们选的第二个方案,这个也是Redux的作者Dan abramov的推荐,它的内部实现有点类似于Vue,最新的Mobx 5也是利用proxy来追踪属性,之前的版本都是Object.defineProperty,通过隐式订阅自动追踪被监听的对象的变化,然后触发组件更新,这种数据劫持的方式在状态管理上自然会方便很多,比起Redux的一套纯净而复杂的流程,直接修改数据要简单很多。
(
PS: 为什么mobx要从 Object.defineProperty 升级到 proxy?包括Vue 3.0也是
首先要清楚如何利用Object.defineProperty进行数据双向绑定的。
劫持getter和setter,在getter中做数据依赖收集处理,在setter中监听数据的变化,并通知订阅当前数据的地方,从而进行UI的绘制。
因为原先 Object.defineProperty 最大的问题是:
1,无法检测到新的属性添加和删除(在初始化之后添加的);
2,无法监控到数组下标的变化,导致直接通过数组下标给数组设置值无法实时响应;
3,当data数据较深时会有性能问题;
而proxy可以解决上述问题,原因是proxy是对对象进行拦截,无论新增还是删除对象的属性,都必须先走这层拦截。
但是Proxy有个问题是兼容性的问题,IE浏览器不支持,所以在IE浏览器上会自动降级为Object.defineProperty
)
mobx最大的优势就是代码量少,而且更新粒度精准,实现局部更新。但是使用一段时间后也发现了一些缺点,比如对于一些复杂且数据结构层比较深的时候,UI更新会出问题,而且当多个组件共享某个状态的时候,由于是直接修改的状态,因此当状态更新出错时,回溯能力就比较弱了,来源不清晰,无法定位问题组件,还有就是mobx没有中间件,对于异步数据流的处理也比较弱,而redux这点就比较优势,因为它提供了中间件。
我后来还尝试使用了rxjs来进行状态管理,因为有mobx的实践经验,对于这种函数响应式开发并不陌生。rxjs最大的优势在于处理数据流有着一套强大的工具库,类似于lodash,但是后来发现仅仅利用这个来帮助react管理状态,确实有点大材小用了。不过有一个redux-observable的中间件,可以搭配redux去处理一些异步数据流,这个还是比较好的。
React状态管理相关的更多相关文章
- 借鉴redux,实现一个react状态管理方案
react状态管理方案有很多,其中最简单的最常用的是redux. redux实现 redux做状态管理,是利用reducer和action实现的state的更新. 如果想要用redux,需要几个步骤 ...
- 纯粹极简的react状态管理组件unstated
简介 unstated是一个极简的状态管理组件 看它的简介:State so simple, it goes without saying 对比 对比redux: 更加灵活(相对的缺点是缺少规则,需要 ...
- react状态管理器之mobx
react有几种状态管理器,今天先来整理一下mobx状态管理器,首先了解一下什么是mobx 1.mobx成员: observable action 可以干嘛: MobX 的理念是通过观察者模式对数据做 ...
- React状态管理之redux
其实和vue对应的vuex都是差不多的东西,这里稍微提一下(安装Redux略过): import { createStore, combineReducers, applyMiddleware } f ...
- HttpClient_HttpClient 4.3.6 HTTP状态管理
HTTP状态管理 最初的HTTP被设计成以状态.请求/应答为导向的协议,它被制作成是没有特殊条款的,以便在状态会话中能交换逻辑关系请求/应答.HTTP协议越来越受欢迎和被采用,越来越多的系统会在应用程 ...
- httpclient http状态管理
HTTP状态管理 最初,Htt被设计成一个无状态的面向请求响应的协议,所以它不能再逻辑相关的http请求/响应中保持状态会话. 由于越来越多的系统使用http协议,其中包括http从来没有想支持的系统 ...
- Part2-HttpClient官方教程-Chapter3-HTTP状态管理
ps:近日忙于课设与一个赛事的准备....时间真紧啊~~ 最初,HTTP被设计为一种无状态的,面向请求/响应的协议,它并没有为跨越多个逻辑相关的请求/响应交换的有状态会话做出特殊规定.随着HTTP协议 ...
- 你再也不用使用 Redux、Mobx、Flux 等状态管理了
Unstated Next readme 的中文翻译 前言 这个库的作者希望使用 React 内置 API ,直接实现状态管理的功能.看完这个库的说明后,没有想到代码可以这个玩.短短几行代码,仅仅使用 ...
- Flutter 对状态管理的认知与思考
前言 由 编程技术交流圣地[-Flutter群-] 发起的 状态管理研究小组,将就 状态管理 相关话题进行为期 两个月 的讨论. 目前只有内定的 5 个人参与讨论,如果你对 状态管理 有什么独特的见解 ...
随机推荐
- log4j2 自动删除过期日志文件配置及实现原理解析
日志文件自动删除功能必不可少,当然你可以让运维去做这事,只是这不地道.而日志组件是一个必备组件,让其多做一件删除的工作,无可厚非.本文就来探讨下 log4j 的日志文件自动删除实现吧. 0. 自动删除 ...
- [转]Nginx限流配置
原文:https://www.cnblogs.com/biglittleant/p/8979915.html 作者:biglittleant 1. 限流算法 1.1 令牌桶算法 算法思想是: 令牌以固 ...
- 3月28日考试 题解(二分答案+树形DP+数学(高精))
前言:考试挂了很多分,难受…… --------------------- T1:防御 题意简述:给一条长度为$n$的序列,第$i$个数的值为$a[i]$.现让你将序列分成$m$段,且让和最小的一段尽 ...
- 每日一道 LeetCode (6):有效的括号
每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...
- python5.2文件写入
fh=open(r"C:\55.txt","w")#文件编写新的文字,替代原有的文字!w:writedata = "努力让生活更美好!"fh ...
- 024_go语言中的缓冲通道
代码演示 package main import "fmt" func main() { messages := make(chan string, 2) messages < ...
- zuul路由网关集成ssl,实现http到https的转变
1 前言 最近几天刚开始接触微信小程序的开发,才接触到了https的概念(微信小程序中的请求必须为https请求,不然请求无法成功).https算是对http的安全封装,在http的基础上加了ssl证 ...
- Jenkins(Extended E-mail Notification)邮箱配置正确但是并没有发送邮件
废话 近期在把之前的接口自动化demo与jenkins集成,昨天发现了邮件配置正确但是没有发送邮件的问题,通过勾选系统设置 - >Extended E-mail Notification -&g ...
- 一篇看懂Socket开发
Socket[套接字]是什么,对于这个问题,初次接触的开发人员一般以为他只是一个通讯工具. Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发 T ...
- golang 设计模式
前言 不做文字的搬运工,多做灵感性记录 这是平时学习总结的地方,用做知识库 平时看到其他文章的相关知识,也会增加到这里 随着学习深入,会进行知识拆分和汇总,所以文章会随时更新 参考的文章过多.很杂很乱 ...