Javascript 直接修改状态然后调用setState是否更快?
使用react,我们被告知。这是有道理的。但是考虑一下这种情况: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
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这样的不可变库的一个用例,在这种情况下,我还想指出的是,在处理大量数据时,最重要的瓶颈几乎肯定是将所有数据都呈现出来,而不是进行任何简单的操作