Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.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 在另一个useEffect钩子修改相同的状态后,如何在useEffect钩子中获得正确的状态?_Javascript_Reactjs_React Hooks - Fatal编程技术网

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
    。谢谢