初始呈现时,toggleVar为FALSE,因此不会调用RandomComponent.在第一次单击按钮后,setInterval被调用并在后台运行,但为什么在useEffect退出时似乎没有立即触发返回? 该leararInterval似乎在第二次单击按钮时被击中,这很奇怪,因为第二次单击按钮会将toggleVar设置为False,这将阻止RandomComponent(及其内部的useEffect)被触发?

import {useEffect, useState} from 'react';

const CleanupFunction = () => {
  const [toggleVar, setToggle] = useState(false);
  return (
  <div>
    <button onClick={() => setToggle(!toggleVar)}>
     Component Display
    </button>
    {toggleVar && <RandomComponent />}
  </div>
  );
};

 const RandomComponent = () => {
   useEffect(() => {
      console.log('Hello from useEffect');
      const intId = setInterval(() => {
        console.log('This is going to be displayed every 1 second');
      }, 1000);
      return () => {
        clearInterval(intId);
        console.log('Cleared interval');
      };
   },[]);
   
   return <h1>Hello there </h1>;
  };

export default CleanupFunction;

以下是我对这一系列事件的理解:

  1. 如果toggleVar为FALSE,则不会命中RandomComponent;

  2. 如果toggleVar为真(第一次点击按钮),则触发RandomComponent

    • 将运行Use Effect
    • 将显示‘Hello from useEffect’
    • SetInterval将被触发,并且"这将被显示..."将每隔1秒显示一次
    • 立即返回将运行leararInterval的函数,从而停止setInterval函数
    • 将显示"已清除间隔"
    • ‘Hello There’将会显示‘
  3. 如果toggleVar为FALSE(第二次单击按钮),则不会命中RandomComponent

我知道实际yields 与我预期的不一样,但这就是为什么提出这个问题.这是一个自上而下的代码执行,那么返回语句有什么特别之处呢?

推荐答案

但是为什么看起来在useEffect退出时没有立即触发返回呢

因为您要返回一个函数,当出现以下两种情况之一时,Reaction会负责调用该函数:

A)再次运行该效果.然后在效果运行之前调用清理函数

B)组件卸载

在您的示例中,只有情况b)适用,因为您使用的是带有空依存关系数组的useEffect(..., []),这意味着仅在第一次渲染时运行效果.

因此:

  • 你第一次点击按钮,RandomComponent就会被渲染,效果就会运行,Reaction会存储清理功能
  • 您再次单击它,RandomComponent次卸载,从而触发清理功能

在连续单击时,会重复此行为,因为会呈现新的RandomComponent.

Reactjs相关问答推荐

父组件更新后不重新呈现子组件

将动态元素中的输入数据传输到Reaction

在React Create App TS项目中安装material UI

不同步渲染

Redux工具包-useSelector如何通过Reducer引用InitialState?

MUiv5和TSS-Reaction SSR问题:无法可靠地处理样式定义.CSSprops 中的ArrowFunctionExpression

使用自动播放的视频组件呈现登录页面时出现JEST测试错误

ctx.strokeStyle 在 canvas html 5 中不起作用

PWA:注册事件侦听器不会被触发

面临 React 模式中点击外部条件的问题

列表中的每个子项都应该有一个唯一的keyprops .在react 应用程序中

Symfony ux-react:使用react_component()时React组件不会渲染

ReactJS 中的图像加载顺序

Syncfusion:带有 TabItemsDirective 的选项卡组件不显示任何内容

cypress `cy.now()` Type 'Promise' 没有调用签名

从服务器获取数据时未定义,错误非法调用

react - 警告:列表中的每个子元素都应该有一个独特的 keys props ,即使我已经设置了 keys

如何在同一路由路径上重新渲染组件(链接,V6)reactjs

在 React 中,为什么不能向空片段添加键(短语法)?

如何在组件文件夹内的react 组件文件中导入外部css文件?