Skip to content

Commit a2d9088

Browse files
authored
fix: useMergedState not reset when value back to undefined (#102)
1 parent b1c0f9f commit a2d9088

File tree

2 files changed

+32
-0
lines changed

2 files changed

+32
-0
lines changed

src/hooks/useMergedState.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,12 @@ export default function useControlledState<T, R = T>(
3636
}
3737
}
3838

39+
// Effect of reset value to `undefined`
40+
React.useEffect(() => {
41+
if (value === undefined) {
42+
setInnerValue(value);
43+
}
44+
}, [value]);
45+
3946
return [(mergedValue as unknown) as R, triggerChange];
4047
}

tests/hooks.test.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import * as React from 'react';
22
import { mount } from 'enzyme';
33
import useMemo from '../src/hooks/useMemo';
4+
import useMergedState from '../src/hooks/useMergedState';
45

56
describe('hooks', () => {
67
it('useMemo', () => {
@@ -25,4 +26,28 @@ describe('hooks', () => {
2526
wrapper.setProps({ data: 'repeat', open: true });
2627
expect(wrapper.find('div').props().memoData).toEqual('repeat');
2728
});
29+
30+
describe('useMergedState', () => {
31+
const FC = ({ value }) => {
32+
const [val, setVal] = useMergedState(null, { value });
33+
return (
34+
<input
35+
value={val}
36+
onChange={e => {
37+
setVal(e.target.value);
38+
}}
39+
/>
40+
);
41+
};
42+
43+
it('still control of to undefined', () => {
44+
const wrapper = mount(<FC value="test" />);
45+
46+
expect(wrapper.find('input').props().value).toEqual('test');
47+
48+
wrapper.setProps({ value: undefined });
49+
wrapper.update();
50+
expect(wrapper.find('input').props().value).toEqual(undefined);
51+
});
52+
});
2853
});

0 commit comments

Comments
 (0)