【发布时间】:2020-12-24 05:00:16
【问题描述】:
在使用多个 if 语句的 handleClick 函数内进行验证期间,只有最后一个将错误状态设置为 true (errors.sintomas: true),甚至将所有输入留空(其余的将其设置为 false,即错误的初始状态,从而防止输入获得除最后一个注释外的红色边框)。因此,将所有输入留空会给我一个错误状态:
{ 吉祥物:假, 产权:假, 费查:假的, 霍拉:假的, 圣托玛斯: 真的 }
为什么会这样?这是所有代码:
const Formulario = () => {
const [cita, setCita] = useState({
mascota: '',
propietario: '',
fecha: '',
hora: '',
sintomas: ''
});
const [errors, setErrors] = useState({
mascota: false,
propietario: false,
fecha: false,
hora: false,
sintomas: false
});
const [triggerAnim, setTriggerAnim] = useState(false);
const handleChange = (e) => {
setCita({ ...cita, [e.target.name]: e.target.value });
};
const handleClick = (e) => {
e.preventDefault();
if (cita.mascota.trim().length < 1) {
setErrors({ ...errors, mascota: true });
setTriggerAnim(true);
}
if (cita.propietario.trim().length < 1) {
setErrors({ ...errors, propietario: true });
setTriggerAnim(true);
}
if (cita.fecha.trim().length < 1) {
setErrors({ ...errors, fecha: true });
setTriggerAnim(true);
}
if (cita.hora.trim().length < 1) {
setErrors({ ...errors, hora: true });
setTriggerAnim(true);
}
if (cita.sintomas.trim().length < 1) {
setErrors({ ...errors, sintomas: true });
setTriggerAnim(true);
}
};
return (
<Fragment>
<h2>Crear una cita</h2>
<form>
<label htmlFor="mascota">Nombre de tu mascota:</label>
<input
type="text"
name="mascota"
className={`u-full-width ${errors.mascota ? 'error' : ''}`}
placeholder="Nombre de la mascota"
onChange={handleChange}
value={cita.mascota}
/>
<label htmlFor=" propietario">Nombre del propietario:</label>
<input
type="text"
name="propietario"
className={`u-full-width ${errors.propietario ? 'error' : ''}`}
placeholder="Nombre del propietario"
onChange={handleChange}
value={cita.propietario}
/>
<label htmlFor="fecha">Fecha:</label>
<input
type="date"
name="fecha"
className={`u-full-width ${errors.fecha ? 'error' : ''}`}
onChange={handleChange}
value={cita.fecha}
/>
<label htmlFor="hora">Hora:</label>
<input
type="time"
name="hora"
className={`u-full-width ${errors.hora ? 'error' : ''}`}
onChange={handleChange}
value={cita.hora}
/>
<label htmlFor="sintomas">Sintomas</label>
<input
type="text"
name="sintomas"
className={`u-full-width ${errors.sintomas ? 'error' : ''}`}
placeholder="Síntomas de la mascota:"
onChange={handleChange}
value={cita.sintomas}
/>
<button className="button-primary u-full-width" onClick={handleClick}>
Crear Cita
</button>
</form>
</Fragment>
);
};
export default Formulario;
不明白为什么只有最后一个 if 语句有效。 如果我使用 setErrors(prevState => {return {...prevState, mascota: true}) (具有先前状态的回调),那么突然一切正常。为什么使用对象扩展运算符更新状态不起作用?
【问题讨论】:
标签: reactjs react-hooks