@@ -14,7 +14,7 @@ export type FieldProps<T extends object, K extends keyof T, C> = {
14
14
*/
15
15
form : FormState < T > ;
16
16
/**
17
- * The name of the field
17
+ * The name of the field in form
18
18
*/
19
19
name : K ;
20
20
/**
@@ -59,11 +59,17 @@ export type FieldProps<T extends object, K extends keyof T, C> = {
59
59
* The style to set when this field has been modified.
60
60
*/
61
61
dirtyStyle ?: React . CSSProperties ;
62
+ /**
63
+ * The ref to pass to your input component.
64
+ */
65
+ innerRef ?: React . Ref < any > ;
62
66
} ;
63
67
68
+ // Note on innerRef: React.forwardRef breaks type-checking
69
+
64
70
export function Field < T extends object , K extends keyof T , C extends React . FunctionComponent < any > | keyof JSX . IntrinsicElements = "input" > (
65
71
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 > &
67
73
SerializeProps < T [ K ] >
68
74
) {
69
75
const {
@@ -82,6 +88,7 @@ export function Field<T extends object, K extends keyof T, C extends React.Funct
82
88
errorStyle,
83
89
dirtyClassName,
84
90
dirtyStyle,
91
+ innerRef,
85
92
...rest
86
93
} = props ;
87
94
const serializeProps = {
@@ -96,6 +103,7 @@ export function Field<T extends object, K extends keyof T, C extends React.Funct
96
103
let v = ( serializer ?? defaultSerializer ) ( field . value , serializeProps ) ;
97
104
return React . createElement ( as , {
98
105
...rest ,
106
+ ref : innerRef ,
99
107
checked : typeof v === "boolean" ? v : undefined ,
100
108
value : typeof v === "boolean" ? undefined : v ,
101
109
disabled : field . state . isSubmitting || disabled ,
@@ -104,7 +112,11 @@ export function Field<T extends object, K extends keyof T, C extends React.Funct
104
112
field,
105
113
onChange : ( ev : any ) => {
106
114
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 ;
108
120
if ( typeof v === "string" || typeof v === "boolean" )
109
121
field . setValue ( ( deserializer ?? defaultDeserializer ) ( v , field . value , serializeProps ) ) ;
110
122
else field . setValue ( v ) ;
0 commit comments