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 个人参与讨论,如果你对 状态管理 有什么独特的见解 ...
随机推荐
- Linux的VMWare下Centos7的三种网络配置过程(网络二)
Linux之VMWare下Centos7的三种网络配置过程 环境:虚拟软件:VMWare 14.0客户机:windows 10虚拟机:centos 7 VMware三种网络连接方式 Bridge(桥接 ...
- Pytest单元测试框架-allure测试报告
Allure Test Report 对于不同的编程语言,有很多很酷的测试框架.不幸的是,它们中只有少数能够提供测试执行输出的良好表示.Qameta软件测试团队正在致力于Allure--一个开源框架, ...
- AsyncTask被废弃了,换Coroutine吧
本文主要是学习笔记,有版权问题还请告知删文 鸣谢:guolin@第一行代码(第三版) 你是否也在最近的代码中看见了 AsyncTask 被一条横杠划掉了 这表明--他要被Google放弃了 Googl ...
- 插槽slot使用方法
<slot>为vue的内置标签:用于给组件定义一个插槽,在这个插槽里传入内容(可以是模板代码或者组件),达到动态改变组件的目的. v-slot指令:绑定内容到指定插槽,v-slot 只能添 ...
- 谁来教我渗透测试——黑客必须掌握的HTML基础(二)
今天我们继续看看html的学习笔记. 文本标签 标题标签<hn> 将文本设置为标题显示的标签对.设定标题字体大小,n=1(大)~6(小),标题大小一共有6种,也就是从<h1>… ...
- C#LeetCode刷题-树
树篇 # 题名 刷题 通过率 难度 94 二叉树的中序遍历 61.6% 中等 95 不同的二叉搜索树 II 43.4% 中等 96 不同的二叉搜索树 51.6% 中等 98 验证二叉搜索树 ...
- JavaScript async/await 基础知识
async 作用: async函数返回一个 Promise对象,无论内部有没有await关键字. await 作用: await等待的是一个表达式,这个表达式的计算结果是 Promise 对象 或者是 ...
- notepad++ 设置支持golang语法高亮
see https://stackoverflow.com/questions/27747457/golang-plugin-on-notepad
- unity3d学习笔记(一) 第一人称视角实现和倒计时实现
unity3d学习笔记(一) 第一人称视角实现和倒计时实现 1. 第一人称视角 (1)让mainCamera和player(视角对象)同步在一起 因为我们的player是生成的,所以不能把mainCa ...
- low-code 与 20 年前的 Dreamweaver 有什么区别?
一.low-code 是什么? A low-code development platform (LCDP) is software that provides a development envir ...