直接更改prevState
可以吗?
例如
this.setState(prevState => {
for(let k in prevState.content.text){
prevState.content.text[k].line = "changed";
}
return {content: prevState.content}
}
这可以接受吗?如何以正确的方式做到这一点?
this.setState(prevState => {
let changedState = {...prevState}
for(let k in changedState.content.text){
changedState.content.text[k].line = "changed";
}
return {content: changedState.content}
}
我应该这样做吗?还是有更好的方法呢?
答案 0 :(得分:2)
第二种方法也不正确。因为传播属性(例如{...prevState}
)不是深层副本。如果比较prevState.content === changedState.content
,将得到true
。这就是第一和第二种方法错误的原因。您可以像这样更新状态:
this.setState(prevState => {
const newText = {};
Object.keys(prevState.content.text).forEach((key) => {
newText[key] = {
...prevState.content.text[key],
line: "changed"
}
});
return {
content: {
...prevState.content,
text: newText
}
}
});
或者您可以使用reduce
代替forEach
。
答案 1 :(得分:0)
您可以修改prevState
,但是您将无法跟踪componentDidUpdate
钩子中的更改,因为在第二个参数中您将获得与当前参数相同的对象状态,而不是以前的状态。
第二种方法是正确的