노마드코더 hooks 10 강의를 들으며 커스텀 hooks를 만들었다. 훅의 개념을 정리하고, 새로운 문법을 배울 수 있어 좋았다.
리액트 훅 함수이다. useEffect(async () => { // hook 내에서 비동기 실행 안됨
await Promise.resolve(1)
}, [])
ref={reference 이름} 속성을 주어 연결한다.{current: HTMLHeadingElement}의 형식이다. 클린업 함수란?
- useEffect()의 return에 들어가는 함수를 의미한다.
- 작동순서: re-render → 이전의 effect clean-up → 새로운 effect
클린업 실행 시점이 늦는 이유
Clean-up 함수는 이전 값을 바라보기 때문이다.
- 컴포넌트 내의 모든 함수는 렌더가 호출될때 정의된 props와 state 값을 잡아둔다.
- 하지만 effect clean-up은 최신 props를 읽어오지 않는다. 클린업이 정의된 시점의 값을 읽어온다.
handler는window.addEventListener가 호출되는 시점에 고정되기 때문이다.
addEventListener에서 클린업 함수를 써야하는 이유는?
- Eventlistener는 한번 추가된 이벤트(scroll 등)가 변하면 브라우저에 관련 이벤트를 계속 추가한다.
- 브라우저가 호출해야하는 이벤트의 개수(=함수의 개수)를 줄이기 위해 안쓰는 lisntner 제거 목적으로 클린업 함수를 사용한다. (
removeEventListener)- 즉, 메모리 관리에 유용하다.
import { useEffect, useState, useRef } from "react";
const useScroll = () => {
const [state, setState] = useState({
x: 0,
y: 0
});
const onScroll = () => {
console.log(window.scrollY);
// 스크롤 이동하면 스테이트 변경
setState({ y: window.scrollY, x: window.scrollX });
};
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: "1000vh" }}>
<h1 style={{ position: "fixed", color: y > 100 ? "red" : "blue" }}>
{" "}
hi{" "}
</h1>
</div>
);
}