当前位置: 首页 > 知识库问答 >
问题:

反应js构造函数调用了两次

袁宜民
2023-03-14

我有一个帖子列表,我试图在构造函数或componentDidMount中为每个帖子调用一个操作。但不知何故,当我发送一个新消息时,构造函数和componentDidMount函数会被调用两次。

 constructor(props) {
    super(props);

    if (condition1) {
       this.props.actions.action1();
    } else if (condition2) {
       this.props.actions.action2();
    }    
}

当从列表中读取帖子时,这些函数仅被调用一次。但是当我发送一条新消息时,他们会被呼叫两次。

我怎样才能避免这种情况。我试着像这样使用ComponendDupDate函数:

componentDidUpdate(prevProps, prevState) {     
      if (prevProps.post.id !== this.props.post.id) {
         if (condition1) {
            this.props.actions.action1();
         } else if (condition2) {
            this.props.actions.action2();
         }
      }   
}

共有3个答案

华谭三
2023-03-14

如果您没有运行StrictMode(如果您运行了,请参阅Papacool的回答:这是设计的),当构造函数中的代码运行两次时,您可以确保组件被重新创建两次。这可能有各种原因,最简单的原因可能是组件被用于多个地方:

<MyComponent />
<MyComponent />

另一个原因可能是您有条件渲染,这意味着您可能正在基于布尔值进行渲染,这会发生变化:

{ myBoolean && <MyComponent /> }

如果切换myBoolean两次,则构造函数将执行两次。

晏晨朗
2023-03-14

好的,当构造函数和componentDidMount函数都触发两次时,您可以确保所讨论的组件在某个地方被构造了两次。

萧宁
2023-03-14

React构造函数在严格模式下被调用两次。https://stackoverflow.com/a/61443443/6014725

这不是一个bug,而是有目的的行为,以确保构造函数是纯的。https://github.com/facebook/react/issues/12856#issuecomment-613145789

了解更多与https://reactjs.org/docs/strict-mode.html

 类似资料:
  • 我的react组件的构造函数被调用了两次,但我不知道为什么。我正在使用react redux存储我的应用程序的语言。我有一个基于浏览器语言设置默认语言的函数。LoginPage是第一个获得render的组件,因此我在其构造函数中调用了我的函数。基本上,它所做的就是比较并分派一个动作。当我用redux开发工具检查我的状态时,我看到它被调度了两次。我在构造函数中打印了虚拟数据,它也打印了两次。 登录页

  • 我是新的反应,我试图用它开发一个简单的网络应用程序,但我得到了一个错误。当我加载一个类组件时,我的构造函数被调用两次,你能帮忙吗? 原木地被击中两次。在一些组件中,我希望进行一个命中DB的API调用,但我只想命中它一次。在许多情况下,使用并不方便,因为道具只出现在之后,因此我想在中调用(我不会使用setState,这会导致重新加载render)。 提前感谢

  • 我有以下代码: 我要复制的类: 创建一些类 公共对象createObj(String cls\u name,String param1,int param2){返回Class.forName(cls\u name)。getConstructor(String.Class,Integer.Class)。newInstance(param1,param2);} 然后我尝试使用以下内容复制该类的对象:

  • 第二个构造函数应该调用第一个构造函数,但却给了我“递归构造函数调用”错误。 我明白这个错误的意思,只是不明白递归在哪里。第一个contructor将作为参数,而应该是该类型的数组。我错过了什么? 多谢了。

  • 为什么下面没有编译: 如有需要,请提供更多详细信息: 我想将tmp传递给父构造函数

  • 正如我的类名所暗示的那样:如果我的类是迭代器的实例,我想测试一下。因此,我想知道,如果它只需要实现接口就可以这样做,似乎就足够了。 然而,当我通过JUNIT Test运行以下类时,我得到了以下控制台输出: 似乎类构造函数被调用了两次!但是我不知道第二次调用来自哪里。我已经测试了“if”参数的变体以排除有故障,例如 然而,它在所有3种情况下都被调用了。因此,我假设Unit Test首先尝试,需要为自