javascript - redux 和 useEffect 的交互
问题描述
我正在研究一个人为地将一些数据加载到组件的功能,即。根据上传的数据重新创建页面显示。我在调用 useEffect 时遇到问题。这是代码:
const funcA = (props) => {
let a = [1, 2, 3];
let b = [2, 3];
setSelected(a);
setParam(b);
return (
<div>...</div>
);
}
const funcB = (props) => {
useEffect(
() => {
setParam([]);
},
[props.selected]
);
return (<div>...</div>);
}
setSelected()
并且setParam()
是修改我的 redux 存储的操作。现在,当我更改selected
using setSelected()
in 时funcA
,将调用 useEffect根据值funcB
修改数据。我认为这不应该是一个问题,因为我在调用后调用但它似乎在.param
selected
setParam()
setSelected
useEffect
setParam()
长话短说,这是我希望他们执行的顺序:
- 设置选择()
- useEffect() (因为选择的变化)
- 设置参数()
但他们按以下顺序执行:
- 设置选择()
- 设置参数()
- useEffect() (因为选择的变化)
任何帮助表示赞赏。谢谢!!
解决方案
在反应世界中,您通常不应该依赖调用 setSomething() 函数的顺序。
React “收集”状态更新调用,并决定更新状态的最有效方式。
与其思考“调用顺序”,不如思考“如果状态 A 是 X,状态 B 应该是什么?” .
而不是“如果用户点击改变状态”,想想“用户想要什么所以得到/看到?” .
不好:
- 设置选择()
- useEffect() (因为选择的变化)
- 设置参数()
更好的:
- 设置选择()
- useEffect()(调用 setParam(),因为选择的改变)
- useEffect()(调用 setParam(),因为……为什么?)
您可能需要重新考虑,并稍微改变一下您的状态结构。
推荐阅读
- python - 来自另一个 Django 模型的 Django 模型 max_length
- python - Python Find_Element_by_xxx 突然停止工作
- java - Java - 如何为 TextFields 创建一个循环?
- elixir - 自定义混合任务在运行时不触发编译
- python - 如何使用 Pandas ExcelWriter 将空工作表添加到现有工作簿中
- 2sxc - 2SXC 无法进行干净的 DNN 9.3.2 安装
- php - 如何让 Laravel 与 AWS 上的 Redis 集群一起工作
- python - 具有键和值列表的列到具有字典列表的列
- r - 有没有办法给 Rscript 窗口命名?
- java - 为什么在来自 int-jms:outbound-channel-adapter 的 MQException 的情况下没有调用 errorChannel?