Skip to content

Instantly share code, notes, and snippets.

@ivanstnsk
Last active May 24, 2020 17:55
Show Gist options
  • Select an option

  • Save ivanstnsk/08339e994662618568b0235d3b517055 to your computer and use it in GitHub Desktop.

Select an option

Save ivanstnsk/08339e994662618568b0235d3b517055 to your computer and use it in GitHub Desktop.
use Mouse Hover hook React in Typescript
import { useCallback, useEffect, useState, useRef } from 'react';
type THook<T extends HTMLElement> = [
React.RefObject<T>,
boolean,
];
export const useMouseHover = <T extends HTMLElement>(): THook<T> => {
const [hovered, setHovered] = useState(false);
const ref = useRef<T>(null);
const handleMouseOver = useCallback(() => {
setHovered(true);
}, [setHovered]);
const handleMouseOut = useCallback(() => {
setHovered(false);
}, [setHovered]);
useEffect(() => {
const node = ref.current;
if (node) {
node.addEventListener('mouseover', handleMouseOver);
node.addEventListener('mouseout', handleMouseOut);
return () => {
node.removeEventListener('mouseover', handleMouseOver);
node.removeEventListener('mouseout', handleMouseOut);
};
}
}, [ref.current]);
return [ref, hovered];
};
// Use example
// const [buttonRef, buttonHovered] = useMouseHover<HTMLButtonElement>();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment