【发布时间】:2022-01-24 00:44:00
【问题描述】:
我的 React 应用程序有问题。我有一个带有两个输入的表单,当我提交带有空输入的表单时,它应该在每个输入中呈现一条错误消息。问题是它没有显示第一个输入。如何修复它以显示每个错误?实现在useForm.js。
我的代码:
Form.js
const Form = () => {
const formLogin = () => {
console.log("Callback function when form is submitted!");
console.log("Form Values ", values);
}
const {handleChange, values, errors, handleSubmit} = useForm(formLogin);
return (
<Wrapper>
<form onSubmit={handleSubmit}>
<div className="govgr-form-group gap-bottom">
<label className="govgr-label govgr-!-font-weight-bold" htmlFor="code">Code*</label>
{errors.code && <p className="govgr-error-message"><span className="govgr-visually-hidden">Λάθος:</span>{errors.code}</p>}
<input className={`govgr-input govgr-!-width-three-quarter ${errors.code ? 'govgr-error-input' : ''}`} id="code" name="code" type="text" onChange={handleChange} />
</div>
<fieldset>
<div className="govgr-form-group">
<label className="govgr-label govgr-!-font-weight-bold" htmlFor="first">Name*</label>
{errors.first && <p className="govgr-error-message"><span className="govgr-visually-hidden">Λάθος:</span>{errors.first}</p>}
<input className={`govgr-input govgr-!-width-three-quarter ${errors.first ? 'govgr-error-input' : ''}`} id="first" name="first" type="text" onChange={handleChange} />
</div>
</fieldset>
<button type="submit" className="govgr-btn govgr-btn-primary btn-center">Save</button>
</form>
</Wrapper>
);
};
export default Form;
useForm.js:
const useForm = (callback) => {
const [values, setValues] = useState({});
const [errors, setErrors] = useState({});
const validate = (event, name, value) => {
event.persist();
switch (name) {
case "code":
if (value.trim() === "" || value.trim() === null) {
setErrors({
...errors,
code: "Code is required",
});
} else {
let newObj = omit(errors, "code");
setErrors(newObj);
}
break;
case "first":
if (value.trim() === "" || value.trim() === null) {
setErrors({
...errors,
first: "Name is required",
});
} else {
let newObj = omit(errors, "first");
setErrors(newObj);
}
break;
default:
break;
}
};
const handleChange = (event) => {
event.persist();
let name = event.target.name;
let val = event.target.value;
validate(event, name, val);
setValues({
...values,
[name]: val,
});
};
const handleSubmit = (event) => {
if (event) event.preventDefault();
if (
Object.keys(errors).length === 0 &&
Object.keys(values).length !== 0 &&
values.code &&
values.first
) {
callback();
} else {
if (!values.code) {
setErrors({
...errors,
code: "Code is required.",
});
}
if (!values.first) {
setErrors({
...errors,
first: "Name is required.",
});
}
}
};
return {
values,
errors,
handleChange,
handleSubmit
};
};
export default useForm;
【问题讨论】:
-
此代码中不需要
event.persist()。这仅适用于异步处理程序。此外,您复制了验证码。这些都不会导致您的错误,但无论如何您都应该注意它们。 -
您不应该在
setErrors调用中使用errors。您应该改用此构造:setErrors(e => ({...e, code: "Code is required"}))。尝试删除错误时同样适用:使用setErrors(e => e.filter(e.hasOwnProperty('code')),或类似的东西。 -
我不认为你可以在这里使用 switch 语句,默认情况下 switch 语句返回许多选项之一。因此,您只会返回一个错误,您可以在此处阅读更多信息 -> w3schools.com/js/js_switch.asp 我也认为这段代码对于您想要实现的目标来说过于复杂,也许需要重新编写。
-
@snazzyy - validate/switch 是从 onchange 事件中调用的,它只在单个字段中被调用,所以它是正确的。我同意这段代码太复杂了。
-
你是对的@SoftwareEngineer