기록하는 개발자

[React] React Hook-2.5 useEffect를 활용한 useScroll 본문

Web/React

[React] React Hook-2.5 useEffect를 활용한 useScroll

밍맹030 2021. 10. 3. 15:16
728x90

< 초기 화면 >

< 스크롤 바가 500을 초과하면 font color 변경>

 

 

< App.js >

import React, { useRef, useEffect, useState } from "react";
import ReactDOM from "react-dom";

const useScroll = () => {
  const [state, setState] = useState({
    x: 0,
    y: 0
  });
  const onScroll = () => {
    setState({ x: window.scrollX, y: window.scrollY });
  };
  useEffect(() => {
    window.addEventListener("scroll", onScroll);
    return () => window.removeEventListener("scroll", onScroll);
  }, []);
  return state;
};
export default function App() {
  const { y } = useScroll();
  return (
    <div className="App" style={{ height: "500vh" }}>
      <h1 style={{ position: "fixed", color: y > 500 ? "red" : "blue" }}>Hi</h1>
    </div>
  );
}

 

< useScroll() >

const useScroll = () => {
  const [state, setState] = useState({
    x: 0,
    y: 0
  });
  const onScroll = () => {
    setState({ x: window.scrollX, y: window.scrollY });
  };
  useEffect(() => {
    window.addEventListener("scroll", onScroll);
    return () => window.removeEventListener("scroll", onScroll);
  }, []);
  return state;
};

 

1.

const useScroll = () => {
  const [state, setState] = useState({
    x: 0,
    y: 0
  });

- useState를 x : 0, y : 0 으로 초기화한다.  state가 { x:0, y:0} 으로 초기화된다.

 

2.

  const onScroll = () => {
    setState({ x: window.scrollX, y: window.scrollY });
  };

- onScroll 함수 : 현재 윈도우 스크롤 바의 x, y좌표로 state를 수정한다.

 

3.

  useEffect(() => {
    window.addEventListener("scroll", onScroll);
    return () => window.removeEventListener("scroll", onScroll);
  }, []);
  return state;
};

- useEffect 함수 : window에 onScroll event listener를 추가하고 해당 event에 대한 remove event listener를 return 한다.

- useScroll 함수는 state( {x : ?, y : ?} )를 반환한다.

 

< App() >

export default function App() {
  const { y } = useScroll();
  return (
    <div className="App" style={{ height: "500vh" }}>
      <h1 style={{ position: "fixed", color: y > 500 ? "red" : "blue" }}>Hi</h1>
    </div>
  );
}

- useScroll의 return 값에서 y값을 가져온다.

- y값이 500을 초과하면 color가 red로 변경된다.

728x90