1- import React , { useCallback , useEffect , useMemo , memo } from 'react' ;
1+ import React , { useCallback , useLayoutEffect , useMemo , memo } from 'react' ;
22import type { ComponentType } from 'react' ;
33import { useUnit } from 'effector-react' ;
44import pickBy from 'lodash/pickBy' ;
55
66import { FIELD_CONFIG } from './constants' ;
7- import type { IRFieldProps , IValue } from './types' ;
7+ import type { IFieldProps , IForm , IRFieldProps , IValue } from './types' ;
88import { useFormInstance } from './useFormInstance' ;
99import { useStoreProp } from './useStoreProp' ;
1010
11+ const useValue = ( form : IForm , name : string ) => {
12+ const fieldValue = useStoreProp ( form . $values , name ) ;
13+ const format = useStoreProp ( form . $fieldsConfig , `${ name } .format` , FIELD_CONFIG . format ) as IFieldProps [ 'format' ] ;
14+
15+ return useMemo ( ( ) => format ( fieldValue ) , [ fieldValue , name ] ) ;
16+ } ;
17+
1118const InternalFieldInst = ( { Field, name, formName, ...rest } : {
1219 name : string ;
1320 formName ?: string ;
@@ -16,7 +23,6 @@ const InternalFieldInst = ({ Field, name, formName, ...rest }: {
1623 const form = useFormInstance ( formName ) ;
1724 const [ onFieldBlur , onFieldChange ] = useUnit ( [ form . onBlur , form . onChange ] ) ;
1825
19- const fieldValue = useStoreProp ( form . $values , name ) ;
2026 const error = useStoreProp ( form . $error , name , null ) ;
2127 const errors = useStoreProp ( form . $errors , name , null ) ;
2228
@@ -28,10 +34,7 @@ const InternalFieldInst = ({ Field, name, formName, ...rest }: {
2834 onFieldBlur ( { name, value } ) ;
2935 } , [ name , onFieldBlur ] ) ;
3036
31- const value = useMemo ( ( ) => {
32- const format = form . configs ?. [ name ] ?. format || FIELD_CONFIG . format ! ;
33- return format ( fieldValue ) ;
34- } , [ fieldValue , form . configs , name ] ) ;
37+ const value = useValue ( form , name ) ;
3538
3639 return ( < Field { ...{ error, errors, name, value, onChange, onBlur, ...rest } } /> ) ;
3740} ;
@@ -57,9 +60,15 @@ export const Field = ({
5760} : IRFieldProps ) => {
5861 const form = useFormInstance ( formName ) ;
5962
60- const [ setActive , resetUntouched ] = useUnit ( [ form . setActive , form . resetUntouched ] ) ;
63+ const formDisableFieldsReinit = useStoreProp ( form . $formConfig , 'disableFieldsReinit' ) ;
64+
65+ const [ setActive , resetUntouched , setFieldConfig ] = useUnit ( [
66+ form . setActive ,
67+ form . resetUntouched ,
68+ form . setFieldConfig ,
69+ ] ) ;
6170
62- useEffect ( ( ) => {
71+ useLayoutEffect ( ( ) => {
6372 const config = pickBy (
6473 {
6574 parse,
@@ -72,7 +81,7 @@ export const Field = ({
7281 } ,
7382 ( val ) => val !== undefined ,
7483 ) ;
75- ! passive && form . setFieldConfig ( { name, ...config } ) ;
84+ ! passive && setFieldConfig ( { name, ...config } ) ;
7685 } , [
7786 disableFieldReinit ,
7887 validateOnChange ,
@@ -86,7 +95,7 @@ export const Field = ({
8695 form ,
8796 ] ) ;
8897
89- useEffect ( ( ) => {
98+ useLayoutEffect ( ( ) => {
9099 ! passive && setActive ( { name, value : true } ) ;
91100 return ( ) => {
92101 ! passive && setActive ( { name, value : false } ) ;
@@ -96,9 +105,9 @@ export const Field = ({
96105 const reinitDisabled =
97106 ! passive && disableFieldReinit !== undefined
98107 ? disableFieldReinit
99- : form . config . disableFieldsReinit ;
108+ : formDisableFieldsReinit ;
100109
101- useEffect ( ( ) => {
110+ useLayoutEffect ( ( ) => {
102111 if ( ! reinitDisabled && initialValue !== undefined ) {
103112 Promise . resolve ( ) . then ( ( ) => resetUntouched ( [ name ] ) ) ;
104113 }
0 commit comments