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

如果我在ReactJS或React Native中的类的构造函数中使用setState()函数会发生什么?

陶健
2023-03-14

出于好奇,我只想知道如果我在 React Native 或 ReactJS 中的类的构造函数中使用 setState() 函数会发生什么?如:

constructor(props) {
  super(props);
  this.setState({title: 'new title'});
}

React的生命周期是怎样的?

我没看过React里面的代码。我担心我那样写的话会有什么损害。

共有3个答案

姬银龙
2023-03-14

构造函数:构造函数用于初始化状态。

状态:包含本地状态的组件有一个名为“this.state”的属性。

SetState:React组件有一种称为setState的方法调用“this.setState”导致 React 重新渲染您的应用程序并更新 DOM.你也可以在 setState 中跟踪上一个状态 如果你在构造函数中使用 setState,你会得到这样的错误:只能更新已挂载或挂载的组件。这通常意味着您在未挂载的组件上调用了 setState()。

景理
2023-03-14

错误消息应为< code >未捕获的类型错误:无法读取null的属性“VARIABLE _ NAME ”

请参阅以下两个jsfiddle代码段。

案例1)工作解决方案

class Hello extends React.Component {
    constructor(props) {
      super(props);

      this.state = {
        name: 'world'
      } 
    }

  render() {
    return <div>{this.state.name} </div>
  }
}

ReactDOM.render(<Hello />, document.getElementById('container'));

案例2)解决方案不起作用

class Hello extends React.Component {
    constructor(props) {
      super(props);

      this.setState({
        name: 'hello'
      });
    }

  render() {
    return <div>{this.state.name} </div>
  }
}

ReactDOM.render(<Hello />, document.getElementById('container'));

发生这种情况:-constructor(starts setState)-render(fails-because state has no property'name'yet)-name is added to state(but too later-it has already rendered)

结论:

我的经验法则是,在constructor内部使用这个。state={}直接,其他地方使用this。setState({})

孔正文
2023-03-14

setState本质上所做的是运行一系列可能在构造函数中不需要的逻辑。

当您进入state={foo:“bar”}时,您只需向javascript对象状态>赋值,就像您对其他对象一样。(顺便说一句,这就是state的全部内容,它只是每个组件本地的常规对象)。

当您使用setState()时,除了分配给对象state反应还会重新渲染组件及其所有子组件。您在构造函数中不需要,因为组件还没有被渲染。

 类似资料:
  • 问题内容: 出于好奇,我只想知道如果我在React Native或ReactJS的Class的构造函数中使用函数会发生什么?如: React将会发生什么生命周期? 我还没有阅读React中的代码。那样写恐怕会造成一些损害。 问题答案: 什么本质上确实是运行了一堆你可能不会在构造函数需要逻辑的。 进行操作时,您只需为javascript对象分配一些内容,就如同分配其他任何对象一样。(仅此而已,只是每

  • 问题内容: 该功能运行什么?它只会运行吗? 问题答案: setState()将按以下顺序运行函数: 如果您的组件正在接收道具,它将使用上述功能运行该功能。

  • 由于派生类继承了其基类的成员,所以在建立派生类的实例对象时,必须调用基类的构造函数来初始化派生类对象的基类成员。派生类的构造函数既可以隐式调用基类的构造函数,也可以在派生类的构造函数中通过给基类提供初始化值(利用了前面所讲过的成员初始化值语法)显式地调用基类的构造函数。 派生类不继承基类的构造函数和赋值运算符,但是派生类的构造函数和赋值运算符能调用基类的构造函数和赋值运算符。 派生类的构造函数总是

  • 我正在尝试编写一个Python实用程序,将Oracle的RAW字节字符串(作为字符串)转换为Guid,反之亦然。我试图重用我在C#中构建的同一个实用程序中的算法,但是从同一个字节数组构造一个和一个会产生不同的Guid/UUID。它们是一样的,不是吗?我读过UUID只是一个更好的术语。 在C#中,我有一个字节数组,< code>byte_array如下所示: 在 Python 中,我有一个字节数组,

  • 问题内容: 在Swift 2.2中,我经常使用类似于的简洁语法声明变量。这给出了类型,并使用对其进行了初始化。 (当然,在这些示例中,您可以使用任何类型) 但是,当我在Swift 3.0中执行相同操作时,出现错误: 。它还说。不知何故,我认为我所追求的不完全是。 当然,还有其他替代方法可以执行相同的操作,例如和,但是它们比我以前使用的方法更为冗长。在Swift 3.0中删除了构造函数,还是以我尚未

  • 问题内容: 我有这样的事情: 如您所见,超类的init方法是抽象的,并在创建对象后由构造函数自动调用。 当我需要创建这种类型的对象且其结构不会及时更改时,我很好奇我是否会遇到这样的代码问题。 有什么更好的办法吗?它可以在Java中运行,但是可以在C ++和ActionScript中运行吗? 谢谢你的答案。 问题答案: 请勿从构造函数中调用过多的方法。 引用 有效Java 2nd Edition,条