@@ -18,6 +18,7 @@ export interface UseFieldProps<Value extends FieldValue, SpecType extends Spec>
1818 name : string ;
1919 spec : SpecType ;
2020 initialValue : Value ;
21+ value : Value ;
2122 validate ?: ( value ?: Value ) => ValidateError ;
2223 tools : DynamicFormsContext [ 'tools' ] ;
2324 parentOnChange :
@@ -34,6 +35,7 @@ export const useField = <Value extends FieldValue, SpecType extends Spec>({
3435 name,
3536 spec,
3637 initialValue,
38+ value : externalValue ,
3739 validate : propsValidate ,
3840 tools,
3941 parentOnChange,
@@ -53,7 +55,7 @@ export const useField = <Value extends FieldValue, SpecType extends Spec>({
5355 ) ;
5456
5557 const [ state , setState ] = React . useState ( ( ) => {
56- let value = _ . cloneDeep ( initialValue ) ;
58+ let value = _ . cloneDeep ( externalValue ) ;
5759
5860 if ( _ . isNil ( value ) ) {
5961 if ( spec . defaultValue ) {
@@ -71,18 +73,20 @@ export const useField = <Value extends FieldValue, SpecType extends Spec>({
7173 }
7274
7375 const error = validate ?.( value ) ;
76+ const dirty = ! _ . isEqual ( value , initialValue ) ;
77+ const pristine = value === initialValue ;
7478
7579 return {
7680 active : false ,
77- dirty : false ,
81+ dirty,
7882 error,
7983 invalid : Boolean ( error ) ,
80- modified : false ,
81- pristine : false ,
82- touched : false ,
84+ modified : dirty || ! pristine ,
85+ pristine,
86+ touched : dirty || ! pristine ,
8387 valid : ! error ,
8488 value,
85- visited : false ,
89+ visited : dirty || ! pristine ,
8690 childErrors : { } ,
8791 } ;
8892 } ) ;
@@ -243,7 +247,7 @@ export const useField = <Value extends FieldValue, SpecType extends Spec>({
243247 ] ) ;
244248
245249 React . useEffect ( ( ) => {
246- if ( ! firstRenderRef . current || ! _ . isEqual ( initialValue , state . value ) || state . error ) {
250+ if ( ! firstRenderRef . current || ! _ . isEqual ( externalValue , state . value ) || state . error ) {
247251 ( parentOnChange ? parentOnChange : tools . onChange ) ( name , state . value , {
248252 ...state . childErrors ,
249253 [ name ] : state . error ,
0 commit comments