我知道this.state
不应该直接修改,而是setState
应该使用。
由此我推断它prevState
也应该被视为不可变的,而setState
应该始终看起来像这样:
this.setState((prevState) => {
// Create a new object instance to return
const state = { ...prevState };
state.counter = state.counter + 1;
return state;
});
或者使用更深的嵌套:
this.setState((prevState) => {
// Create a new object instance to return
const state = { ...prevState, counter: { ...prevState.counter } };
state.counter.value = state.counter.value + 1;
return state;
});
或者只是部分更新,就像使用setState({})
更容易和更好的地方:
this.setState((prevState) => ({ counter: prevState.counter + 1 }));
以上所有内容显然都是正确的,因为它们返回一个新实例,但后来我遇到了这个问题,其中接受的答案鼓励在prevState
不返回新对象实例的情况下进行变异(注意问题中的代码块)。
像这样的东西:
this.setState((prevState) => {
prevState.flag = !prevState.flag;
return prevState;
});
我发现这是一个粗略的建议,所以我决定测试一下的对象实例的引用prevState
,并this.state
是相同的:
class Test extends React.Component {
state = { counter: 0 };
onDemonstrateButtonClick = (event) => {
this.setState((prevState) => {
if (prevState === this.state) alert(`uh, yep`);
prevState.counter++;
return prevState;
});
};
render() {
return (
<div>
<button onClick={this.onDemonstrateButtonClick}>Demonstrate</button>
{this.state.counter}
</div>
);
}
}
Whadayaknow,他们是!那么它是哪个?答案是错误的,我应该返回一个新的对象实例还是将部分更新作为新对象返回,或者我可以疯狂地prevState
直接改变参数吗?如果是,这与this.state
直接变异有什么不同?
旁注:TypeScript React 类型不会将参数标记为ReadOnly
只会增加我的困惑。