【发布时间】:2015-06-19 15:27:25
【问题描述】:
我有一个使用 Form.jsx 组件的 Page.jsx:
<Form isValid={this.enableButton} isInvalid={this.disableButton}>
<Input validation={{ presence: true }} />
</Form>
重点是:Form 需要检查每个Input 的有效性才能继续。为了实现这一点,我在Form.jsx:
// ...
allInputsAreValid: function () {
return _.all(this.state.inputsValidation, function (inputsValidation) {
return inputsValidation.error === false;
});
}
// ...
那么,在Form.jsx的render方法中:
if (this.allInputsAreValid()) {
this.props.isValid();
} else {
this.props.isInvalid();
}
最后,方法enable/disableButton(在Form.jsx上):
// ...
enableButton: function () {
this.setState({
canSubmit: true
});
},
disableButton: function () {
this.setState({
canSubmit: false
});
}
//...
在这些方法中改变状态,控制台抛出错误:
未捕获的错误:不变违规:setState(...):在现有状态转换期间无法更新(例如在
render内)。渲染方法应该是 props 和 state 的纯函数。
为什么?如何解决?
【问题讨论】:
-
<Form />正在消耗来自Page.jsx的enableButton/disableButton。当表单有效时——通过allInputsAreValid方法检查——然后调用这些方法之一。关键是:从那里更改状态会导致该错误。
标签: javascript reactjs