React中setState是浅拷贝还是深拷贝

vin*_*mar 3 reactjs

当我们设置状态时,引用地址是否会改变,即反应是否进行浅复制或深复制setState

this.setState({count:1})
Run Code Online (Sandbox Code Playgroud)

Aja*_*bas 5

怎样setState()运作?

每当你传递一个对象setState()(你也可以在这里传递函数)时,React 就会获取这个对象并将其合并到该state对象中。

两个对象的合并如何进行?

合并两个对象的工作方式如下:如果两个对象具有相同名称的属性,则第二个对象属性将覆盖第一个对象属性。让我们看一个例子,

let obj1 = { // Consider this as state
    name: 'Ajay',
    music: ['Shape of you','Closer']
}

let obj2 = { // Consider this as the object you pass to setState()
    music: 'Cheap Thrills'
}

let obj3 = {...obj1, ...obj2} // Consider this as the new state

console.log(obj3)
Run Code Online (Sandbox Code Playgroud)

输出

{ name: 'Ajay', music: 'Cheap Thrills' }
Run Code Online (Sandbox Code Playgroud)

请注意,这只是浅层合并。因此,setState()不执行深层复制。它仅执行浅合并。