reactjs - 为什么 ReactJS 更新状态没有按预期工作?
问题描述
我知道以前有人问过这个问题。但是,如果我遵循公认的答案,它对我不起作用。这是我的代码:-
export class SurveyForm extends Component {
constructor(props) {
super(props);
this.state = {
isSelected: false,
selectedVal: 0,
selectedRatingIndex: -1,
};
this.handleSubmit = this.handleSubmit.bind(this);
}
onClick={() => {
// this is the recommended way of setting state. This doesn't work.
this.setState((prevState) => ({
selectedRatingIndex: (prevState.selectedRatingIndex = val),
}));
this.setState((prevState) => ({
isSelected: (prevState.isSelected = !this.state.isSelected),
}));
// other code removed.
}
但如果我这样做: -
this.setState({
selectedRatingIndex: (this.state.selectedRatingIndex = val),
});
this.setState({
isSelected: (this.state.isSelected = !this.state.isSelected),
});
它有效,它显示了我很困惑的警告Do not mutate state directly. Use setState()
,在这种情况下应该怎么做?
解决方案
当您setState
使用对象调用时,该对象应该只包含新值。
this.setState({
selectedRatingIndex: val,
});
this.setState({
isSelected: !this.state.isSelected, // it would be better to use a prevState callback instead of this.state
});
当您使用prevState
回调时,您会返回一个从prevState
.
this.setState((prevState) => ({
selectedRatingIndex: val, // there is no point to a prevState callback here because prevState is unused
}));
this.setState(prevState => ({
isSelected: !prevState.isSelected,
}));
当你做这样的事情时:
this.setState({
selectedRatingIndex: (this.state.selectedRatingIndex = val),
});
this.state.selectedRatingIndex = val
您正在通过设置=
which 是赋值运算符来改变状态。该赋值的返回值是新值 ( val
),这就是它起作用的原因:您本质上是在调用this.setState({ selectedRatingIndex: val })
,但是您正在改变您不应该做的过程中的状态。
推荐阅读
- java - 每个 xml 标记上的 JAXB 命名空间
- postgresql - 如何检查 psql 查询的性能
- python - Python3 导入失败
- html - HTML Bootstrap 表单样式
- linux - aws api gateway cli 更新集成请求失败并带有 $ 参数
- proof - n 自然之和的 Agda 证明
- php - 具有 2 个变量的 Ajax 数据表 + 在一列中呈现
- python - TensorFlow 的安装问题;权限错误
- angular - 如何在 TemplateRef 中找到 Element
- angular - 带有自定义指令的输入文本的格式和输入数字