React 实现表单组件的示例代码
import {useState} from "react";
/**
* 表单组件
* @param initial_data 初始数据
* @param validators 校验器
* @param submitFunc 提交函数
* @param children FormItem组件列表
*/
const Form = ({initial_data, validators, submitFunc, children}) => {
/**
* 表单数据状态
*/
const [formData, setFormData] = useState(initial_data);
/**
* 表单错误状态
*/
const [errors, setErrors] = useState({});
/**
* 表单数据变更处理函数
*/
const setFieldData = (name, value) => {
// 进行参数校验
if (validators && validators[name]) {
const error = validators[name](value);
if (error) {
setErrors((errors) => ({...errors, [name]: error}));
return;
}
setErrors((errors) => {
const newErrors = {...errors};
delete newErrors[name];
return newErrors;
})
}
// 更新表单数据
setFormData({
...formData,
[name]: value
});
}
/**
* 表单提交处理函数
*/
const handleSubmit = (e) => {
e.preventDefault();
if (errors && Object.keys(errors).length > 0) {
console.log('表单校验未通过');
return;
}
if (submitFunc) {
console.log('开始执行提交函数');
submitFunc(formData);
}
}
return (
<>
>
)
}
/**
* 表单项组件
*/
const FormItem = ({name, type, error, label, fieldData, setFieldData}) => {
if (type === 'submit') {
return (
)
} else if (type === 'text') {
return (
setFieldData(name, e.target.value)}/>
{error && {error}}
)
} else if (type === 'password') {
return (
onChange={e => setFieldData(name, e.target.value)}/>
{error && {error}}
}
return null;
}
export {Form, FormItem};
- .NET Core系列之MemoryCache 初识
- 007手机一键Root(安机网一键Root) v3.0 官方最新版 一键ROOT您的Android手机
- 12306密码被盗了怎么办?12306密码外泄解决方法
- 12个字的qq网名
- 150M迷你型无线路由器怎么设置?
- 192.168.1.1打不开怎么办?路由器192.168.1.1打不开的原因以及解决办法
- 2011年电子报合订本 电子报 编辑部 中文 PDF版 [84M]
- 2015年1月15日小米新旗舰发布会现场图文直播
- 2016.3.1vivo Xplay5新品发布会现场视频直播 优酷直播
- 2016华为P9发布会视频直播地址 4月15日华为P9国行发布会直播