1. 组件结构设计
- 基础表单组件:创建一个基础的
<Form>
组件,用于包裹所有表单元素。这个组件负责管理整个表单的状态,如表单是否提交、是否有效等。
- 表单元素组件:针对输入框、下拉框等分别创建对应的组件,例如
<Input>
、<Select>
等。这些组件负责处理用户输入,并将值传递给 <Form>
组件。
2. 表单数据收集
- 受控组件:使用 React 的受控组件模式,在每个表单元素组件中通过
value
属性绑定到 <Form>
组件的状态。例如,<Input>
组件:
import React from 'react';
const Input = ({ value, onChange }) => {
return <input type="text" value={value} onChange={onChange} />;
};
export default Input;
- 状态管理:在
<Form>
组件中使用 useState
或 useReducer
来管理表单数据。useState
适用于简单的表单,useReducer
更适合复杂的表单状态管理,例如处理多个步骤的表单。
3. 表单验证
- 自定义验证函数:为每个表单元素组件提供一个
validate
属性,接收一个验证函数。例如,对于 <Input>
组件:
const Input = ({ value, onChange, validate }) => {
const handleChange = (e) => {
const newVal = e.target.value;
onChange(newVal);
if (validate) {
validate(newVal);
}
};
return <input type="text" value={value} onChange={handleChange} />;
};
- 整体表单验证:在
<Form>
组件提交时,遍历所有表单元素的验证结果,只有当所有验证都通过时才允许提交。可以使用 useEffect
监听表单数据变化,实时更新验证状态。
4. 与外部组件的数据交互
- 回调函数:通过在
<Form>
组件上提供 onSubmit
回调函数,当表单提交且验证通过时,将表单数据传递给外部组件。例如:
const Form = ({ onSubmit }) => {
const [formData, setFormData] = useState({});
const handleSubmit = (e) => {
e.preventDefault();
if (isFormValid) {
onSubmit(formData);
}
};
return (
<form onSubmit={handleSubmit}>
{/* 表单元素 */}
</form>
);
};
- 上下文(Context):如果需要在组件树的深层传递表单数据或状态,可以使用 React 的 Context。创建一个表单上下文,在
<Form>
组件中提供数据,在需要的子组件中消费数据。