我有以下代码;
handleBlur = event => {
const name = event.target.name;
const value = event.target.value;
this.setState({
[name]: value
}, () => {
validateInput(this.state, name).then((errors) => {
this.setState({
errors: errors
})
})
});
}
在事件触发时,我将用户名/密码设置为组件状态。在回调中,我验证所有字段均符合我的条件,并返回遇到的任何错误。然后,我再次运行setState以将这些错误置于状态。我的问题是,有更好的方法吗?在setState中包含setState似乎根本不可行。
答案 0 :(得分:3)
如果用于验证,我认为您应该在回调中使用setState,因为它将使组件多次渲染。
您可以通过将name
和errors
设置为单个setState来删除回调。
const validateInput = (state, inputName, inputValue) => {
const errors = { ...state.errors };
if (/* condition */) {
errors[inputName] = /* error's value */;
}
return errors;
}
handleBlur = event => {
const name = event.target.name;
const value = event.target.value;
this.setState({
[name]: value,
errors: validateInput(this.state, name, value),
});
}
希望对您有帮助!
答案 1 :(得分:0)
我认为您不应该在handleBlur中设置值,而应该在handleChange中设置值,并验证和设置handleBlur事件处理程序中的错误(如果有)。 仍然,如果需要,您应该在单个setState中设置值和错误,而不要进行两次调用。
答案 2 :(得分:0)
您可以使用componentDidUpdate来更新错误
handleBlur = event => {
const name = event.target.name
const value = event.target.value
this.setState({ [name]: value })
}
componentDidUpdate (prevProps, prevState) {
if (prevState[name] !== this.state[name])
validateInput(this.state, name).then(errors => {
this.setState({ errors: errors })
})
}
答案 3 :(得分:0)
首先,将验证移出,像这样:
handleBlur = event => {
const name = event.target.name;
const value = event.target.value;
this.setState({ [name]: value });
validateInput(name, value)
.then((errors) => this.setState({ errors }));
}