1
1
import { FormState } from "./form" ;
2
- import React , { useCallback } from "react" ;
2
+ import React from "react" ;
3
3
import { useListener } from "./hooks" ;
4
4
5
5
export type ElementProps < C extends React . FunctionComponent < any > | keyof JSX . IntrinsicElements > = C extends React . FunctionComponent < infer P >
@@ -46,7 +46,9 @@ export type FieldProps<T extends object, K extends keyof T, C> = {
46
46
} ;
47
47
48
48
export function Field < T extends object , K extends keyof T , C extends React . FunctionComponent < any > | keyof JSX . IntrinsicElements = "input" > (
49
- props : FieldProps < T , K , C > & Omit < ElementProps < C > , "value" | "onChange" | keyof FieldProps < T , K , C > | keyof SerializeProps > & SerializeProps < T [ K ] >
49
+ props : FieldProps < T , K , C > &
50
+ Omit < ElementProps < C > , "value" | "checked" | "onChange" | "field" | keyof FieldProps < T , K , C > | keyof SerializeProps > &
51
+ SerializeProps < T [ K ] >
50
52
) {
51
53
const { form, as = "input" , serializer, dateAsNumber, setNullOnUncheck, setUndefinedOnUncheck, deserializer, hideWhenNull, ...rest } = props ;
52
54
const serializeProps = {
@@ -56,23 +58,21 @@ export function Field<T extends object, K extends keyof T, C extends React.Funct
56
58
type : props . type ,
57
59
value : props . value
58
60
} ;
59
- const { value, setValue, state } = useListener ( form , props . name ) ;
60
- const onChange = useCallback (
61
- ( ev : any ) => {
62
- let v = "target" in ev ? ( [ "checkbox" , "radio" ] . includes ( props . type ! ) ? ev . target . checked : ev . target . value ) : ev ;
63
- if ( typeof v === "string" || typeof v === "boolean" ) setValue ( ( deserializer ?? defaultDeserializer ) ( v , value , serializeProps ) ) ;
64
- else setValue ( v ) ;
65
- } ,
66
- [ setValue , props . type ]
67
- ) ;
68
- if ( hideWhenNull && ( value === undefined || value === null ) ) return null ;
69
- let v = ( serializer ?? defaultSerializer ) ( value , serializeProps ) ;
61
+ const field = useListener ( form , props . name ) ;
62
+ if ( hideWhenNull && ( field . value === undefined || field . value === null ) ) return null ;
63
+ let v = ( serializer ?? defaultSerializer ) ( field . value , serializeProps ) ;
70
64
return React . createElement ( as , {
71
65
...rest ,
72
66
checked : typeof v === "boolean" ? v : undefined ,
73
67
value : typeof v === "boolean" ? undefined : v ,
74
- disabled : state . isSubmitting ,
75
- onChange
68
+ disabled : field . state . isSubmitting || props . disabled ,
69
+ field,
70
+ onChange : ( ev : any ) => {
71
+ let v = "target" in ev ? ( [ "checkbox" , "radio" ] . includes ( props . type ! ) ? ev . target . checked : ev . target . value ) : ev ;
72
+ if ( typeof v === "string" || typeof v === "boolean" )
73
+ field . setValue ( ( deserializer ?? defaultDeserializer ) ( v , field . value , serializeProps ) ) ;
74
+ else field . setValue ( v ) ;
75
+ }
76
76
} ) ;
77
77
}
78
78
0 commit comments