【发布时间】:2020-03-13 01:09:42
【问题描述】:
反应文档:
永远不要直接改变
this.state,因为之后调用setState()可能会替换您所做的突变。像对待this.state一样对待 不可变。
这很清楚。
class App extends React.Component {
state = {
data: []
}
以下我理解
updateState(event) {
const {name, value} = event.target;
let user = this.state.user; // this is a reference, not a copy...
user[name] = value; //
return this.setState({user}); // so this could replace the previous mutation
}
下面这个我看不懂
updateState(event) {
const {name, value} = event.target;
let user = {...this.state.user, [name]: value};
this.setState({user});
}
我明白(如前面的例子),我不应该只是:
- 不调用setState直接改变状态;或
- 对其进行变异,然后使用 setState。
但是,为什么我不能(没有直接突变)调用 setState 而不创建一个新的状态副本(没有传播运算符/Object.assign)?以下会有什么问题:
getData = () => {
axios.get("example.com") ...
this.setState({
data:response.data
})
}
为什么会这样:
getData = () => {
axios.get("example.com") ...
this.setState({
data:[...data, response.data]
})
}
render (){
...
}
}
【问题讨论】:
-
因为在您的示例中您想将响应数据添加到数组的末尾,而不是用它替换数组?它们根本不等价,这与突变问题是分开的。
-
您这样做是因为您只需要处理新的数据实例。这些新实例是根据前一个实例结合新数据创建的。
标签: reactjs immutability