Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.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 对useffect()中的函数使用立即返回是否会以任何方式改变行为?_Javascript_Reactjs_React Hooks - Fatal编程技术网

Javascript 对useffect()中的函数使用立即返回是否会以任何方式改变行为?

Javascript 对useffect()中的函数使用立即返回是否会以任何方式改变行为?,javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,以下代码的行为是否会有所不同: A: B: 或者它们的行为是否相同?取决于doSomething返回的内容。如果返回undefined,则没有区别。如果doSomething返回一个函数,那么该函数将用作效果的拆卸逻辑 如果它返回其他内容,我认为它会被react忽略,但您需要确定。由于我主要在typescript中开发,除了未定义或函数之外,我从不返回任何内容,因为返回任何其他内容都是类型错误。因此,当您从useffect返回函数时,它表示所述函数将在useffect再次运行之前运行。基本上,您

以下代码的行为是否会有所不同:

A:

B:


或者它们的行为是否相同?

取决于
doSomething
返回的内容。如果返回undefined,则没有区别。如果doSomething返回一个函数,那么该函数将用作效果的拆卸逻辑


如果它返回其他内容,我认为它会被react忽略,但您需要确定。由于我主要在typescript中开发,除了未定义或函数之外,我从不返回任何内容,因为返回任何其他内容都是类型错误。

因此,当您从
useffect
返回函数时,它表示所述函数将在
useffect
再次运行之前运行。基本上,您可以从
useffect
返回一个清理函数

考虑一下这个场景

useEffect(()=>{

  const timer = setTimeout(()=>{
     setResult(result+1)
  },3000)
  return ()=>{
     clearTimeout(timer)
  }

},[result])
上面的代码本质上是说,当执行超时时,结果状态将增加1,当下次执行相同的函数时,前一个计时器变量将被清除


另外,如果将空数组传递给
useffect
并返回清理函数,则其行为与
componentWillUnmount
方法相同。

在useffect中返回函数可能有什么好处?据我所知,没有一个很好的理由来增加这种复杂性。

,如果它偶然发生,可能会导致意外!是的,可以将函数引用直接传递给useEffect,但是您可能需要确保它通过闭包或.bind绑定到正确的范围(并且确保永远不要传递异步函数)
  useEffect(() => doSomething(), []);
useEffect(()=>{

  const timer = setTimeout(()=>{
     setResult(result+1)
  },3000)
  return ()=>{
     clearTimeout(timer)
  }

},[result])