Reactjs 为什么useEffect会在SetInterval效果上返回ClearInterval()?

Reactjs 为什么useEffect会在SetInterval效果上返回ClearInterval()?,reactjs,Reactjs,在reactjs.org的以下代码中: useEffect(() => { function tick() { // Read latest props at any time console.log(latestProps.current); } const id = setInterval(tick, 1000); return () => clearInterval(id); }, []); // This effe

在reactjs.org的以下代码中:

useEffect(() => {
    function tick() {
      // Read latest props at any time
      console.log(latestProps.current);
    }

    const id = setInterval(tick, 1000);
    return () => clearInterval(id);
  }, []); // This effect never re-runs

当我的大脑编译它时,产生的效果是“等待一秒钟,然后做点什么”,但是setInterval本身是异步的,它立即返回,然后useEffect返回其闭包回调。React只知道状态的变化,而不知道操作(它不知道useffect中启动了什么,不是吗?他怎么知道!),我想它会在返回时直接启动闭包回调,然后阻止tick()函数被启动,即使是一点点。。。但事实并非如此。怎么会这样?React如何知道在触发useEffect返回的闭包回调之前要等待什么?

虽然我不知道在后台会发生什么,但为了实现起见,您只需要知道useEffect的返回回调仅在重新运行效果时调用,或者更具体地说,在“关闭”之后调用上一个效果运行和新效果运行之前。根据效果的依赖关系,它可以出现在每个渲染上,或者(如您发布的示例所示)仅在卸载组件时出现

认为功能组件只是功能是很有用的,因此除非再次调用功能(组件)(重新渲染或其他生命周期更改),否则效果“停止”,没有神奇的并行过程。我敢说react会在渲染前和渲染后检查组件上的挂钩效果。根据依赖项和效果的详细信息,它知道是否应该调用返回回调或根本不调用效果

请看我在何处演示这两种最极端的情况:对每个渲染的效果,以及仅对装载/卸载的效果。检查沙盒控制台以了解其行为。尝试将父项的效果依赖项更改为
[count]
,并查看差异


PS:当我开始使用hook时,这篇文章给了我很多帮助

你是否在问react如何知道何时运行从
useffect
hook的回调函数返回的函数?要找到这类问题的答案,请查阅。我不认为stackoverflow应该是第一个求助的资源。你是对的Martin:我昨天读了那一页,我显然读错了/没有读到那句话:“React在组件卸载时执行清理”。非常感谢,并为这个不必要的问题感到抱歉:(非常感谢您提供的非常有用的沙盒/解释和您的链接@pavlag!我将在读完reactjs.org文档后立即对其进行深入研究:)