@@ -425,31 +425,40 @@ export function useHistoryState(initialPresent = {}) {
425425
426426export 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
455464export function useIdle ( ms = 1000 * 60 ) {
0 commit comments