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