Skip to content

Commit 5996935

Browse files
authored
Merge pull request #249 from hugo-vrijswijk/fix-current-set
Fix ref `.current` set by using a proxy
2 parents 9f37f20 + a302cae commit 5996935

File tree

1 file changed

+30
-11
lines changed

1 file changed

+30
-11
lines changed

src/useResizeDetector.ts

+30-11
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useEffect, useState, useRef, useCallback } from 'react';
1+
import { useEffect, useState, useRef, useCallback, useMemo } from 'react';
22
import type { DebouncedFunc } from 'lodash';
33

44
import { patchResizeCallback } from './utils';
@@ -42,18 +42,37 @@ function useResizeDetector<T extends HTMLElement = any>({
4242
}, 0);
4343
}
4444

45-
// this is a callback that will be called every time the ref is changed
45+
// this is a memo that will be called every time the ref is changed
46+
// This proxy will properly call setState either when the ref is called as a function or when `.current` is set
4647
// we call setState inside to trigger rerender
47-
const onRefChange: OnRefChangeType = useCallback(
48-
(node: T | null) => {
49-
if (node !== refElement) {
50-
setRefElement(node);
51-
}
52-
},
48+
49+
const refProxy: OnRefChangeType<T> = useMemo(
50+
() =>
51+
new Proxy(
52+
node => {
53+
if (node !== refElement) {
54+
setRefElement(node);
55+
}
56+
},
57+
{
58+
get(target, prop) {
59+
if (prop === 'current') {
60+
return refElement;
61+
}
62+
return target[prop];
63+
},
64+
set(target, prop, value) {
65+
if (prop === 'current') {
66+
setRefElement(value);
67+
} else {
68+
target[prop] = value;
69+
}
70+
return true;
71+
}
72+
}
73+
),
5374
[refElement]
5475
);
55-
// adding `current` to make it compatible with useRef shape
56-
onRefChange.current = refElement;
5776

5877
const shouldSetSize = useCallback(
5978
(prevSize: ReactResizeDetectorDimensions, nextSize: ReactResizeDetectorDimensions) => {
@@ -124,7 +143,7 @@ function useResizeDetector<T extends HTMLElement = any>({
124143
onResize?.(size.width, size.height);
125144
}, [size]);
126145

127-
return { ref: onRefChange, ...size };
146+
return { ref: refProxy, ...size };
128147
}
129148

130149
export default useResizeDetector;

0 commit comments

Comments
 (0)