Javascript 如果新旧值相同,是否执行react setState?
初始状态:Javascript 如果新旧值相同,是否执行react setState?,javascript,reactjs,Javascript,Reactjs,初始状态: this.state = { someVar: true }; 如果我有一个代码将状态值设置为与旧代码相同,该怎么办 this.setState({ someVar: true }); 第二个代码段是否执行?如果它执行并运行多次,是否会降低性能?是的,如果您对shouldComponentUpdate中的状态没有任何比较,则会降低性能 默认情况下,如果您的组件扩展了PureComponent,则可以执行此操作。 您可以阅读更多信息。设置状态只会设置新值,与以前的状态没有比
this.state = {
someVar: true
};
如果我有一个代码将状态值设置为与旧代码相同,该怎么办
this.setState({
someVar: true
});
第二个代码段是否执行?如果它执行并运行多次,是否会降低性能?是的,如果您对
shouldComponentUpdate
中的状态没有任何比较,则会降低性能
默认情况下,如果您的组件扩展了PureComponent
,则可以执行此操作。
您可以阅读更多信息。设置状态只会设置新值,与以前的状态没有比较<然后调用code>shouldComponentUpdate,以决定是否应进行渲染
请注意,默认情况下它返回
true
。实际上,您可以调用多个setState,并且可以将多个setState()调用批处理到单个更新中以提高性能。但请记住,这将是异步的()
至于设置相同的状态,所有其他答案都是正确的。即使新值相等,SetState也将执行
第二个代码段是否执行?如果执行和运行多次,是否会降低性能
是的,是的。但是,有两种方法可以防止这种情况发生
使用
PureComponent扩展
通常,在编写React组件时,您会编写:
class MyComponent extends React.Component {
如果您想对新旧道具和状态进行肤浅的比较,您可以写:
class MyComponent extends React.PureComponent {
这是更简单的方法。更多信息来自官方文档
手动检查shouldComponentUpdate()
您始终可以自己执行此逻辑,并使用shouldComponentUpdate()
lifecycle方法告诉React何时忽略重新渲染
shouldComponentUpdate(nextProps, nextState) {
if(this.state.someVar === nextState.someVar) return false;
return true;
}
在上面的示例中,如果someVar
在渲染中是相同的,则组件将不会重新渲染。但是,对其他状态或prop变量的任何其他更新都将触发重新渲染
更多信息请参见官方文档。注意,shouldComponentUpdate
仅适用于对象。在扩展之前,请确保阅读链接文档。纯组件将使用浅层比较。无论如何,只应使用允许状态。如果没有,则应重新创建对象本身。例如,this.setState({…existingThingy,{key:newValue}});如果存在多个状态(someVar、someVar2等),shouldComponentUpdate
无法解决此问题。因为当只有一个状态保持不变时,这将阻止组件更新。@PoBéo,您可以始终在逻辑中添加这些变量。如if(this.state.someVar==nextState.someVar | | this.state.someVar2==nextState.someVar2)返回false代码>。或者,您可以比较整个状态对象(this.state
和nextState
)。请参阅,了解如何执行此操作。这如何应用于功能组件?