我知道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只会增加我的困惑。