举例一个场景
上面是一堆的开关过滤器, 输出一堆参数给 Data 过滤
<FilterArea/>
下面是一个 table 展示数据
<DataArea/>
这种会影响代码可读性吧,毕竟 FilterArea 比较偏 UI,可能写在各种表现形式上
1
ChrisV5 OP 这种不算父子组件传值,算是兄弟组件传值?
|
2
ChrisV5 OP redux 还有一个问题是全局数据。就意味着你有多个比较相似的 Filter 的时候,用一套 type&reducers 就会互相污染,用多套,代码就写恶心了。
感觉这种更类似于上下文数据,应该用 Lifting State Up |
3
walpurgis 2021-08-20 12:12:57 +08:00 via iPhone
兄弟组件共享显然是把状态提升到父级
|
4
statumer 2021-08-20 12:30:41 +08:00 via Android
状态提升,这个业务建议别写 redux 写 mobx,别和自己过不去
|
5
Rocketer 2021-08-20 13:51:15 +08:00 via iPhone 2
99%的项目不需要 redux,useContext 足够了。有机会做那 1%的人也不会来问这种问题。
所以,若非接手现有的代码,不要考虑 redux,开发速度慢,运行速度慢,太重了 |
6
XTTX 2021-08-20 14:25:55 +08:00
1.除非参数在 app 各个地方都有用到, 不然 props 传输就是最好的办法。
2.如果<DataArea/>的所需参数除了<FilterArea/>能输出,还有其他地方也能输出,props 也是最好的办法。 |
7
wuchangming89 2021-08-20 15:31:24 +08:00
@statumer,同意,写业务项目直接 Mobx,业务与 UI 分离,MVVM 效率也高。如果写开源库组件库什么的另说
|
8
dcalsky 2021-08-20 15:39:30 +08:00
其实 mobx 写起来也蛮快的,编码效率跟 useContext 差不多,关键是还不用自己填一堆坑。
|
9
zoeliu 2021-08-20 15:48:52 +08:00 via Android
状态提升 context 就可以。最近有复杂度不高的项目涉及全局状态传递使用的 useContext + useReducer 。
|
10
seki 2021-08-20 15:52:54 +08:00
recoil 或者 jotai
|
11
GuguDan 2021-08-20 16:07:02 +08:00
Stook
|
12
bnm965321 2021-08-20 16:13:21 +08:00
recoil 谁用谁知道
|
13
hingle 2021-08-20 17:02:34 +08:00
recoil + 1
|
14
PeakFish 2021-08-20 17:11:37 +08:00
|
15
wuchangming89 2021-08-20 17:20:54 +08:00
eventBus 和 redux 这些全局变量类的数据管理方案,模块化都不好做,命名空间约定也是麻烦事。如果大项目或者多人合作项目,模块化还是挺重要的。小项目除外,小项目上面说的什么都行。
|
16
ZZITE 2021-08-20 17:34:32 +08:00
recoil + 1
|
17
prayx 2021-08-20 18:06:14 +08:00
推荐个冷漠的库 constate:
将自定义 hooks 提升到 context 特别简洁优雅 |
18
Rocketer 2021-08-21 00:16:06 +08:00 via iPhone
另外说一句,如果可以选择的话,别用 react,试试 angular 。
三大 spa 框架我都用过,angular 是最完善的,全套官方功能即可满足绝大多数项目需求,不像 react 还得用一堆第三方库 |
19
sjhhjx0122 2021-08-21 11:47:10 +08:00
@Rocketer angular 一个 service 配合 rxjs 就能解决实在是舒服
|
20
SHF 2021-08-21 18:32:30 +08:00
你需要把状态和组件解耦,抽象到一个 model 里,现实情况中有很多逻辑和数据和组件是正交的,多个组件会用多个属性
可以试试我写的这个: react-object-model - 面向对象的 React 状态管理库 1. 轻量,基于 useState (返回的 setState 具有引用稳定性,可区分组件,调用时能够触发渲染) 和 useEffect (组件卸载时清理订阅关系) 2. API 简洁、符合直觉,const { name, age } = user.use(['name', 'age']) 即可在 React 组件中完成对 user 模型中 name, age 属性的订阅; user.set({ name: 'Tom' }) 即可更新 user 模型的 name 属性并触发组件渲染 3. 根据每个组件订阅的模型属性做 diff,与上次相比改变后才更新组件状态,避免不必要的渲染 https://github.com/ShenHongFei/react-object-model |
21
cylqd 2021-08-22 15:26:08 +08:00
我用 urlparams 传递参数
|
22
connection 2021-08-22 17:26:10 +08:00
UI 状态组件内部内聚消化
业务状态 抽成业务模型 props 给组件消费。 |
23
myCupOfTea 2021-08-23 09:19:37 +08:00
状态提升,然后把逻辑封装成 hook
|
24
CamD 2021-10-11 09:01:05 +08:00 via iPhone
用了 mobx 后越来越抗拒 redux,建议楼主也来尝试一下
|
25
charlie21 2022-02-24 20:00:17 +08:00
有时候感觉 react 作为一个仅仅视图层 当然有理由让人去搭配不同的 “搭配”
但能够有这么多种方式实现一个结果,是很令人意外的,这意味着 react app 和 react app 没什么相似之处 |
26
charlie21 2022-02-25 10:48:51 +08:00
之前不同的人用不同的框架,代码结构千差万别 v2ex.com/t/294276?p=1#r_3395030
|
27
aec4d 2022-11-03 14:35:06 +08:00
jotai + mitt
值使用 jotai 跨组件 事件使用 mitt 跨组件 方便代码组织 |