Javascript 在另一个useEffect钩子修改相同的状态后,如何在useEffect钩子中获得正确的状态?
我有两个Javascript 在另一个useEffect钩子修改相同的状态后,如何在useEffect钩子中获得正确的状态?,javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,我有两个useffect钩子,它们都将在startTime/endTime状态发生变化时运行 useEffect(() => { if (selectedProduct) { fetch(...) .then(res => res.json()) .then(res => setMyState(res.data)); } }, [selectedProduct, startTime, endTime]); use
useffect
钩子,它们都将在startTime/endTime
状态发生变化时运行
useEffect(() => {
if (selectedProduct) {
fetch(...)
.then(res => res.json())
.then(res => setMyState(res.data));
}
}, [selectedProduct, startTime, endTime]);
useEffect(() => {
if(selectedStep){
console.log(myState); //this runs twice, once for the old state and once for the new state, after above useEffect's setState is complete
}
}, [selectedStep, startTime, endTime, myState]);
环顾四周,我了解到这可能是因为React进行了某种批处理以提高性能,因此setState
本质上是异步的。另外,fetch
调用也是异步的,因此设置新状态需要时间
通过搜索,我看到有一个回调,用于基于类的使用setState
对组件进行反应,但由于我使用了钩子,我不知道该怎么做。我可以将第二个useffect
代码移动到第一个code中,但这需要一些丑陋的if-else
条件,因为我需要检查selectedStep
是否没有更改,然后我可以直接使用res.data
有更好的方法吗?这不是批处理操作或诸如此类的操作,只是它是这样工作的:当startTime
或endTime
更改时,这些钩子中的每一个都会被执行,并且由于第一次更改myState
,您的第二个钩子会再次被调用以进行更改
给你一些选择
按照您描述的方式组合钩子,即使它涉及条件逻辑
根据您对myState
所做的操作,您可以让第二个钩子使用setMyState
的回调形式,该形式接收当前状态值作为参数
(如果可能的话)删除对第二个useffect
中其他状态项的依赖项,这样它只在myState
更改时执行
尽管你说它会涉及一些if
/else
,但如果你做不到,我会倾向于#1#3。我想我也不介意if else
那么多,但这不需要我保持额外的状态来检查所选产品是否发生了变化吗?因为如果它有,那么我想进行fetch
调用,如果它没有并且startTime和endTime
也没有改变,我没有(假设selectedStep
已经改变)。@ShubhamDhingra-我想我可能会将fetch
从那里移到它自己的函数中,然后在mount上调用该函数A),B)当我更改selectedProduct
时(而不是使用useffect
执行此操作)。但是,仅仅从鸟瞰的角度来看你在做什么真的很难说。#3
似乎能胜任这项工作。我想我真的不需要startTime
和endTime
来触发第二个useffect
。谢谢