我可以改变传递给 setState 函数的状态吗?

IT技术 reactjs setstate
2021-04-30 09:44:03

我知道我不应该直接在 React 中改变状态,但是当我使用函数时的情况如何:

onSocialClick = e => {
    const id = e.target.value;
    this.setState((prevState, props) => {
        prevState[id] = !(prevState[id]);
        return prevState;
    });
};

修改传递的对象是错误的吗?

编辑:

事实证明,我们大多数人都错了。React文档现在清楚地说明了这一点

state 是对应用更改时组件状态的引用。它不应该被直接变异。相反,应该通过基于 state 和 props 的输入构建一个新对象来表示更改

感谢@Tomáš Hübelbauer 在评论中指出。

4个回答

更简洁的方法是直接引用您要编辑的属性:

doIt = () => this.setState(({ [id]: prevValue }) => ({
  [id]: !prevValue,
}));

你这样做的方式并没有错。修改参数然后返回它是完全可以的。但是,当您根据 prevState 的值修改状态时,会使用带有 prevState 参数的 setState 并且它完全适合您的场景,并且更简洁的处理方式是

onSocialClick = e => {
    const id = e.target.value;
    this.setState((prevState, props) => {
        return {[id] : !(prevState[id])};
    });
};

不,你不应该改变 setState 的更新函数中的 prevState。

更新函数必须是纯函数


更新程序函数被调用两次。请参阅此讨论

检查以下代码并打开代码的控制台以查看其运行情况。

强烈不鼓励直接改变状态。此外,您正在改变先前的状态,然后返回它,这没有多大意义。如果您只想切换状态,state[id]然后将您的代码修复为更像:

onSocialClick = e => {
    const id = e.target.value;
    this.setState({this.state[id]: !this.state[id});
};