Hook flow (훅의 생명주기)

고규식·2021년 12월 11일
0
post-thumbnail

클래스형 컴포넌트의 라이프사이클 함수처럼, 함수형 컴포넌트의 Hook도 flow가 존재한다.

대표적으로 useEffect가 있다.

예시 코드

<!DOCTYPE html>
<html lang="en">
  <body>
    <!-- 바벨 컴파일러 불러오기 -->
    <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
    <div id="root"></div>
    <script type="text/babel">
      const rootElement = document.getElementById("root");
	/* 자식 컴포넌트 */
      const Child = () => {
        /* useState의 lazy initialization */
        const [text, setText] = React.useState(() => {
          console.log("  Child useState");
          return "";
        });
 	/* useEffect no deps */
        React.useEffect(() => {
          console.log("  Child useEffect, no deps");

          return () => {
            console.log("  Child useEffect [Clean up], no deps");
          };
        });
        /* useEffect empty deps */
        React.useEffect(() => {
          console.log("  Child useEffect, empty deps");

          return () => {
            console.log("  Child useEffect [Clean up], empty deps");
          };
        }, []);
        /* useEffect [show] */
        React.useEffect(() => {
          console.log("  Child useEffect, [show]");

          return () => {
            console.log("  Child useEffect [Clean up], [show]");
          };
        }, [text]);
        const handleChange = (event) => {
          setText(event.target.value);
        };
        console.log("  Child render start");
        const element = (
          <>
            <input onChange={handleChange} />
            <p>{text}</p>
          </>
        );
        console.log("  Child render end");
        return element;
      };
      /* 부모 App */
      const App = () => {
        console.log("App render start");
        const [show, setShow] = React.useState(() => {
          console.log("App useState");
          return false;
        });

        React.useEffect(() => {
          console.log("App useEffect, no deps");

          return () => {
            console.log("App useEffect [Clean up], no deps");
          };
        });
        React.useEffect(() => {
          console.log("App useEffect, empty deps");

          return () => {
            console.log("App useEffect [Clean up], empty deps");
          };
        }, []);
        React.useEffect(() => {
          console.log("App useEffect, [show]");

          return () => {
            console.log("App useEffect [Clean up], [show]");
          };
        }, [show]);

        function handleClick() {
          setShow((prev) => !prev);
        }
        console.log("App render end");
        return (
          <>
            <button onClick={handleClick}>Search</button>
            {show ? <Child /> : null}
          </>
        );
      };

      ReactDOM.render(<App />, rootElement);
    </script>
  </body>
</html>

첫 렌더링시 순서

  1. App render start
  2. App useState
  3. App render end
  4. App useEffect, no deps
  5. App useEffect, empty deps
  6. App useEffect, [show]

Search 버튼을 누를시 (child 컴포넌트 생성)

  1. App render start
  2. App render end
  3. Child useState
  4. Child render start
  5. Child render end
  6. App useEffect [Clean up], no deps
  7. App useEffect [Clean up], [show]
  8. Child useEffect, no deps
  9. Child useEffect, empty deps
  10. Child useEffect, [show]
  11. Child useEffect, no deps
  12. Child useEffect, [show]

Search 버튼을 누를시 (child 컴포넌트 사라짐)

  1. App render start
  2. App render end
  3. Child useEffect [Clean up], no deps
  4. Child useEffect [Clean up], empty deps
  5. Child useEffect [Clean up], [show]
  6. App useEffect [Clean up], no deps
  7. App useEffect [Clean up], [show]
  8. App useEffect, no deps
  9. App useEffect, [show]
profile
잠실사는 주니어 개발자

0개의 댓글