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

IT技术 reactjs react-native
2021-04-03 03:25:42

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

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

React 的生命周期会发生什么?


我还没有阅读 React 里面的代码。当我这样写时,我担心它会受到一些损害。

4个回答

什么setState本质上确实是运行了一堆你可能不会在构造函数需要逻辑的。

当你去的时候,state = {foo : "bar"}你只需将一些东西分配给 javascript 对象state,就像你分配任何其他对象一样。state顺便说一下,这只是每个组件本地的一个常规对象)。

当您使用 时setState(),除了分配给对象之外,statereact 还会重新渲染组件及其所有子组件。您在构造函数中不需要它,因为无论如何还没有呈现组件。

如果我的构造函数中有一个 promise 来操纵解析时的状态,该怎么办?我会将Promise回调中的状态设置为this.setState
2021-06-10 03:25:42
那么如果你想再次渲染,你将不得不使用 setState ......但我发现 render() 函数确实运行了两次,但是没有新值的状态仍然是默认值......
2021-06-18 03:25:42
如果您需要在构造函数中使用 promise - 不要。相反,在componentDidMount().
2021-06-21 03:25:42

错误消息将是 Uncaught TypeError: Cannot read property 'VARIABLE_NAME' of null

请参阅以下两个 jsfiddle 片段。

案例 1)工作解决方案 jsfiddle

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 - 因为 state 还没有属性 'name') -name 被添加到 state (但为时已晚 - 它已经呈现)

结论:

我的经验法则,里面直接constructor使用this.state = {},其他地方使用this.setState({ })

这个想法其实很简单。由于this.state它本身是一个普通对象,因此默认情况下更改其值不会通知任何侦听器。相反,它this.setState是一个函数调用,您实际上可以将事件通知和分派给其他侦听器。您可以看到React实际上将回调放入队列并在setState-> ReactBaseClasses 中进行更多优化
2021-06-08 03:25:42
我什至在 React Native 中也观察到了这一点。想知道背后的原因是什么?
2021-06-15 03:25:42
因为setState是异步的。如果您this.state在以下生命周期中尝试获取或修改,则可能会导致意外行为,因为this.state尚未设置。
2021-06-15 03:25:42
我想知道为什么不能在构造函数中调用 this.setState。
2021-06-17 03:25:42
那就是你得到的错误,但你没有说你为什么会得到它。我已经知道了错误(或者至少可以找到它,通过运行代码我自己),我并不需要查找什么我收到提示。我正在查找它,以了解为什么会出现此错误,以及创作者在这背后的想法是什么。我知道你回答这个问题,但对于未来的人来说,寻找答案,解释为什么会更有帮助,而不仅仅是什么
2021-06-21 03:25:42

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

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

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

React 没有限制在任何生命周期事件中使用 setState。 用于状态更新的 React 官方文档链接

有人告诉你不能直接在构造函数之外访问状态。所以你可以随意调用 setState 任何地方。

从技术上讲,setState 的目的是用传入的一些新值来更新现有状态,这会通过批处理在下一个更新周期中react处理句柄,因此在 setState 之后立即使用状态的 console.log 将给出陈旧的值。

现在让我们关注如果我们在构造函数中调用 setState 会怎样。React 将准备批处理代码,并将新状态传递给 setState 并触发更新。

虽然 react 并没有阻止你这样做,但是它知道这样做可能会给你带来麻烦,所以给你留下一个好消息

警告:setState(...):只能更新已安装或正在安装的组件。这通常意味着您在未安装的组件上调用了 setState()。这是一个无操作。请检查组件的代码。

React 继续加载组件,但更新永远不会反映该批次。

所以结论:如果你尝试这样做,你可能不会以错误告终,但你将不得不忍受不良行为,因为这些更新即使被触发也不会反映任何地方。

“因此,如果您尝试更新 setState 中尚未处于状态的一些新值,则它会通过空检查”这是错误的。它失败,因为名称未在第一次渲染中设置!
2021-05-23 03:25:42
哦是的,对不起我的错误。编辑答案。
2021-06-18 03:25:42