javascript - 使用更新循环时如何在 useEffect 中获取更新状态
问题描述
所以你可能知道,在正常模式下,我们使用更新依赖项来获取状态更新时的通知,如下所示:
const [val, setVal] = useState();
useEffect(() => {}, [val]]);
但就我而言,我的状态中有一个数组,我试图在我的 useEffect 中循环更新它,如下所示:
const [val, setVal ] = useState([...]);
useEffect(() => {
anotherArr.forEach(i => {
// get val and modify some indexes
setVal(modifiedValuesArray);
}
}, []);
在这种情况下,每次 forEach 循环运行时,我都会获得初始 val(我知道因为 val 不是 useEffect 的依赖项),但如果我将其作为依赖项,它将更新两次。解决方案是什么?
编辑:基本上,我的意思是当我在 useEffect 的一轮循环中更新状态时,在下一轮,我没有得到更新的状态,而是进入循环之前的初始状态。而且我知道,这是因为 useEffect 的性质,它为我们提供了一个记忆的状态值(因为我们没有将它作为依赖项传递以避免额外的执行),但是在这些类型的场景中解决方案是什么。
解决方案
仅使用setVal
一次,而不是在forEach
循环期间使用。setState
所以async
你不能像同步一样依赖它。在您的示例setVal
中实际上将在将来的某个时间执行..您可能有代码沙盒示例吗?
编辑:您不会在“下一轮”获得更新状态。setState
将被执行 N 次,并将其放入更新队列中,React 可能只会更新最后一个setState
值以进行优化。此外,您的示例useEffect
将只运行一次..
推荐阅读
- ruby-on-rails - 如何将实例方法转换为关联?
- azure - 如何创建容器映像并从 Azure 容器映像下载
- .net - 我可以使用 iText.Layout.Element.Link 打开自定义 URI 方案吗
- hyperlink - 尝试向轮播添加链接
- amazon-web-services - 在 AWS ACM 上执行 ImportCertificate 操作时出错
- ssl - NIFI 集群和 Zookeeper 集群
- vba - 将所有幻灯片复制到新的 PPTX 仅在逐步执行中有效
- r - 在 ggplot2 图中实现谷歌字体
- php - 两个站点,一个带有 laravel Sai 的数据库
- python - 从字典中获取所有元素并将其附加到字符串