Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.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
Reactjs 如何在第一次设置状态然后使用状态时停止InFite循环中的useEffect_Reactjs_React Hooks - Fatal编程技术网

Reactjs 如何在第一次设置状态然后使用状态时停止InFite循环中的useEffect

Reactjs 如何在第一次设置状态然后使用状态时停止InFite循环中的useEffect,reactjs,react-hooks,Reactjs,React Hooks,关于这个话题已经有很多问题了,但我看不出两者都设置了状态,然后使用相同的状态 我在第一次运行时设置状态,然后通过数组将状态传递回。理论上,这应该只运行2次,一次是当data1和data2为空时,另一次是当它们更改为updated时 以这种方式传入状态将使其当前永远运行。我该怎么阻止这一切?数据没有更新,为什么会反复运行?还是换一种方式 我不希望每次进行更改时都运行combineData,因为这是不必要的。我希望这只在加载时发生(就像我在这里尝试做的那样) 您正在更新状态,但是您正在使用这些状态作

关于这个话题已经有很多问题了,但我看不出两者都设置了状态,然后使用相同的状态

我在第一次运行时设置状态,然后通过数组将状态传递回。理论上,这应该只运行2次,一次是当
data1
data2
为空时,另一次是当它们更改为updated时

以这种方式传入状态将使其当前永远运行。我该怎么阻止这一切?数据没有更新,为什么会反复运行?还是换一种方式

我不希望每次进行更改时都运行
combineData
,因为这是不必要的。我希望这只在加载时发生(就像我在这里尝试做的那样)


您正在更新状态,但是您正在使用这些状态作为依赖项,因此它成为一个无限循环

如果只想使用一次,请删除依赖项

useEffect(() => {

   // your codes.

},[])
如果不是,那么就没有必要使用状态,而是使用局部变量

useEffect(() => {
   ///SET STATE
    const initiate = async () => {

    const local1 = await getData1()
    const local2 = await getData2()

    combineData(local1, local2)
   }

   initiate();
  }, []) // pass in an array as a second argument

const combineData = (...args) => {
    let data = [...args].flat()
    setData(data)
  }

等待所有承诺完成,然后从依赖关系数组中删除data1和data2。e、 g.
Promise.all([promise1,promise2])。然后(results=>{/*combine here*/})
结果将是一个数组,格式为
[promise1Result,promise2Result]
这是一个好的简单解决方案(第二部分),它解决了我的问题。
useEffect(() => {
   ///SET STATE
    const initiate = async () => {

    const local1 = await getData1()
    const local2 = await getData2()

    combineData(local1, local2)
   }

   initiate();
  }, []) // pass in an array as a second argument

const combineData = (...args) => {
    let data = [...args].flat()
    setData(data)
  }