【问题标题】:Setting state by assignment通过赋值设置状态
【发布时间】:2015-11-27 05:35:49
【问题描述】:

在反应中,是否有人想通过赋值而不是调用 setState(...) 来设置变量的状态

例子:

// accessing state var directly
this.state.myVar = 'changed state'
// instead of calling setState
this.setState({myVar: 'changed state'})

对我来说,这似乎是一种反模式。但也许有一个很好的解释为什么有时它是必要的?

【问题讨论】:

    标签: reactjs


    【解决方案1】:

    在这种情况下,直接设置(改变)状态将起作用: this.state.myVar = 'changed state'
    但是根据React docs应该避免:

    永远不要直接改变this.state,因为之后调用setState() 可能会替换你所做的改变。将 this.state 视为不可变的。

    改变状态的主要问题是它阻止了一些 React 生命周期方法的工作。例如,React 的shouldComponentUpdate() 方法通常用于在处理大量组件时加快应用程序的速度。如果状态已更新,该方法允许您跳过重新渲染组件:

    // Return false if you want to skip the `render()` method
    shouldComponentUpdate: function(nextProps, nextState) {
      return this.state.myVar === nextState.myVar;
    }
    

    如果您正在改变状态,上述方法将不起作用。 this.state.myVarnextState.myVar 引用是相同的,因此上面将始终返回 true

    【讨论】:

      【解决方案2】:

      这是必要的,因为 React 必须知道 this.state 是否被认为是变异的。 React 中没有脏检查。当调用this.setState 时,状态对象被认为是脏的,并且不会对其先前的状态进行进一步的比较。这个答案可能有助于更详细地解释这一点:Why is React's concept of Virtual DOM said to be more performant than dirty model checking?

      【讨论】:

      • 因此,如果我通过执行以下操作更新状态变量:this.state.myVar ='changed var',我假设状态对象不会被视为脏对象?这就是为什么有人想要这样做的原因?
      • 我认为你应该避免直接改变状态,这样可以避免混淆代码和“为什么不更新!?!” :)
      • 是的,我就是这么想的。我只是想知道是否有充分的理由这样做。
      猜你喜欢
      • 2018-02-04
      • 2019-07-19
      • 1970-01-01
      • 2019-11-23
      • 2011-11-20
      • 1970-01-01
      • 1970-01-01
      • 2016-11-11
      • 2016-05-30
      相关资源
      最近更新 更多