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

React调用构造函数两次

经福
2023-03-14

我是新的反应,我试图用它开发一个简单的网络应用程序,但我得到了一个错误。当我加载一个类组件时,我的构造函数被调用两次,你能帮忙吗?

Home.js


import React from 'react'
import Land from "../Land";

function Home() {
    return (
        <div>
            <h1>Home!</h1>
            <Land/>
        </div>
    )
}

export default Home

Partial Land.js

import React, { Component } from 'react'
import Login from "./Login";

class Land extends Component {
    constructor(props) {
        super(props)
        this.state = {

        }
        console.log("LAND")
    }


原木地被击中两次。在一些组件中,我希望进行一个命中DB的API调用,但我只想命中它一次。在许多情况下,使用componentDidMount并不方便,因为道具只出现在componentDidMount之后,因此我想在render中调用(我不会使用setState,这会导致重新加载render)。

提前感谢

共有2个答案

郜俊晤
2023-03-14

我不太明白你在评论中想说什么,但你完全可以调用函数,在componentDidMounthook中获取数据

下面是一个例子:https://codesandbox.io/s/react-calls-constructor-twice-q5gzs

池宸
2023-03-14

而在

严格模式不能自动为你检测副作用,但它可以通过使副作用更具确定性来帮助你发现它们。这是通过有意地双重调用以下函数来实现的:

类组件构造函数、渲染和应该ComponentUpdate方法

类组件静态getDerivedStateFromProps方法

职能组成机构

状态更新程序函数(setState的第一个参数)

传递给useState、UseMoom或useReducer的函数

注:

这只适用于开发模式。在生产模式下不会双重调用生命周期。

 类似资料:
  • 我有一个帖子列表,我试图在构造函数或componentDidMount中为每个帖子调用一个操作。但不知何故,当我发送一个新消息时,构造函数和componentDidMount函数会被调用两次。 当从列表中读取帖子时,这些函数仅被调用一次。但是当我发送一条新消息时,他们会被呼叫两次。 我怎样才能避免这种情况。我试着像这样使用ComponendDupDate函数:

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

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

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

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

  • 问题内容: 从文档中学习React 并遇到以下示例: 根据Mozilla的说法,super允许您在构造函数中使用。是否有其他原因可以单独使用(我知道也可以访问父类的方法),但是使用React时,是否还有其他仅通过自身调用的用例? 问题答案: 仅在具有构造函数的React组件内部被调用。例如,以下代码不需要超级: 但是,如果我们有一个构造函数,那么它是强制性的: 之所以不能被允许之前的原因是因为未调