关于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状态管理相关的更多相关文章

  1. 借鉴redux,实现一个react状态管理方案

    react状态管理方案有很多,其中最简单的最常用的是redux. redux实现 redux做状态管理,是利用reducer和action实现的state的更新. 如果想要用redux,需要几个步骤 ...

  2. 纯粹极简的react状态管理组件unstated

    简介 unstated是一个极简的状态管理组件 看它的简介:State so simple, it goes without saying 对比 对比redux: 更加灵活(相对的缺点是缺少规则,需要 ...

  3. react状态管理器之mobx

    react有几种状态管理器,今天先来整理一下mobx状态管理器,首先了解一下什么是mobx 1.mobx成员: observable action 可以干嘛: MobX 的理念是通过观察者模式对数据做 ...

  4. React状态管理之redux

    其实和vue对应的vuex都是差不多的东西,这里稍微提一下(安装Redux略过): import { createStore, combineReducers, applyMiddleware } f ...

  5. HttpClient_HttpClient 4.3.6 HTTP状态管理

    HTTP状态管理 最初的HTTP被设计成以状态.请求/应答为导向的协议,它被制作成是没有特殊条款的,以便在状态会话中能交换逻辑关系请求/应答.HTTP协议越来越受欢迎和被采用,越来越多的系统会在应用程 ...

  6. httpclient http状态管理

    HTTP状态管理 最初,Htt被设计成一个无状态的面向请求响应的协议,所以它不能再逻辑相关的http请求/响应中保持状态会话. 由于越来越多的系统使用http协议,其中包括http从来没有想支持的系统 ...

  7. Part2-HttpClient官方教程-Chapter3-HTTP状态管理

    ps:近日忙于课设与一个赛事的准备....时间真紧啊~~ 最初,HTTP被设计为一种无状态的,面向请求/响应的协议,它并没有为跨越多个逻辑相关的请求/响应交换的有状态会话做出特殊规定.随着HTTP协议 ...

  8. 你再也不用使用 Redux、Mobx、Flux 等状态管理了

    Unstated Next readme 的中文翻译 前言 这个库的作者希望使用 React 内置 API ,直接实现状态管理的功能.看完这个库的说明后,没有想到代码可以这个玩.短短几行代码,仅仅使用 ...

  9. Flutter 对状态管理的认知与思考

    前言 由 编程技术交流圣地[-Flutter群-] 发起的 状态管理研究小组,将就 状态管理 相关话题进行为期 两个月 的讨论. 目前只有内定的 5 个人参与讨论,如果你对 状态管理 有什么独特的见解 ...

随机推荐

  1. 毒瘤dp 学校食堂

    这道dp题 可谓是比较难了,我想了2h 总是觉得自己设的状态没有包涵全部的状态空间 一直想不出来状态 最后败北. 正解是这样的 我们肯定是有一维i的表示 到了i 这个人吃饭了 但是在i吃饭之前后面的7 ...

  2. bzoj 2780 [Spoj]8093 Sevenk Love Oimaster

    LINK:Sevenk Love Oimaster 询问一个模式串在多少个文本串中出现过. 考虑广义SAM 统计这种数量问题一般有三种做法. 一种 暴力bitset 这道题可能可以过? 一种 暴力跳p ...

  3. Android运行时注入浅析与使用

    背景 最近接触新项目,项目中引入了Android Annotation(AA)依赖注入开源框架,代码中大片的注解代码,对于没用过注解框架(或者说没有如此大面积的使用)的我来说确实看得很费力,于是花时间 ...

  4. fiddler本地调试

    参考:https://blog.csdn.net/letasian/article/details/75021656 有关fiddler基础用法的介绍详见我的上一篇博客:http://www.cnbl ...

  5. Spring Boot的自动配置,到底是怎么做到?

    作者:祖大帅 链接:juejin.im/post/5b679fbc5188251aad213110 来源:掘金 1. Spring Boot.Spring MVC 和 Spring 有什么区别? 分开 ...

  6. OWL本体语言和Protege本体编辑器

    OWL本体语言和Protege本体编辑器 演讲稿原作者:Wala Abdulaziz译者:Wu Di (pimgeek)转载.编辑:Tan Liwei原文发布日期:2013年6月5号原文链接:http ...

  7. 038_go语言中的状态协程

    代码演示: package main import ( "fmt" "math/rand" "sync/atomic" "time ...

  8. 极简 Node.js 入门 - 1.3 调试

    极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...

  9. GitLab 后台修改用户密码

    GitLab 后台修改用户密码 # 打开控制台 gitlab-rails console production # 找到用户,输入密码,确认密码,保存 user = User.find_by(user ...

  10. FSAF

    Feature Selective Anchor-Free Module for Single-Shot Object Detection https://zhuanlan.zhihu.com/p/5 ...