javascript - 在 useState 挂钩上将先前状态与新状态合并的正确流程是什么?
问题描述
假设我的初始状态有这个:
let initialStoreState = {
products: [],
checkout: [],
adding: false,
loading: true
}
const [store, updateStore] = useState(initialStoreState)
useEffect(() => {
if(someValue) {
// pay attention to this code below
updateStore((prevState) => {
return { ...prevState, checkout, loading: false }
})
}
}, [someValue]}
那么你会像这样使用它updateStore
还是像这样使用它:
// this is how I normally see it being used
updateStore({ ...store, checkout, loading: false })
两者之间是否存在任何差异或可变性问题?
解决方案
如果问题是使用函数更新还是直接使用状态值来更新状态,大多数情况下直接更新状态是可行的。
// will work most of the times
updateStore({ ...store, checkout, loading: false })
但是很容易遇到过时的状态值由于关闭而被捕获的问题。最简单的例子是,如果回调传递给 asetTimeout
或setInterval
尝试直接更新状态值,它可能不会产生预期的结果。
要解决关闭问题,我们可以使用functional updates
// example from the current use case
updateStore((prevState) => {
return { ...prevState, checkout, loading: false }
})
这是一个示例代码框,其中演示了关闭问题。
但是,对于您当前的用例useReducer
似乎更合适,这是管理具有多个子值的状态对象的建议方法。
推荐阅读
- spring-boot - Spring Boot Jenkins CD/CI 部署前更改配置文件
- excel - 如何根据跨多个工作表的列返回列值?
- python - 如何使用 Python for osx 或 macos 获取用户登录/注销时间
- c# - 该函数不响应while循环中的计数器
- cors - 阿里巴巴云上缓存资源的 CORS 问题
- javascript - 如何通过点击div点击radio?
- java - 如何忽略依赖项中的@ExceptionHandler?
- python-3.x - SymPy 无法计算心形长度(积分问题)
- c - C指针算术混淆
- java - 如何按两个字段对数组列表进行排序