Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果新旧值相同,是否执行react setState?_Javascript_Reactjs - Fatal编程技术网

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
)。请参阅,了解如何执行此操作。这如何应用于功能组件?