@@ -14,7 +14,7 @@ export type FieldProps<T extends object, K extends keyof T, C> = {
1414 */
1515 form : FormState < T > ;
1616 /**
17- * The name of the field
17+ * The name of the field in form
1818 */
1919 name : K ;
2020 /**
@@ -59,11 +59,17 @@ export type FieldProps<T extends object, K extends keyof T, C> = {
5959 * The style to set when this field has been modified.
6060 */
6161 dirtyStyle ?: React . CSSProperties ;
62+ /**
63+ * The ref to pass to your input component.
64+ */
65+ innerRef ?: React . Ref < any > ;
6266} ;
6367
68+ // Note on innerRef: React.forwardRef breaks type-checking
69+
6470export function Field < T extends object , K extends keyof T , C extends React . FunctionComponent < any > | keyof JSX . IntrinsicElements = "input" > (
6571 props : FieldProps < T , K , C > &
66- Omit < ElementProps < C > , "value" | "checked" | "onChange" | "field" | keyof FieldProps < T , K , C > | keyof SerializeProps > &
72+ Omit < ElementProps < C > , "value" | "checked" | "onChange" | "field" | "ref" | keyof FieldProps < T , K , C > | keyof SerializeProps > &
6773 SerializeProps < T [ K ] >
6874) {
6975 const {
@@ -82,6 +88,7 @@ export function Field<T extends object, K extends keyof T, C extends React.Funct
8288 errorStyle,
8389 dirtyClassName,
8490 dirtyStyle,
91+ innerRef,
8592 ...rest
8693 } = props ;
8794 const serializeProps = {
@@ -96,6 +103,7 @@ export function Field<T extends object, K extends keyof T, C extends React.Funct
96103 let v = ( serializer ?? defaultSerializer ) ( field . value , serializeProps ) ;
97104 return React . createElement ( as , {
98105 ...rest ,
106+ ref : innerRef ,
99107 checked : typeof v === "boolean" ? v : undefined ,
100108 value : typeof v === "boolean" ? undefined : v ,
101109 disabled : field . state . isSubmitting || disabled ,
@@ -104,7 +112,11 @@ export function Field<T extends object, K extends keyof T, C extends React.Funct
104112 field,
105113 onChange : ( ev : any ) => {
106114 let v =
107- typeof ev === "object" && "target" in ev ? ( [ "checkbox" , "radio" ] . includes ( props . type ! ) ? ev . target . checked : ev . target . value ) : ev ;
115+ typeof ev === "object" && "target" in ev
116+ ? props . type === "checkbox" || props . type === "radio"
117+ ? ev . target . checked
118+ : ev . target . value
119+ : ev ;
108120 if ( typeof v === "string" || typeof v === "boolean" )
109121 field . setValue ( ( deserializer ?? defaultDeserializer ) ( v , field . value , serializeProps ) ) ;
110122 else field . setValue ( v ) ;
0 commit comments