组长居然让我把所有state都放Redux里

news/2024/7/10 3:22:09 标签: java, python, 编程语言, vue, 人工智能

在我们React进阶源码群里,除了React外,「状态管理」是最常讨论的话题。

诡异的是,有多个群友说过类似的话:

他的同事/组长/领导...让他把所有state都放在Redux/Mobx...里

他们觉得不对,又不知道如何反驳。

今天我们来聊聊ReduxMobx等状态管理库和ReactVue等视图库之间的关系,希望能解决以上困惑。

产品的核心竞争力

如果你在电梯里遇到大领导,他问你:

小x,你们最近在做什么功能?

在电梯到达楼层前这短短2分钟,你该如何向大领导描述你们正在开发的功能呢?

我想你一定会介绍功能的大体逻辑,而不会聊功能里某个按钮的具体交互逻辑吧?

你会聊逻辑,而不是交互。因为逻辑是最重要的。

接下来我们通过一个小故事了解逻辑交互的关系。

逻辑与交互的关系

一天,老板让你开发文件上传功能。

开发过程其实就是处理「文件上传」这一领域相关的各种「状态」之间的关系(比如上传进度是否出错...)。

这部分状态,我们称为「领域状态」

逻辑开发完后,你基于各种「领域状态」编写「单元测试」

为了快速上线验证该功能是否有人用,你直接将其作为CLI工具发布。

几天后,经过数据验证,发现功能很受欢迎。于是你选择React作为视图库,基于之前的逻辑开发视图交互。

开发视图交互过程中需要处理视图相关各种「状态」(比如loading显隐打开关闭状态...)。

这部分状态,我们称为「视图状态」

可见,一款功能完备的产品包含「领域状态」「视图状态」。前者是必须的,后者是可选的。

视图库中的状态

说回ReactVue这样的视图库。

由于大部分视图库以「组件」作为模块边界,所以很自然的,「领域状态」「视图状态」被分割到不同组件中,但他们被分割的方式是完全不同的。

举个例子,一个完整的应用可以划分为很多组件:

「视图状态」角度来看这些组件:

对比上下两张图,组件1(黄色与绿色)大小一致,代表这是个交互逻辑自洽的纯组件(比如一个开关),他的交互逻辑不依赖其他组件。

一个开关

除了组件1,更多组件需要与其他组件形成大小互补,这代表他们的交互逻辑互相影响。

比如组件5的长宽受组件2、组件6、组件8影响,可能代表:组件5是个提示框,他是否弹出受2、6、8影响。

我们再从「领域状态」(蓝色部分)角度来看这些组件:

整个应用的逻辑分散在不同组件中,可能组件1的didMount回调中有一部分逻辑,组件3的useEffect回调中有一部分逻辑。

由于组件5是个提示框,只有提示效果,所以他不包含应用运转所必需的逻辑(即「领域状态」)。

什么时候使用状态管理

回到开篇,什么样的state(状态)应该放在状态管理里?

对于「视图状态」

  • 状态自洽的组件自己管理状态(如组件1)

  • 状态互相之间有影响的组件(如5与2、6、8)根据应用复杂度、组件间跨度决定

如果组件跨度比较近(如是兄弟关系),则公共状态可以提升到共同父组件。

如果组件跨度较远且应用不复杂,可以提升到共同的Context中。

如果应用复杂,再考虑状态管理方案。

对于「领域状态」,由于其天生以碎片形式分布在不同组件中,所以:

  • 简单的小应用可以任其分布在组件中,或者提升到共同的Context

  • 其他情况推荐用状态管理方案

甚至,对于「领域状态」中的子领域,可以在有「状态管理方案」的基础上再抽象出来单独处理。

比如对于「服务端请求的数据」这一「领域状态」,其性质更类似于「缓存」,在React中可以使用SWRReact Query处理。

总结

本文我们聊了状态的分类 —— 领域状态视图状态,对于这两种状态根据其特性有不同处理方案。

虽然一股脑将所有状态都交给Redux处理不是不行,但势必对项目的可读性、性能、扩展性造成影响。

学完本文能够说服同事/组长/领导最好。如果对方执意要Redux一把梭,对待这种执(憨)着(憨)的人,牢记四字箴言:

如果你喜欢这篇文章,可以点击「在看」支持我,Salute


http://www.niftyadmin.cn/n/1251243.html

相关文章

docker下删除两个id相同的镜像

使用docker rmi e4a35914679d删除的时候执行失败: 后来在Stack Overflow删看到使用repository和tag进行操作的,所以执行docker rmi docker.io/redis:3.2 再次查询的时候只剩下一个镜像,删除OK。 所以,可以使用 docker rmi repo…

高效学习ES6,让你的代码更优雅

ES6是咱前端必备的技能,不过,你真的理解ES6 的核心新特性吗?来测试一下,看看这几个问题:ES5和ES6的区别?说一下你所知道的ES6var、let、const之间的区别是什么?什么时候用let,什么时…

Docker安装Redis并使用外部配置文件启动

mkdir docker cd docker mkdir redis cd redis ##进入redis文件夹,可以去官网下载一个redis.conf拖进来 mkdir data切记注释掉:#daemonize yes 否则无法启动容器 重要话说三遍:注释掉#daemonize yes,注释掉#daemonize yes&#xf…

React 与 Vue 框架的设计思路大 PK

框架总览前端框架繁多,在学习的时候也会陷入困惑,我们应该抓住最主流的内容 Vue/React,深入底层,尝试揣摩框架作者的设计思路,开阔自己的视野,大家也不要把自己限制在框架之中,认为工作中用到 V…

redis ERR This instance has cluster support disabled

redis.clients.jedis.exceptions.JedisDataException: ERR This instance has cluster support disabled 修改配置 redis.conf 配置集群 修改redis.config,取消注释变为cluster-enabled yes

你可能并不需要微前端

去年看到社区里一些关于微前端的讨论时,就想写篇文章梳理一下自己的观点,后来因为种种原因搁置了(主要是懒)。今天在微信群中看到又有不少人谈起微前端,虽遗憾错过了讨论,但也勾起了自己的表达欲。所以这里…

太赞了,华为工程师总结的400道前端面试题提供下载

最近很多小伙伴找我要一些前端资料,于是我翻箱倒柜,把这份华为大牛总结的前端开发归纳笔记找出来,同时赠送直播、录播、视频、笔记、源码、软件包,免费共享给大家!据说有小伙伴靠这份笔记顺利进入 BAT 哦,所…

jedis、jedisPool、jedisCluster的使用方法

jedis 连接redis&#xff08;单机&#xff09;&#xff1a; 使用jedis如何操作redis&#xff0c;但是其实方法是跟redis的操作大部分是相对应的。所有的redis命令都对应jedis的一个方法 1、在macen工程中引入jedis的jar包 <dependency><groupId>redis.clie…