import { useEffect, useState } from "react";
function Component1() {
const [value, setValue] = useState<string>(() => "default");
useEffect(() => {
setValue("changed");
}, []);
return <div>{value || "nothing"}</div>;
}
해당 리액트 컴포넌트가 JSX형식으로 DOM에 부착되는 과정을 파헤쳐봅시다.
컴포넌트 내부 동작을 자바스크립트의 실행 단위별로 나눠볼 수 있습니다.
const [value, setValue] = useState<string>(() => "default");
useEffect(() => {
setValue("changed");
}, []);
return <div>{value || "nothing"}</div>;
"default"
를 기본값으로 하여 하나의 훅 구조체가 만들어집니다. value === "default"
value === "default"
"default"
를 innerHTML로 갖는 HTMLDivElement가 반환됩니다. value === "default"
[default가 화면에 렌더된 이미지]
현재 Macrotask Queue에는 useEffect구문의 첫번째 인자인 callback이 들어있습니다. Mounted 시점의 모든 동기적 동작이 모두 완료되었기 때문에 예약되어 있는 callback이 실행됩니다. callback 내부에 있는 setValue는 다시 Macrotask Queue에 삽입되고 실행됩니다. SetStateAction인 setValue가 실행 되었고 인자가 value와 다르기 때문에 컴포넌트는 리렌더 됩니다.
value === "changed"
() => "default"
는 실행될 필요가 없기때문에 호출되지 않습니다. value === "changed"
[]
와 현재 deps인 []
는 서로 길이가 동일 하고 각 요소를 얕게 비교한 결과가 동일하기 때문에 callback은 실행되지 않습니다. value === "changed"
"changed"
를 innerHTML로 갖는 HTMLDivElement가 반환됩니다. value === "changed"
[changed가 화면에 렌더된 이미지]