2017-11-11 30 views
1

反应文档说Never mutate this.state directly, as calling setState() afterwards may replace the mutation you made. Treat this.state as if it were immutable...但是,当我根本不使用setState()时,这是一个非问题。缺点直接改变状态,forceUpdate()vs setState

我能想到的唯一的缺点是:

  • 不能使用shouldComponentUpdate/componentWillUpdate/componentDidUpdate比较新旧状态。

  • 对其他人来说,维护可能会更困难。因为这不是标准的做事方式。

但是否有任何其他缺点不使用的setState()和直接突变状态?


编辑:我已经删除了我的推理为什么我吸引到这一想法。我知道这是一种反模式,我知道这可能不是最好的方式。但这个问题全是关于“为什么”。

EDIT2:这里也关键词是other... are there any other disadvantages ...

+2

*“我这背后的原因是,大多数我遇到的发展作出反应的问题,是由于对setState的异步本性。” *什么样的事情?通常,当你跳过一个发展良好,使用良好的框架的核心部分时,这是因为你没有意识到遵循反模式。不要绕过框架,找出你为什么绊倒事物。 –

+2

有趣的问题,我很高兴upvote所有的答案,提到这种方法的具体缺点 – Kos

回答

4

你不应该直接变异的状态。 setState的异步特性有办法绕过它。 setState提供您可以使用的callback

还forceUpdate完全绕过shouldComponentUpdate这不是一个好的模式,特别是当使用React.PureComponent做你的道具的浅层比较。

而且你不应该使用反模式,而试图解决您的问题,通过文档

使用setState的另一个优点是,你可以用这个 模式松动是比较你previous建议的正确方法和currentState因为你 制造的物体mutable尤其是在你的生命周期功能

缺点设置状态直接是阵营的生命周期 方法 - shouldComponentUpdate()componentWillUpdate(), componentDidUpdate() - 取决于调用状态转换 setState()。如果您直接更改状态并将setState()与 作为空对象,则不能再实现这些方法。

你也可以亲自知道你的代码交互与之反应以这样的方式,这些过度写入或其他问题都不会发生,但你要创建的情况下其他开发商或将来的更新可能会突然发现自己同时,他们开始按照正确的方法

使用的setState突变状态怪异的或微妙的问题

class App extends React.Component { 
 
    state = { 
 
     counter: 0 
 
    } 
 
    updateCounter =() => { 
 
    this.setState(prevState => ({counter: prevState.counter + 1})); 
 
    } 
 
    componentWillUpdate(nextProps, nextState){ 
 
    console.log(this.state.counter === nextState.counter); 
 
    } 
 
    
 
    componentDidUpdate(prevProps, prevState) { 
 
    console.log(this.state.counter === prevState.counter); 
 
    } 
 
    render() { 
 
     return (
 
     <div> 
 
      {this.state.counter} 
 
      <button onClick={this.updateCounter}>Increment</button> 
 
     </div> 
 
    ) 
 
    } 
 
} 
 

 
ReactDOM.render(<App/>, document.getElementById('app'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> 
 
<div id="app"></div>

直接变异状态

class App extends React.Component { 
 
    state = { 
 
     counter: 0 
 
    } 
 
    updateCounter =() => { 
 
    this.state.counter = this.state.counter + 1; 
 
    this.forceUpdate(); 
 
    } 
 
    componentWillUpdate(nextProps, nextState){ 
 
    console.log(this.state.counter === nextState.counter); 
 
    } 
 
    
 
    componentDidUpdate(prevProps, prevState) { 
 
    console.log(this.state.counter === prevState.counter); 
 
    } 
 
    render() { 
 
     return (
 
     <div> 
 
      {this.state.counter} 
 
      <button onClick={this.updateCounter}>Increment</button> 
 
     </div> 
 
    ) 
 
    } 
 
} 
 

 
ReactDOM.render(<App/>, document.getElementById('app'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> 
 
<div id="app"></div>

+0

我低估了你,因为问题不问什么是正确的方式来设置状态的反应。我知道回调,我知道'shouldComponentUpdate'(它甚至有问题)。我明白这种做法是一种反模式。 **但是,我想了解为什么会出现反模式** –

+0

正如我在回答中所说的,如果您使用forceUpdate,它会绕过shouldComponentUpdate,并且如果您使用PureComponent在shouldComponentUpdate中进行优化,则会影响性能 –

+0

看到你的编辑,但它仍然不是我的问题的答案。我的问题是除了'shouldComponentUpdate'等组件生命周期中的可维护性和状态比较之外,还有什么其他的缺点,因为我知道这些。 –