diff --git a/package.json b/package.json index 73cd97bc..36f356ef 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ }, "dependencies": { "@babel/runtime": "^7.18.3", + "lodash.isnil": "^4.0.0", "react-is": "^18.2.0" }, "devDependencies": { diff --git a/src/hooks/useMergedState.ts b/src/hooks/useMergedState.ts index 1e846b54..b555e5f5 100644 --- a/src/hooks/useMergedState.ts +++ b/src/hooks/useMergedState.ts @@ -1,15 +1,15 @@ import useEvent from './useEvent'; import { useLayoutUpdateEffect } from './useLayoutEffect'; import useState from './useState'; - +import isNil from 'lodash.isnil'; type Updater = ( updater: T | ((origin: T) => T), ignoreDestroy?: boolean, ) => void; -/** We only think `undefined` is empty */ +/** We think `undefined` and `null` is empty */ function hasValue(value: any) { - return value !== undefined; + return !isNil(value); } /** diff --git a/tests/hooks.test.js b/tests/hooks.test.js index 3b19f7ab..6f6ea1db 100644 --- a/tests/hooks.test.js +++ b/tests/hooks.test.js @@ -74,6 +74,17 @@ describe('hooks', () => { expect(container.querySelector('.txt').textContent).toEqual(''); }); + it('control of to null', () => { + const { container, rerender } = render(); + + expect(container.querySelector('input').value).toEqual('test'); + expect(container.querySelector('.txt').textContent).toEqual('test'); + + rerender(); + expect(container.querySelector('input').value).toEqual('test'); + expect(container.querySelector('.txt').textContent).toEqual(''); + }); + describe('correct defaultValue', () => { it('raw', () => { const { container } = render();