From 96dab55c8f36df144a22391102a667ed2709f3f4 Mon Sep 17 00:00:00 2001 From: Xinghua Hong Date: Thu, 24 Dec 2020 15:17:15 +0800 Subject: [PATCH] fix: function type of param with useDebounce return a wrong value Issue #94 --- src/useDebounce.ts | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/useDebounce.ts b/src/useDebounce.ts index 5954f8f..a38cb18 100644 --- a/src/useDebounce.ts +++ b/src/useDebounce.ts @@ -1,10 +1,20 @@ -import { useCallback, useEffect, useRef, useState } from 'react'; +import { useCallback, useEffect, useRef, useState, Dispatch } from 'react'; import useDebouncedCallback, { ControlFunctions } from './useDebouncedCallback'; function valueEquality(left: T, right: T): boolean { return left === right; } +function adjustFunctionValueOfSetState(value: T): T | (() => T) { + return typeof value === 'function' ? () => value : value; +} + +function useStateIgnoreCallback(initialState: T): [T, Dispatch] { + const [state, setState] = useState(adjustFunctionValueOfSetState(initialState)); + const setStateIgnoreCallback = useCallback((value: T) => setState(adjustFunctionValueOfSetState(value)), []); + return [state, setStateIgnoreCallback]; +} + export default function useDebounce( value: T, delay: number, @@ -12,8 +22,8 @@ export default function useDebounce( ): [T, ControlFunctions] { const eq = (options && options.equalityFn) || valueEquality; - const [state, dispatch] = useState(value); - const debounced = useDebouncedCallback(useCallback((value: T) => dispatch(value), []), delay, options); + const [state, dispatch] = useStateIgnoreCallback(value); + const debounced = useDebouncedCallback(useCallback((value: T) => dispatch(value), [dispatch]), delay, options); const previousValue = useRef(value); useEffect(() => {