react-hook-form 无法使用自定义输入进行验证
react-hook-form doesn't work validation with custom input
当我只使用 时,验证工作正常:空 required-fields 给出错误,填写后,错误消失。但是如果把这个input移到一个单独的组件中,填写的时候错误会消失吗?
代码:
parent:
<InputField
validationType="underlineText"
invalidText={errors?.[name]?.message}
invalid={Boolean(errors?.[name]?.message)}
{...register(name)}
/>
InputField.tsx:
export const InputField = memo(({
invalid,
invalidText,
validationType,
...otherProps
}: IInputProps) => (
<InputValidationWrapper
invalid={invalid}
invalidText={invalidText}
validationType={validationType}
>
<input
{...otherProps}
/>
</InputValidationWrapper>
))
由于 react-hook-for
与元素的 ref
一起工作,您需要使用 React.forwardRef
包装您的自定义组件,如下所示:
const InputFieldRef = forwardRef(
({ invalid, invalidText, validationType, ...otherProps }, ref) => {
return (
<InputValidationWrapper
invalid={invalid}
invalidText={invalidText}
validationType={validationType}
>
<input {...otherProps} ref={ref} />
</InputValidationWrapper>
);
}
);
export const InputField = memo(InputFieldRef);
这里是使用上述组件的示例:
<InputField
validationType="underlineText"
invalidText={errors?.[name]?.message}
invalid={Boolean(errors?.[name]?.message)}
{...register(name, { required: "Field is Required" })}
/>
当我只使用 时,验证工作正常:空 required-fields 给出错误,填写后,错误消失。但是如果把这个input移到一个单独的组件中,填写的时候错误会消失吗?
代码:
parent:
<InputField
validationType="underlineText"
invalidText={errors?.[name]?.message}
invalid={Boolean(errors?.[name]?.message)}
{...register(name)}
/>
InputField.tsx:
export const InputField = memo(({
invalid,
invalidText,
validationType,
...otherProps
}: IInputProps) => (
<InputValidationWrapper
invalid={invalid}
invalidText={invalidText}
validationType={validationType}
>
<input
{...otherProps}
/>
</InputValidationWrapper>
))
由于 react-hook-for
与元素的 ref
一起工作,您需要使用 React.forwardRef
包装您的自定义组件,如下所示:
const InputFieldRef = forwardRef(
({ invalid, invalidText, validationType, ...otherProps }, ref) => {
return (
<InputValidationWrapper
invalid={invalid}
invalidText={invalidText}
validationType={validationType}
>
<input {...otherProps} ref={ref} />
</InputValidationWrapper>
);
}
);
export const InputField = memo(InputFieldRef);
这里是使用上述组件的示例:
<InputField
validationType="underlineText"
invalidText={errors?.[name]?.message}
invalid={Boolean(errors?.[name]?.message)}
{...register(name, { required: "Field is Required" })}
/>