컴포넌트의 호버 여부를 리액트 state와 연결하기 위해 만든 훅이다.
'use client'
import { RefObject, useEffect, useRef, useState } from 'react'
export const useHover = <T extends HTMLElement>(): [RefObject<T>, boolean] => {
const [isHover, setIsHover] = useState<boolean>(false)
const ref = useRef<T>(null)
const handleMouseOver = () => {
setIsHover(true)
}
const handleMouseOut = () => {
setIsHover(false)
}
useEffect(() => {
const element = ref.current
element?.addEventListener('mouseover', handleMouseOver)
element?.addEventListener('mouseout', handleMouseOut)
return () => {
element?.removeEventListener('mouseover', handleMouseOver)
element?.removeEventListener('mouseout', handleMouseOut)
}
}, [])
return [ref, isHover]
}
아래와 같이, 제네릭과 함께 사용하면 된다.
// ...
const [uploadButtonRef, isHoveringUploadButton] = useHover<HTMLButtonElement>()
// ...
'개발 일지' 카테고리의 다른 글
연구) server action 함수를 자식 client-side 컴포넌트로 전달 (1) | 2024.07.14 |
---|---|
util) fetcher (fetch 래퍼) (0) | 2024.07.10 |
React, Typescript) Debounce-Input 컴포넌트 구현 (0) | 2024.06.27 |
gitlab) runner has never contacted this instance (1) | 2024.05.27 |
VSCode에서 소스 코드 저장 시 eslint + prettier가 동작하지 않는 경우 (0) | 2024.04.07 |