在我的React应用中,我的电子邮件输入字段出现在onChange事件中的错误:
警告:组件正在更改以下设备的受控输入 输入不受控制的文本。输入元素不应从 控制到不受控制(反之亦然)。
这是导致此警告的onChange块;如果我删除了第一个if块,错误就会消失,但是我当然需要在那里进行电子邮件验证。
validateEmail(email) {
const re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
return re.test(email);
}
handleOnChange = e => {
const { name, value } = e.target;
const emailInput = e.target.value;
const emailValid = this.validateEmail(emailInput);
if (name === 'email') {
this.setState({
inputs: {
email: emailInput,
},
errors: {
email: !emailValid,
},
});
} else {
this.setState({
inputs: {
...this.state.inputs,
[name]: value,
},
errors: {
...this.state.errors,
[name]: false,
},
});
}
};
状态:
constructor() {
super();
this.state = {
inputs: {
name: '',
email: '',
message: '',
},
phone: '',
show: true,
errors: {
name: false,
email: false,
message: false,
},
};
}
如何保留当前代码并解决警告?
答案 0 :(得分:1)
您需要在if块中散布现有/先前状态。您可能还有其他input
标签,它们最初连接到input-state
对象,如下所示:
inputs: {
name: "",
email: "",
message: ""
}
<input value={this.state.input.name} name="name"/>
<input value={this.state.input.email} name="email"/>
<input value={this.state.input.message} name="message"/>
但是当您在发布的代码中使用this.setState()
时,连接将丢失。您正在将inputs
状态设置为具有单个电子邮件属性的对象:
inputs: {
email: "valueFromEventTarget"
}
您需要做的是传播现有状态,以免丢失输入对象中的其他键/值对:将handleChange()
函数更新为此:
handleOnChange = e => {
const { name, value } = e.target;
const emailInput = e.target.value;
const emailValid = this.validateEmail(emailInput);
if (name === 'email') {
this.setState({
inputs: {
...this.state.inputs,
email: emailInput,
},
errors: {
...this.state.errors,
email: !emailValid,
},
});
} else {
this.setState({
inputs: {
...this.state.inputs,
[name]: value,
},
errors: {
...this.state.errors,
[name]: false,
},
});
}
};