Javascript 通过setState正确修改ES6地图
我在react组件状态下使用ES6映射,我想知道通过setState更新它的正确方法是什么 我在想这样的事情Javascript 通过setState正确修改ES6地图,javascript,reactjs,ecmascript-6,Javascript,Reactjs,Ecmascript 6,我在react组件状态下使用ES6映射,我想知道通过setState更新它的正确方法是什么 我在想这样的事情 let clonedMap = new Map(myMap) // make a shallow copy of the Map clonedMap.set('key', 'value') // modify the copy clonedMap.delete('foo') this.setState({ myMap: clonedMa
let clonedMap = new Map(myMap) // make a shallow copy of the Map
clonedMap.set('key', 'value') // modify the copy
clonedMap.delete('foo')
this.setState({ myMap: clonedMap }) // set the copy as new state
这样做对吗?副本不应该是深度副本吗?您的代码是一个浅层副本,通过新引用修改
myMap
,并希望将新引用赋予状态
如果真正的目的是希望新的映射
具有与旧的映射
中定义的属性相同的属性,我建议使用对象
。使用Object
时,更容易深入克隆“那些”属性。或者在新的映射中再次定义这些属性
下面是一个讨论JavaScript中的数据结构深度克隆
如果您只想在状态中更新映射
,下面的代码就可以了:
this.setState(function(prevState, props) {
prevState.myMap.set('key', 'value');
prevState.myMap.delete('foo');
return {
myMap: prevState.myMap
}
});
从
。。。prevState是对以前状态的引用
几行之后
。。。更新程序的输出与prevState浅合并
句子中的更新程序是setState()
只有在生命周期功能中的某个地方进行深入比较时,才应该使用深度复制。深度复制映射是低效的。如果你想这样做,你应该考虑使用iMuababel.js。