Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在useState钩子上,将以前的状态与新状态合并的正确流程是什么?_Javascript_Reactjs_Ecmascript 6 - Fatal编程技术网

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表示原子值,如
加载
。一些复杂的东西,如
产品
,通常仍需要合并更改。