프론트엔드 개발/React.js

리액트에서 마우스가 브라우저 창 밖에 있는지 감지하기

snowman95 2023. 1. 15. 19:51
728x90
반응형

리액트에서 마우스가 브라우저 창 밖에 있는지 감지하고 싶다면

mouseenter, mouseleave 이벤트를 등록하여 hover 상태롤 확인하는 hook을 추가하면 간단하게 감지할 수 있다.

 

참고로 document.body 의 이벤트로 등록하여, html 의 body를 기준으로 마우스가 enter 인지 leave 인지로 판단해야 하는데

이것을 body가 아니라 현재 컴포넌트를 기준으로도 할 수는 있지만,

현재 컴포넌트가 자주 리렌더링이 되는 컴포넌트라면 예상했던 모습과 많이 다르게 동작할 수 있다.

계속 깜빡깜빡 거리는 식으로 동작할 수 있기 때문에, 어차피 창 전체를 기준으로 동작하는 기능이라면 body를 기준으로 하는게 편하다... 

 

// useHoverWindow.ts

import { useEffect, useState } from 'react'

export const useHoverWindow = (): [boolean] => {
    const [isHover, setIsHover] = useState<boolean>(false)

    const handleMouseOver = () => {
        setIsHover(true)
    }
    const handleMouseOut = () => {
        setIsHover(false)
    }

    useEffect(() => {
        document.body.addEventListener('mouseenter', handleMouseOver)
        document.body.addEventListener('mouseleave', handleMouseOut)
        return () => {
            document.body.removeEventListener('mouseenter', handleMouseOver)
            document.body.removeEventListener('mouseleave', handleMouseOut)
        }
    }, [])
    return [isHover]
}

 

사용시

const [isHover] = useHoverWindow()

if(isHover){
  // 마우스가 브라우저 창 안에 있음
}
반응형