javascript - 如何在反应中添加输入验证?
问题描述
我有一个简单的表格,它有firstName
和lastName
。
<label htmlFor="firstName">First Name: </label>
<input
type="text"
className="form-control"
id="firstName"
name="firstName"
value={basicDetails.firstName}
onChange={(event) => handleInputChange(event)}
/>
<label htmlFor="lastName">Last Name: </label>
<input
type="text"
className="form-control"
id="lastName"
name="lastName"
value={basicDetails.lastName}
onChange={(event) => handleInputChange(event)}
/>
为此,我正在尝试添加验证。
验证规则是,
- 两个字段都应该只接受文本
- 名字是必填项,至少应包含 4 个字符。
- 如果姓氏字段有值,则至少需要 3 个字符。
我试图实现这一目标的事情,
组件/utils.js
export function isLettersOnly(string) {
return /^[a-zA-Z]+$/.test(string);
}
组件/basic_details.js
const handleInputChange = (event) => {
const { name, value } = event.target;
if (!isLettersOnly(value)) {
return;
}
setValue((prev) => {
const basicDetails = { ...prev.basicDetails, [name]: value };
return { ...prev, basicDetails };
});
};
在句柄输入字段上,我正在进行验证以检查输入是否具有值,但我无法理解如何捕捉实际验证错误并显示在相应的输入框下方。
请帮我在各个字段上显示验证消息。
工作示例:
解决方案
我建议errors
在表单数据中添加一个属性form_context
:
const [formValue, setFormValue] = useState({
basicDetails: {
firstName: '',
lastName: '',
profileSummary: '',
errors: {},
},
...
});
将验证添加到basic_details
子表单:
const ErrorText = ({ children }) => (
<div style={{ color: 'red' }}>{children}</div>
);
const BasicDetails = () => {
const [value, setValue] = React.useContext(FormContext);
const { basicDetails } = value;
const handleInputChange = (event) => {
const { name, value } = event.target;
if (!isLettersOnly(value)) {
setValue((value) => ({
...value,
basicDetails: {
...value.basicDetails,
errors: {
...value.basicDetails.errors,
[name]: 'Can have only letters.',
},
},
}));
return;
}
switch (name) {
case 'firstName': {
const error = value.length < 4 ? 'Length must be at least 4.' : null;
setValue((value) => ({
...value,
basicDetails: {
...value.basicDetails,
errors: {
...value.basicDetails.errors,
[name]: error,
},
},
}));
break;
}
case 'lastName': {
const error = value.length < 3 ? 'Length must be at least 3.' : null;
setValue((value) => ({
...value,
basicDetails: {
...value.basicDetails,
errors: {
...value.basicDetails.errors,
[name]: error,
},
},
}));
break;
}
default:
// ignore
}
setValue((prev) => {
const basicDetails = { ...prev.basicDetails, [name]: value };
return { ...prev, basicDetails };
});
};
return (
<>
<br />
<br />
<div className="form-group col-sm-6">
<label htmlFor="firstName">First Name: </label>
<input
type="text"
className="form-control"
id="firstName"
name="firstName"
value={basicDetails.firstName}
onChange={(event) => handleInputChange(event)}
/>
</div>
<br />
{basicDetails.errors.firstName && (
<ErrorText>{basicDetails.errors.firstName}</ErrorText>
)}
<br />
<br />
<div className="form-group col-sm-4">
<label htmlFor="lastName">Last Name: </label>
<input
type="text"
className="form-control"
id="lastName"
name="lastName"
value={basicDetails.lastName}
onChange={(event) => handleInputChange(event)}
/>
</div>
<br />
{basicDetails.errors.lastName && (
<ErrorText>{basicDetails.errors.lastName}</ErrorText>
)}
<br />
</>
);
};
最后,检查字段值和错误以disabled
在 中的下一个按钮上设置属性index.js
。第一个!(value.basicDetails.firstName && value.basicDetails.lastName)
条件处理初始/空值状态,而第二个条件处理错误值。
{currentPage === 1 && (
<>
<BasicDetails />
<button
disabled={
!(
value.basicDetails.firstName && value.basicDetails.lastName
) ||
Object.values(value.basicDetails.errors).filter(Boolean).length
}
onClick={next}
>
Next
</button>
</>
)}
可以为以下步骤重复此模式。
推荐阅读
- python - 我似乎无法弄清楚它一直给我错误的这段代码。我正在尝试打印以显示我的姓名年龄和圆圈面积
- msbuild - “__built-in-schema.yml (Line: 2012, Col: 24): Expected a mapping” 在 V2-V3 管道转换后
- r - 带有简单数学函数的 If/If Else 语句的 For 循环需要帮助存储
- angular - Ionic 4 network.onConnect 在后台模式下不工作
- sql-server - 无法使用 Entity Framework for SQL Server 数据库视图创建具有操作的 API 控制器
- java - 为什么 Java segfaulting 中的 Z3 优化?
- r - R在哪里正确安装软件包?
- hook - 如何使用带有上下文的本机导航 wix 将数据从提供者共享到所有组件?
- sql - 将多个表中的行值合并到一个结果单元格中
- python - 如何删除 Pandas Dataframe 列中所有值的字符串的最后一个字符?