reactjs - 如何在不覆盖的情况下以比 setState 快数倍的速度更新状态数组?
问题描述
我的问题很简单。
我有一个使用 useState 创建的数组
const [childFound, setChildFound] = React.useState([])
该数组包含表中每一行的布尔值,每个孩子在需要更改时都会调用更新。但是,如果我直接更改数组中的条目(如在 childFound[1] = false 中),则组件不会更新,因为没有调用 setter。
但是,如果我使用 childFound 的修改副本调用 setChildFound,该组件似乎要等待一段时间才能设置状态,因此有几个孩子在两者之间调用它。这意味着他们每个人都会复制原始 childFound ,修改他们的布尔值并设置它。这覆盖了前一个的 setChildFound,只有最后一个调用者真正改变了数组
有解决方法还是我应该完全不同地进行?
解决方案
你应该像这样更新它
setChildFound( prevState => {
let newState = [...prevState]
newState[1] = false
return newState
}
)
这样所有的调用者都会更新状态。参考:https ://reactjs.org/docs/hooks-reference.html#functional-updates
发生这种情况是因为 react 优化了状态更新,所以在一个 functin 中多次设置状态只会导致一次重新渲染。通过功能更新,您始终可以访问最后的真实状态值。
推荐阅读
- php - 如何使用 laravel 库在 dompdf 中加载字体系列?
- android - 重新连接到互联网时显示进度条
- python - seve 图片 'data:image/jpeg;base64' 与 python
- razor - 在 Razor 中显示百分比符号
- java - JDBC模板:批量调用存储过程并返回结果集
- elasticsearch - 如何在 Elasticsearch 日期名称索引处理器中动态命名索引?
- angular - jasmine 中的映射测试“抛出 [object ErrorEvent] throw”错误
- javascript - 使用 padStart 生成前缀为 0 的项目列表
- c# - 测试中的编码 UI 应用程序
- maps - 如何在 netcdf 地图上标记一些网格点?