

组长让我把所有state都放Redux里
source link: https://segmentfault.com/a/1190000040364363
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

大家好,我是卡颂。
在我们React
进阶源码群里,除了React
外,状态管理是最常讨论的话题。
诡异的是,有多个群友说过类似的话:
他的同事/组长/领导...让他把所有state都放在Redux/Mobx...里
他们觉得不对,又不知道如何反驳。
今天我们来聊聊Redux
、Mobx
等状态管理库和React
、Vue
等视图库之间的关系,希望能解决以上困惑。
产品的核心竞争力
如果你在电梯里遇到大领导,他问你:
小x,你们最近在做什么功能?
在电梯到达楼层前这短短2分钟,你该如何向大领导描述你们正在开发的功能呢?
我想你一定会介绍功能的大体逻辑,而不会聊功能里某个按钮的具体交互逻辑吧?
你会聊逻辑
,而不是交互
。因为逻辑
是最重要的。
接下来我们通过一个小故事了解逻辑
与交互
的关系。
逻辑与交互的关系
一天,老板让你开发文件上传功能。
开发过程其实就是处理文件上传这一领域相关的各种状态之间的关系(比如上传进度
、是否出错
...)。
这部分状态,我们称为领域状态。
逻辑开发完后,你基于各种领域状态编写单元测试。
为了快速上线验证该功能是否有人用,你直接将其作为CLI
工具发布。
几天后,经过数据验证,发现功能很受欢迎。于是你选择React
作为视图库,基于之前的逻辑开发视图交互。
开发视图交互过程中需要处理视图相关各种状态(比如loading显隐
、打开关闭状态
...)。
这部分状态,我们称为视图状态。
可见,一款功能完备的产品包含领域状态与视图状态。前者是必须的,后者是可选的。
视图库中的状态
说回React
、Vue
这样的视图库。
由于大部分视图库以组件作为模块边界,所以很自然的,领域状态与视图状态被分割到不同组件中,但他们被分割的方式是完全不同的。
举个例子,一个完整的应用可以划分为很多组件:
从视图状态角度来看这些组件:
对比上下两张图,组件1(黄色与绿色)大小一致,代表这是个交互逻辑自洽的纯组件(比如一个开关),他的交互逻辑不依赖其他组件。
除了组件1,更多组件需要与其他组件形成大小互补,这代表他们的交互逻辑互相影响。
比如组件5的长宽受组件2、组件6、组件8影响,可能代表:组件5是个提示框,他是否弹出受2、6、8影响。
我们再从领域状态(蓝色部分)角度来看这些组件:
整个应用的逻辑分散在不同组件中,可能组件1的didMount
回调中有一部分逻辑,组件3的useEffect
回调中有一部分逻辑。
由于组件5是个提示框,只有提示效果,所以他不包含应用运转所必需的逻辑(即领域状态)。
什么时候使用状态管理
回到开篇,什么样的state
(状态)应该放在状态管理里?
对于视图状态:
- 状态自洽的组件自己管理状态(如组件1)
- 状态互相之间有影响的组件(如5与2、6、8)根据应用复杂度、组件间跨度决定
如果组件跨度比较近(如是兄弟关系),则公共状态可以提升到共同父组件。
如果组件跨度较远且应用不复杂,可以提升到共同的Context
中。
如果应用复杂,再考虑状态管理方案。
对于领域状态,由于其天生以碎片形式分布在不同组件中,所以:
- 简单的小应用可以任其分布在组件中,或者提升到共同的
Context
中 - 其他情况推荐用状态管理方案
甚至,对于领域状态中的子领域,可以在有状态管理方案的基础上再抽象出来单独处理。
比如对于服务端请求的数据这一领域状态,其性质更类似于缓存,在React
中可以使用SWR
或React Query
处理。
本文我们聊了状态的分类 —— 领域状态
与视图状态
,对于这两种状态根据其特性有不同处理方案。
虽然一股脑将所有状态都交给Redux
处理不是不行,但势必对项目的可读性、性能、扩展性造成影响。
学完本文能够说服同事/组长/领导最好。如果对方执意要Redux
一把梭,对待这种执(憨)着(憨)的人,牢记四字箴言:
Recommend
-
59
来源:上观新闻除夕之夜,国家征召,全国数十支医疗队伍奔赴武汉,是壮举,是我们国家的体制优势再次展现——这是今天上海市医疗救治专家组组长张文宏教授发在华山感染微信公众号中提到的一句话,对于疫情的变化趋势、热点问题及相关注意事项,张文宏做了进一
-
6
我们组的软工实训项目是在我的信息检索课设的基础上做一个网站应用。技术栈是 React + FastAPI + 一些简单的机器学习知识。用到的运维技术有 Docker。考虑到组员的网络访问能力,我们决定在 Gitee 上协作。Gitee本来选择 Gitee 是因为它在国内...
-
5
Redis 面试题1、什么是 Redis?.2、Redis 的数据类型?3、Redis 是单进程单线程的?4、Redis 相比 Memcached 有哪些优势?5、Memcache 与 Redis 的区别都有哪些?6、使用 Redis 有哪些好处?7、一个字符串类...
-
12
众所周知,互联网公司有一个神奇的岗位,叫做组长。 不同公司的组长,境遇可能千差万别: 有些公司的组长是有实权的:不仅可以给下属打绩效,还能影响员工的晋升和涨薪,例如腾讯与字节; 而有些公司的...
-
7
2021年,渣渣前端沦为前端组长关键词:转行,在这个公司待了4年;为何是沦为公司大佬相继离职,脱坑,老板不太愿意招聘大佬级前端(给不起工资)为什么是我因为论资排辈,我是公司前端组经验还算可以的...
-
1
曝B站代班审核组长过年加班猝死 现查无此人 来源:3DM整理 作者:文乐生...
-
5
V2EX › 程序员 跟组长聊了聊职业规划 312ybj · 2 天前 · 8452 次点击
-
8
马航心理保障组组长:不要让事故家属受到二次伤害本文来自微信公众号:
-
5
十年架构五年生活-03作为技术组长的困扰 十年架...
-
9
中国队换届筹备工作组组长陈戌源陈戌源分垫底(高清组图) 2022-12-05 作者:迪步 6月11日,中国队球员在训练前热身。新华社记者 毛思谦 摄
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK