react表单验证实现
React 表单验证的实现方法
使用受控组件实现基础验证
通过useState管理表单输入值,在提交时进行验证:
import { useState } from 'react';
function Form() {
const [email, setEmail] = useState('');
const [errors, setErrors] = useState({});
const validate = () => {
const newErrors = {};
if (!email) newErrors.email = 'Email is required';
else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email))
newErrors.email = 'Invalid email format';
setErrors(newErrors);
return Object.keys(newErrors).length === 0;
};
const handleSubmit = (e) => {
e.preventDefault();
if (validate()) {
// 提交逻辑
}
};
return (
<form onSubmit={handleSubmit}>
<input
type="email"
value={email}
onChange={(e) => setEmail(e.target.value)}
/>
{errors.email && <span>{errors.email}</span>}
<button type="submit">Submit</button>
</form>
);
}
使用Formik和Yup进行高级验证
Formik处理表单状态,Yup提供声明式验证规则:
import { Formik, Form, Field } from 'formik';
import * as Yup from 'yup';
const validationSchema = Yup.object().shape({
email: Yup.string()
.email('Invalid email')
.required('Required'),
password: Yup.string()
.min(8, 'Too short')
.required('Required')
});
function FormikForm() {
return (
<Formik
initialValues={{ email: '', password: '' }}
validationSchema={validationSchema}
onSubmit={(values) => {
console.log(values);
}}
>
{({ errors, touched }) => (
<Form>
<Field name="email" type="email" />
{errors.email && touched.email && <div>{errors.email}</div>}
<Field name="password" type="password" />
{errors.password && touched.password && <div>{errors.password}</div>}
<button type="submit">Submit</button>
</Form>
)}
</Formik>
);
}
实时验证实现
在输入变化时立即验证,提供即时反馈:
function LiveValidation() {
const [formData, setFormData] = useState({
username: '',
password: ''
});
const [errors, setErrors] = useState({});
const handleChange = (e) => {
const { name, value } = e.target;
setFormData(prev => ({ ...prev, [name]: value }));
// 实时验证逻辑
const newErrors = { ...errors };
if (name === 'username') {
if (value.length < 3) newErrors.username = 'Too short';
else delete newErrors.username;
}
if (name === 'password') {
if (value.length < 8) newErrors.password = 'Minimum 8 characters';
else delete newErrors.password;
}
setErrors(newErrors);
};
return (
<form>
<input
name="username"
value={formData.username}
onChange={handleChange}
/>
{errors.username && <span>{errors.username}</span>}
<input
name="password"
type="password"
value={formData.password}
onChange={handleChange}
/>
{errors.password && <span>{errors.password}</span>}
</form>
);
}
自定义验证钩子
创建可复用的验证逻辑钩子:
function useFormValidation(initialState, validate) {
const [values, setValues] = useState(initialState);
const [errors, setErrors] = useState({});
const handleChange = (e) => {
const { name, value } = e.target;
setValues({
...values,
[name]: value
});
setErrors({
...errors,
[name]: validate[name] ? validate[name](value) : null
});
};
return {
values,
errors,
handleChange
};
}
// 使用示例
function CustomHookForm() {
const validate = {
email: (value) => {
if (!value) return 'Email is required';
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value))
return 'Invalid email format';
return null;
}
};
const { values, errors, handleChange } = useFormValidation(
{ email: '' },
validate
);
return (
<form>
<input
name="email"
value={values.email}
onChange={handleChange}
/>
{errors.email && <span>{errors.email}</span>}
</form>
);
}
第三方库推荐
- React Hook Form:高性能表单库,支持非受控组件
- Formik + Yup:组合方案,适合复杂表单场景
- Final Form:订阅式表单管理,高度可定制
- Redux Form:适合与Redux集成的场景(已不再维护)







