React : 스크롤에 반응하는 네브바 만들기 (useScrollDirection)

Maru·2023년 2월 27일
1

스크롤을 내리면 사라졌다가, 올리면 다시 나타나는 네브바를 만들고자 했다.

이를 위해 스크롤 위치를 이전 위치와 비교함으로써 방향을 알아내는 Custom Hook을 만들었다.

useScrollDirection

import { useState, useEffect } from "react";

const useScrollDirection = (initialValue: string) => {
  // 스크롤 방향
  // 네브바 초기 설정에 필요한 initialValue ("up" 또는 "down")
  const [scrollDirection, setScrollDirection] = useState(initialValue);

  useEffect(() => {
    let lastScrollY = window.pageYOffset; // 현재 스크롤 위치
    
    /** 스크롤 방향을 업데이트 하는 함수 */
    const updateScrollDirection = () => {
      const scrollY = window.pageYOffset; // 현재 스크롤 위치
      // 이전 위치랑 비교해 방향 알아내기
      const direction = scrollY > lastScrollY ? "down" : "up"; 
      
      // 스크롤 방향이 바뀐 경우에 setState로 업데이트
      if (direction !== scrollDirection) {
        setScrollDirection(direction);
      }
      
      lastScrollY = scrollY > 0 ? scrollY : 0; // 이전 위치 업뎃
    };
    
    
    // 이벤트 리스너 등록
    window.addEventListener("scroll", updateScrollDirection); 
    
    // 이벤트 리스너 삭제 (clean up)
    return () => {
      window.removeEventListener("scroll", updateScrollDirection); 
    };
    
  }, [scrollDirection]);

  return [scrollDirection, setScrollDirection];
};

export default useScrollDirection;

코드 적용

스크롤 방향의 여부에 따라 className을 다르게 부여함으로써 네브바가 숨었다 나왔다 할 수 있게 만들어줬다.

const [scrollDirection, setScrollDirection] = useScrollDirection("up");


...생략


 <div className={scrollDirection === "up" ? "nav active" : "nav inactive"}>
        
      </div>

이전엔 커스텀 훅의 장점을 잘 몰랐었는데, 직접 써보니 확실히 코드가 간결해지고 재사용도 할 수 있어 너무 좋은 것 같다. 아직 미숙하지만 다양한 커스텀 훅을 만들어 사용하는 연습을 하면 좋을 것 같다.

profile
함께 일하고 싶은 개발자

0개의 댓글