Javascript 缺点是直接改变状态和forceUpdate()与setState
React文档说Javascript 缺点是直接改变状态和forceUpdate()与setState,javascript,reactjs,Javascript,Reactjs,React文档说不要直接对this.state进行变异,因为之后调用setState()可能会替换您所做的变异。将this.state视为不可变的…,但如果我根本不使用setState(),则这不是问题 我能想到的唯一缺点是: 无法使用shouldComponentUpdate/componentWillUpdate/componentDidUpdate来比较新旧状态 这可能会使其他从事此工作的人更难维护。因为这不是做事的标准方式 但是,如果不直接使用setState()和变异状态,还有什么
不要直接对this.state进行变异,因为之后调用setState()可能会替换您所做的变异。将this.state视为不可变的…
,但如果我根本不使用setState(),则这不是问题
我能想到的唯一缺点是:
- 无法使用
/shouldComponentUpdate
/componentWillUpdate
来比较新旧状态componentDidUpdate
- 这可能会使其他从事此工作的人更难维护。因为这不是做事的标准方式
编辑:我已经删除了我对这个想法感兴趣的原因。我知道这是一种反模式,我知道这可能不是最好的方式。但这个问题都是关于“为什么”
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
)之外,还有哪些缺点,因为我知道这些缺点。我为您添加了两个片段。如果生命周期方法中的状态比较不是缺点,那么对您来说有什么缺点。如果没有生命周期功能,你将完全使框架无用。我为你添加了两个代码片段。如果生命周期方法中的状态比较不是缺点,那么你的缺点是什么。如果没有生命周期功能,您将使框架完全无用