useState( ) + useEffect( ) 사용 예시

선택한 테마(light/dark)를 브라우저에 저장(localStorage)하고, 사이트 전체에 해당 테마를 적용하기 위함

  import { useEffect, useState } from "react";
  

  const [theme, setTheme] = useState(
    localStorage.getItem("theme") ? localStorage.getItem("theme") : "light"
  );
  const element = document.documentElement;
  // 렌더링될 때 실행
  useEffect(() => {
    if (theme === "dark") {
      element.classList.add("dark");
      // 페이지 새로고침해도 테마 기억
      localStorage.setItem("theme", "dark");
      document.body.classList.add("dark");
    } else {
      element.classList.remove("dark");
      localStorage.setItem("theme", "light");
      document.body.classList.remove("dark");
    }
  }, [theme]);

스크롤 시 Navbar 상단에 고정(sticky)시키거나 스타일을 변화시키기 위함

window.scrollY > 0

window.addEventListener("scroll", handleScroll)

Cleanup (return 문)

import { useEffect, useState } from "react";
  
    /*   배열 구조 분해 할당(array destructuring)
  useState()는 배열 반환
  sticky 초기값: false, setSticky 초기값: function
  useState() 시 React가 자동으로 렌더링(바뀐 값 화면에 다시 적용) */
  const [sticky, setSticky] = useState(false);
  /*  useEffect({}, [])
  {함수(콜백): 실행할 코드}, [ 비었음: 한 번만 실행/없음: 렌더링될 때마다 실행/
  n:n값이 바뀔 때마다 실행 => useState(0); 0++ 됨 ] 
  useEffect는 렌더링 후 callback(실행할 *함수)를 받아야 하므로 () => {}, []) 이용
  */
  useEffect(() => {
    const handleScroll = () => {
      // 스크롤 내려가면 true, 아니면 false
      if (window.scrollY > 0) {
        setSticky(true);
      } else setSticky(false);
    };
    // 이벤트 발생(스크롤 감지) 시 handelscroll 실행
    window.addEventListener("scroll", handleScroll);
    // return () => {}: 컴포넌트가 사라질 때 이벤트 직접 제거(cleanup)
    return () => {
      window.removeEventListener("scroll", handleScroll);
    };
  }, []);