728x90
728x90
마우스 호버 효과를 적용하기 위한 커스텀 훅 만들기 (useHover.js)
들어가며
- 요소 위에 마우스 커서를 호버 시, 효과가 작동할 수 있도록 커스텀 훅을 만들어보자.
방법
기존의 방법
- 커스텀 훅을 사용하지 않을 경우,
mouseover
,mouseout
에 대한 각각의 이벤트 핸들러 함수를 만들어서 마우스 호버 효과를 적용시키고 싶은 대상에 연결해 주는 방식으로 구현할 수 있었다.
import React, { useState } from react; const MyComponent = () => { const [isHovered, setIsHovered] = useState(false); const handleMouseOver = () => { setShowPopup(true); }; const handleMouseOut = () => { setShowPopup(false); }; return ( <div onMouseOver={handleMouseOver} onMouseOut={handleMouseOut}> {isHovered ? 'Hovered!' : 'Not hovered'} </div> ); } export default MyComponent;
커스텀 훅 (useHover.js
)
- 커스텀 훅을 만들어서 일일히 이벤트 핸들러 함수를 만들어서 연결해줄 필요 없이 요소에 호버 효과를 적용시킬 수 있다.
import { useCallback, useEffect, useState, useRef } from 'react'; const useHover = () => { const [isHovered, setIsHovered] = useState(false); const ref = useRef(null); const handleMouseOver = useCallback(() => setIsHovered(true), []); const handleMouseOut = useCallback(() => setIsHovered(false), []); useEffect(() => { const element = ref.current; if (!element) return; element.addEventListener('mouseover', handleMouseOver); element.addEventListener('mouseout', handleMouseOut); return () => { element.removeEventListener('mouseover', handleMouseOver); element.removeEventListener('mouseout', handleMouseOut); }; }, [handleMouseOver, handleMouseOut]); return [ref, isHovered]; }; export default useHover;
사용 방법
const [hoverRef, isHovered = useHover()
코드를 작성한다.mouseover
속성과mouseout
속성을 적용시키고 싶은 요소에ref
속성을 주어,hoverRef
를 넘겨준다.- 이제 이 요소 위에 마우스 커서를 올릴 경우,
isHovered
상태가 업데이트 된다.
- 이제 이 요소 위에 마우스 커서를 올릴 경우,
import React from 'react'; import useHover from './useHover'; // useHover.js 파일 경로에 맞게 수정 const MyComponent = () => { const [hoverRef, isHovered] = useHover(); return ( <div ref={hoverRef}> {isHovered ? 'Hovered!' : 'Not hovered'} </div> ); }; export default MyComponent;
적용 예
- 이제 다음과 같이 커스텀 훅을 불러와서 간단한 코드만을 삽입함으로써 마우스 호버 효과를 줄 수 있다.
import React from 'react'; import { observer } from 'mobx-react'; import * as S from '../playList/PlayListPage.style'; import Image from '../../../components/image/Image'; import ContentsPopUp from '../../../components/contentsPopUp/ContentsPopUp'; import useHover from '../../../hooks/useHover'; const Contents = observer(({ contents }) => { const { uuid, title, tags, thumbnailPath, id } = contents; const [hoverRef, isHovered] = useHover(); console.log(uuid, tags, id); return ( <S.ContentsBox className={'active'} ref={hoverRef} showPopUp={isHovered}> <Image alt={title} custom={S.Thumbnail} srcArray={[thumbnailPath]} /> {isHovered && <ContentsPopUp contents={contents} showPopup={isHovered} />} </S.ContentsBox> ); }); export default Contents;

728x90
728x90
'Programming > React' 카테고리의 다른 글
[React.js] useImperativeHandle과 forwardRef (0) | 2024.05.21 |
---|---|
[React.js] 부모 컴포넌트에서 자식 컴포넌트로 요소 넘기는 방법 (0) | 2024.05.14 |
[React.js] 실시간으로 특정 요소의 길이값 가져오기 (0) | 2024.03.26 |
[React.js] state와 ref 비교하기 (0) | 2024.03.02 |
[React.js] Node.js 설치부터 리액트 프로젝트 테스트까지 정리 (0) | 2024.02.05 |
[React.js] 클래스 컴포넌트(Class Components)와 함수형 컴포넌트(Functional Components) (0) | 2023.12.14 |
[React.js] 훅(Hook) (0) | 2023.12.13 |
[React.js] React Developer Tools (0) | 2023.12.13 |