1
- import { ChangeEventHandler , useEffect , useState } from 'react' ;
1
+ import { ChangeEventHandler , useState } from 'react' ;
2
2
import isUndefined from 'lodash/isUndefined' ;
3
3
4
4
interface ControlledValueReturnObject < T extends string > {
@@ -15,7 +15,7 @@ interface ControlledValueReturnObject<T extends string> {
15
15
* A setter for the internal value.
16
16
* Does not change the controlled value if the provided value has not changed.
17
17
*/
18
- setInternalValue : React . Dispatch < React . SetStateAction < T > > ;
18
+ setUncontrolledValue : React . Dispatch < React . SetStateAction < T > > ;
19
19
}
20
20
21
21
/**
@@ -30,29 +30,22 @@ export const useControlledValue = <T extends string>(
30
30
) : ControlledValueReturnObject < T > => {
31
31
const isControlled = ! isUndefined ( controlledValue ) ;
32
32
33
- // Keep track of state internally, initializing it to the controlled value
34
- const [ value , setInternalValue ] = useState < T > ( controlledValue ?? ( '' as T ) ) ;
35
-
36
- // If the controlled value changes, update the internal state variable
37
- useEffect ( ( ) => {
38
- if ( ! isUndefined ( controlledValue ) ) {
39
- setInternalValue ( controlledValue ) ;
40
- }
41
- } , [ controlledValue ] ) ;
33
+ // Keep track of the uncontrolled value state internally
34
+ const [ uncontrolledValue , setUncontrolledValue ] = useState < T > ( '' as T ) ;
42
35
43
36
// Create a change event handler that either updates the internal state
44
37
// or fires an external change handler
45
38
const handleChange : ChangeEventHandler < any > = e => {
46
39
changeHandler ?.( e ) ;
47
40
if ( ! isControlled ) {
48
- setInternalValue ( e . target . value as T ) ;
41
+ setUncontrolledValue ( e . target . value as T ) ;
49
42
}
50
43
} ;
51
44
52
45
return {
53
46
isControlled,
54
- value,
47
+ value : isControlled ? controlledValue : uncontrolledValue ,
55
48
handleChange,
56
- setInternalValue ,
49
+ setUncontrolledValue ,
57
50
} ;
58
51
} ;
0 commit comments