Javascript 缺点是直接改变状态和forceUpdate()与setState

Javascript 缺点是直接改变状态和forceUpdate()与setState,javascript,reactjs,Javascript,Reactjs,React文档说不要直接对this.state进行变异,因为之后调用setState()可能会替换您所做的变异。将this.state视为不可变的…,但如果我根本不使用setState(),则这不是问题 我能想到的唯一缺点是: 无法使用shouldComponentUpdate/componentWillUpdate/componentDidUpdate来比较新旧状态 这可能会使其他从事此工作的人更难维护。因为这不是做事的标准方式 但是,如果不直接使用setState()和变异状态,还有什么

React文档说
不要直接对this.state进行变异,因为之后调用setState()可能会替换您所做的变异。将this.state视为不可变的…
,但如果我根本不使用setState(),则这不是问题

我能想到的唯一缺点是:

  • 无法使用
    shouldComponentUpdate
    /
    componentWillUpdate
    /
    componentDidUpdate
    来比较新旧状态

  • 这可能会使其他从事此工作的人更难维护。因为这不是做事的标准方式

但是,如果不直接使用setState()和变异状态,还有什么其他的缺点吗


编辑:我已经删除了我对这个想法感兴趣的原因。我知道这是一种反模式,我知道这可能不是最好的方式。但这个问题都是关于“为什么”


EDIT2:这里的关键词也是
中的
其他
。。。还有其他缺点吗…

您不应该直接改变状态。setState的异步特性有一些方法可以绕过它<代码>设置状态
提供了一个可以使用的
回调

另外,forceUpdate完全绕过了
shouldComponentUpdate
,这不是一个好模式,尤其是在使用
React.PureComponent
时,它对您的道具进行了粗略的比较

此外,您不应该使用反模式,而应该尝试以文档建议的正确方式解决您的问题

使用
setState
的另一个好处是,您可能会因此而失去控制 模式是比较您以前的
和您以后的
当前状态
使对象
可变
,尤其是在生命周期功能中

直接设置React的生命周期是一个缺点 方法-
shouldComponentUpdate()
componentWillUpdate()
componentDidUpdate()
-取决于调用的状态转换
setState()
。如果直接更改状态并使用调用
setState()
如果对象为空,则无法再实现这些方法

此外,您个人可能知道,您的代码与React的交互方式不会出现这些过度编写或其他问题,但您正在创建一种情况,其他开发人员或未来的更新人员在开始采用正确的方法时,可能会突然发现自己有奇怪或微妙的问题

使用setState改变状态
类应用程序扩展了React.Component{
状态={
柜台:0
}
updateCounter=()=>{
this.setState(prevState=>({counter:prevState.counter+1}));
}
组件将更新(下一步,下一步状态){
console.log(this.state.counter===nextState.counter);
}
componentDidUpdate(prevProps、prevState){
console.log(this.state.counter==prevState.counter);
}
render(){
返回(
{this.state.counter}
增量
)
}
}
ReactDOM.render(,document.getElementById('app'))


“我的推理是,我在React开发中遇到的大多数问题都是由于setState的异步性质造成的。”比如什么?通常,当您被一个开发良好、使用良好的框架的中心部分绊倒时,这是因为您遵循的是反模式而没有意识到。有趣的问题是,我很乐意把所有提到这种方法具体缺点的答案都投上一票。我对你投了反对票,因为这个问题没有问什么是正确的方法来设置react中的状态。我知道回调,我知道
shouldComponentUpdate
(这甚至是个问题)。我理解这种方法将是一种反模式。但是,我想了解为什么这是一种反模式。正如我在回答中所说,如果使用forceUpdate,它会绕过shouldComponentUpdate,如果使用在shouldComponentUpdate中优化的PureComponent,则会影响性能我看到了您的编辑,但这仍然不是我问题的答案。我的问题是,除了组件生命周期中的可维护性和状态比较(如
shouldComponentUpdate
)之外,还有哪些缺点,因为我知道这些缺点。我为您添加了两个片段。如果生命周期方法中的状态比较不是缺点,那么对您来说有什么缺点。如果没有生命周期功能,你将完全使框架无用。我为你添加了两个代码片段。如果生命周期方法中的状态比较不是缺点,那么你的缺点是什么。如果没有生命周期功能,您将使框架完全无用