();
const valid = () => {
console.log(data[name]);
setShowName(data[name]);
};
return (
<>
{name}
{JSON.stringify(showName)}
>
);
};
```
## 带有泛型的 Input 组件
`register` 函数对表单项的验证与上述较为类似,它也会根据表单项的 key 来决定传递对应的 name。为了满足 `register` 函数,可复用的 Input 组件就得需要一个泛型,用来接受不同的表单数据类型。
React hook forms 为我们提前准备好了适用于 `register` 函数的类型别名 `UseFormRegister` ,它会接受一个泛型,该泛型就是我们的表单数据类型。
所以 `register` 函数的签名看起来就像这样 `register?: UseFormRegister;` 这里的 `T` 就是我们的表单类型。但是我们还不知道传入当前组件中的表单类型是什么,所以我们的组件参数签名也需要一个泛型。
所以这里我们的组件参数看起来是这样的:
```tsx
export type FormInputProps = {
name: Path;
label?: string | undefined;
rules?: RegisterOptions;
register?: UseFormRegister;
} & DetailedHTMLProps, HTMLInputElement>;
```
值得注意的是,这里给 `input` 使用的 name 属性。因为 `register` 函数注册时使用的名称需要确保为表单类型的中的一个。所以这里需要使用 React hook forms 导出的 `Path` 类型,以配合 `register` 函数。
这里就和上述泛型组件很相似了,接下来要做的就是将组件的泛型传递给参数签名:
```tsx
const Input = >({
name,
label,
...rest
}: FormInputProps) => {};
```
这里给组件的泛型小小的约束一下,我们希望传递过来的表单类型是一个普通的对象结构 `>` 。
不仅如此,还不能忘了 `register` 函数还需要注册在 DOM 上。
```tsx
```
得益于泛型的功劳,我们将 `register` 函数传递给 `Input` 组件时,我们的组件就知道了这次表单的类型。并且确定了 `name` 属性的类型。
这是因为 `register` 函数本身的签名:`const register: UseFormRegister` 。这才使得我们的组件成功接受到了泛型。
再添加一些 `rules` 以及验证未通过时的提示,这样一个可复用的 React hook form 组件就封装好了。
```tsx
```