我正在定义一个useForm。const { handleSubmit, control, errors } = useForm<{email: string}>();
现在我正在创建一个单独的组件,它将作为输入,我将传递我在上面创建的useForm
prop 。
这就是组件的样子。
type Props<T> = {
name: FieldName<T>;
control: Control<T>;
errors: FieldErrors<T>;
};
const ControlTextInput = <T extends {}>({
name,
control,
errors,
}: Props<T>) => {
return (
<Controller
name={name}
control={control}
rules={{
required:'this is required',
}}
render={({ onChange }) => (
<>
<TextInput
onChangeText={(text) => {
onChange(text);
}}
/>
{/* Show my error here */}
{errors.email && (
<Text style={{ color: "red" }}>
{errors.email?.message}
</Text>
)}
</>
)}
/>
);
};
我想这样使用组件。
<ControlTextInput<AnyObject>
name="email"
errors={errors}
control={control}
/>
当鼠标悬停在errors.email
上时,出现此错误
3条答案
按热度按时间jecbmhm31#
React Hook Form公开了
UseControllerProps
类型,它接受泛型类型T,T可以推断出你的输入值类型,换句话说就是FieldValues
类型。最初,你通过将字段的类型传递给useForm
钩子来定义FieldValues
类型(参见下面的MyInputTypes
)。这意味着您可以创建扩展
UseControllerProps
并具有泛型Tinterface Props<T> extends UseControllerProps<T> {}
的接口。类型UseControllerProps
已经包含name
和control
的类型定义,因此您不需要在接口中单独定义它们(除非您想这样做或有特殊要求/原因这样做)。关于errors
适当的解决方案Imo(因为你只需要关于单个字段的错误)将直接传递类型为FieldError | undefined
的特定错误。结果看起来像下面的代码。然后,您可以简单地使用ControlTextInput,如下所示。
在Component(使用ControlTextInput)中,泛型T必须扩展
FieldValues
,因为最终,正是这个类型推断了字段的类型。例如ControlTextInput
作为使用ControlTextInput的示例组件
以下是一些截图,其中包含或多或少模仿您的方法和解决方案的现成代码(与上述StackOverflow的新代码相同)。
ControlTextInput
Component which uses ControlTextInput
vyswwuz22#
让我向你展示如何输入props来将
errors
或register
方法传递给子组件(基于ChakraUI):表格内容:
父组件:
pdsfdshx3#
我找到解决方案的方法是使用错误类型any
errors?: any;
使用lodash get函数
const errName = get(errors, name);
然后我可以得到错误已经跟随。
{errName && <Text style={{ color: "red" }}>{errName.message}</Text>}