Skip to content

Commit cd102d3

Browse files
committed
Fix React Strict mode behaviour
1 parent 4c27377 commit cd102d3

File tree

4 files changed

+19
-17
lines changed

4 files changed

+19
-17
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
## 10.0.4
2+
- Fix behaviour for strictMode react when leading is set to true and trailing is true
3+
14
## 10.0.3
25
- Removed `peerDependency` part from `package.json` as NPM cannot correctly resolve `peerDependency` for beta and rc versions: see https://stackoverflow.com/questions/67934358/npm-including-all-range-of-pre-release-when-defining-peer-dependency for context
36

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "use-debounce",
3-
"version": "10.0.3",
3+
"version": "10.0.4-beta",
44
"description": "Debounce hook for react",
55
"source": "src/index.ts",
66
"main": "dist/index.js",

src/useDebounce.ts

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,10 @@
1-
import { useCallback, useRef, useReducer } from 'react';
1+
import { useCallback, useRef, useState } from 'react';
22
import useDebouncedCallback, { DebouncedState } from './useDebouncedCallback';
33

44
function valueEquality<T>(left: T, right: T): boolean {
55
return left === right;
66
}
77

8-
function reducer<T>(_: T, action: T) {
9-
return action;
10-
}
11-
128
export default function useDebounce<T>(
139
value: T,
1410
delay: number,
@@ -21,9 +17,16 @@ export default function useDebounce<T>(
2117
): [T, DebouncedState<(value: T) => void>] {
2218
const eq = (options && options.equalityFn) || valueEquality;
2319

24-
const [state, dispatch] = useReducer(reducer, value);
20+
const activeValue = useRef(value);
21+
const [, forceUpdate] = useState({});
2522
const debounced = useDebouncedCallback(
26-
useCallback((value: T) => dispatch(value), [dispatch]),
23+
useCallback(
24+
(value: T) => {
25+
activeValue.current = value;
26+
forceUpdate({});
27+
},
28+
[forceUpdate]
29+
),
2730
delay,
2831
options
2932
);
@@ -34,9 +37,5 @@ export default function useDebounce<T>(
3437
previousValue.current = value;
3538
}
3639

37-
if (eq(state as T, value)) {
38-
debounced.cancel();
39-
}
40-
41-
return [state as T, debounced];
40+
return [activeValue.current as T, debounced];
4241
}

test/useDebounce.test.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ describe('useDebounce', () => {
6565

6666
// timeout shouldn't have been called yet after leading call was executed
6767
// @ts-ignore
68-
expect(screen.getByRole('test')).toHaveTextContent('Hello again');
68+
expect(screen.getByRole('test')).toHaveTextContent('Hello world');
6969

7070
act(() => {
7171
jest.runAllTimers();
@@ -283,13 +283,13 @@ describe('useDebounce', () => {
283283

284284
const tree = render(<Component text={'Hello'} />);
285285

286-
expect(eq).toHaveBeenCalledTimes(2);
286+
expect(eq).toHaveBeenCalledTimes(1);
287287

288288
act(() => {
289289
tree.rerender(<Component text="Test" />);
290290
});
291291

292-
expect(eq).toHaveBeenCalledTimes(4);
292+
expect(eq).toHaveBeenCalledTimes(2);
293293
expect(eq).toHaveBeenCalledWith('Hello', 'Test');
294294
// Since the equality function always returns true, expect the value to stay the same
295295
// @ts-ignore
@@ -490,7 +490,7 @@ describe('useDebounce', () => {
490490
// @ts-ignore
491491
expect(screen.getByRole('value')).toHaveTextContent('Hello');
492492
// @ts-ignore
493-
expect(screen.getByRole('pending')).toHaveTextContent('false');
493+
expect(screen.getByRole('pending')).toHaveTextContent('true');
494494

495495
act(() => {
496496
jest.runAllTimers();

0 commit comments

Comments
 (0)