import { FieldValues, useController, Control, FieldPath, RegisterOptions, UseControllerReturn, useFormContext, } from 'react-hook-form'; export interface UseFormFieldOptions< TFieldValues extends FieldValues = FieldValues > { /** * 表单字段名称 */ name: FieldPath; /** * 表单控制器,通常从 useFormContext 获取 */ control?: Control; /** * 表单验证规则 */ rules?: RegisterOptions; /** * 自定义错误信息 */ customError?: string; } export interface UseFormFieldReturn< TFieldValues extends FieldValues = FieldValues > extends UseControllerReturn { /** * 最终的错误信息(优先级:customError > field validation error) */ errorMessage: string | undefined; /** * 是否有错误 */ hasError: boolean; } /** * 用于表单字段的通用Hook,封装了useController的常用逻辑 * 提供统一的错误处理和表单上下文支持 */ export function useFormField({ name, control, rules, customError, }: UseFormFieldOptions): UseFormFieldReturn { // 获取表单上下文 const formContext = useFormContext(); // 使用useController,支持从context获取control const controllerReturn = useController({ name, control: control || formContext?.control, rules, }); const { fieldState } = controllerReturn; const errorMessage = fieldState.error?.message || customError; const hasError = !!errorMessage; return { ...controllerReturn, errorMessage, hasError, }; } export default useFormField;