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
Javascript 通过setState正确修改ES6地图_Javascript_Reactjs_Ecmascript 6 - Fatal编程技术网

Javascript 通过setState正确修改ES6地图

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

我在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: 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。