Skip to content

Commit 71c6c58

Browse files
committed
Update useHover implementation
1 parent 0d2e15e commit 71c6c58

File tree

1 file changed

+28
-19
lines changed

1 file changed

+28
-19
lines changed

index.js

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -425,31 +425,40 @@ export function useHistoryState(initialPresent = {}) {
425425

426426
export function useHover() {
427427
const [hovering, setHovering] = React.useState(false);
428-
const ref = React.useRef(null);
429-
430-
React.useEffect(() => {
431-
const node = ref.current;
428+
const previousNode = React.useRef(null);
432429

433-
if (!node) return;
430+
const handleMouseEnter = React.useCallback(() => {
431+
setHovering(true);
432+
}, []);
434433

435-
const handleMouseEnter = () => {
436-
setHovering(true);
437-
};
434+
const handleMouseLeave = React.useCallback(() => {
435+
setHovering(false);
436+
}, []);
438437

439-
const handleMouseLeave = () => {
440-
setHovering(false);
441-
};
438+
const customRef = React.useCallback(
439+
(node) => {
440+
if (previousNode.current instanceof HTMLElement) {
441+
previousNode.current.removeEventListener(
442+
"mouseenter",
443+
handleMouseEnter
444+
);
445+
previousNode.current.removeEventListener(
446+
"mouseleave",
447+
handleMouseLeave
448+
);
449+
}
442450

443-
node.addEventListener("mouseenter", handleMouseEnter);
444-
node.addEventListener("mouseleave", handleMouseLeave);
451+
if (node instanceof HTMLElement) {
452+
node.addEventListener("mouseenter", handleMouseEnter);
453+
node.addEventListener("mouseleave", handleMouseLeave);
454+
}
445455

446-
return () => {
447-
node.removeEventListener("mouseenter", handleMouseEnter);
448-
node.removeEventListener("mouseleave", handleMouseLeave);
449-
};
450-
}, []);
456+
previousNode.current = node;
457+
},
458+
[handleMouseEnter, handleMouseLeave]
459+
);
451460

452-
return [ref, hovering];
461+
return [customRef, hovering];
453462
}
454463

455464
export function useIdle(ms = 1000 * 60) {

0 commit comments

Comments
 (0)