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 |