Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.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 直接修改状态然后调用setState是否更快?_Javascript_Reactjs - Fatal编程技术网

Javascript 直接修改状态然后调用setState是否更快?

Javascript 直接修改状态然后调用setState是否更快?,javascript,reactjs,Javascript,Reactjs,使用react,我们被告知。这是有道理的。但是考虑一下这种情况: export default class Example extends Component { constructor() { super(); this.state = { largeArray = [values, in, here], } } copyAndAddElement = () => { const newState = [ ...this.sta

使用react,我们被告知。这是有道理的。但是考虑一下这种情况:

export default class Example extends Component {
  constructor() {
    super();

    this.state = {
      largeArray = [values, in, here],
    }
  }

  copyAndAddElement = () => {
    const newState = [ ...this.state.largeArray ];

    newState.push({ something: 'new' });

    this.setState({ largeArray: newState });
  }

  mutateAndSet = () => {
    this.state.largeArray.push({ something: 'new' });

    this.setState({ largeArray: this.state.largeArray });
  }

  render = () => ( JSON.stringify(this.state.largeArray) )
}
也许我太天真了,但为什么不直接使用mutateAndSet呢?如果该阵列中有大量数据,那么为了修改它而进行深度复制不是需要大量的过程吗

我看到的唯一问题可能是setState的异步性质,即在muateAndSet中的setState实际执行之前,largeArray可以通过不同的函数进行修改。在我的例子中,我只是将点添加到图形中,从不从其他位置移除或修改


如果我有一个非常大的数组,为什么不采取看起来性能更好的方法呢?

由于setState是同步行为,因此永远不应该直接改变状态。
如果您经常使用mutateAndSet插入数据,并且一次触发2个setstate,React将不知道哪一个是原始数组,信息将丢失。

您破坏了React检查重新加载的方式,并可能导致意外行为。如果你想加速你的应用程序,你可以看很多、无穷无尽、不同的方向。据我所知,唯一的危险是你可能会间接失去你所做的修改。您仍然是正确的,但在处理大量数据时,不变性似乎很麻烦。我想你已经回答了我的问题。顺便说一句,如果你担心性能,那么this.setState{largeArray:this.state.largeArray.concat[{something:'new'}]}将比当前的copyAndAddElement方法效率更高。这种场景可能是像ImmutableJS这样的不可变库的一个用例,在这种情况下,我还想指出的是,在处理大量数据时,最重要的瓶颈几乎肯定是将所有数据都呈现出来,而不是进行任何简单的操作