Javascript 在useState钩子上,将以前的状态与新状态合并的正确流程是什么?
假设我的初始状态是:Javascript 在useState钩子上,将以前的状态与新状态合并的正确流程是什么?,javascript,reactjs,ecmascript-6,Javascript,Reactjs,Ecmascript 6,假设我的初始状态是: 让initialStoreState={ 产品:[], 结帐:[], 加:错, 加载:正确 } const[store,updateStore]=useState(initialStoreState) useffect(()=>{ if(someValue){ //请注意下面的代码 updateStore((prevState)=>{ 返回{…prevState,签出,加载:false} }) } },[someValue]} 那么您是在updateStore上这样使用它
让initialStoreState={
产品:[],
结帐:[],
加:错,
加载:正确
}
const[store,updateStore]=useState(initialStoreState)
useffect(()=>{
if(someValue){
//请注意下面的代码
updateStore((prevState)=>{
返回{…prevState,签出,加载:false}
})
}
},[someValue]}
那么您是在updateStore
上这样使用它,还是像这样使用它:
//这是我通常看到的使用方法
updateStore({…存储、签出、加载:false})
这两者之间是否存在差异或易变性问题?如果问题是关于是使用功能更新还是直接使用状态值来更新状态,在大多数情况下,直接更新状态将起作用
// will work most of the times
updateStore({ ...store, checkout, loading: false })
但是很容易遇到这样的问题,即过时的状态值会由于关闭而被捕获。最简单的例子是,如果传递给setTimeout
或setInterval
的回调试图直接更新状态值,则可能不会产生预期的结果
为了解决关闭问题,我们可以使用
下面是一个示例,演示了关闭问题
但是,对于您当前的用例来说似乎更合适,这是管理具有多个子值的状态对象的建议方法。如果问题是关于是使用功能更新还是直接使用状态值来更新状态,在大多数情况下,直接更新状态将起作用
// will work most of the times
updateStore({ ...store, checkout, loading: false })
但是很容易遇到这样的问题,即过时的状态值会由于关闭而被捕获。最简单的例子是,如果传递给setTimeout
或setInterval
的回调试图直接更新状态值,则可能不会产生预期的结果
为了解决关闭问题,我们可以使用
下面是一个示例,演示了关闭问题
但是,对于您当前的用例来说似乎更合适,这是管理具有多个子值的状态对象的建议方法。我可能建议进一步使用
useReducer
,这是在更新具有多个子值的对象时使用的。useState
的一个好处是,您可以多次调用它拥有多个状态变量,例如添加
,加载
,产品
,等等。这并不总是有效的,但在这里它可以简化事情,特别是对于原子值,如加载
。一些复杂的事情,如产品
,您通常仍然需要合并更改。我可能建议进一步使用useReducer
更新具有多个子值的对象。useState
的一个好处是,您可以多次调用它以获得多个状态变量,例如添加,加载,产品
,等等。这并不总是有效,但在这里它可以简化事情,特别是y表示原子值,如加载
。一些复杂的东西,如产品
,通常仍需要合并更改。