React

[React] component Life Cycle / useEffect를 통한 component Life Cycle 제어

개발새발 2024. 9. 1. 17:04
반응형

Component Life Cycle

리액트 컴포넌트의 라이프사이클은

Mount -> Update -> Unmout로 진행된다.

  • Mount : 컴포넌트가 최초에 렌더링 됨
  • Update : 컴포넌트가 리렌더링 됨
  • Unmount : 컴포넌트가 화면에서 제거 됨

 

 

 

useEffect를 통한 component Life Cycle 제어

useEffect :   두 번째 인수인 [] 배열의 값이 바뀌면, 첫 번째 매개변수의 함수를 호출

예)

  useEffect(() => {
    console.log(`count: ${count} / input ${input}`);
  }, [count, input]); // 의존성 배열, dependency array(deps)

 

 

예) 클릭을 홀수 번 할 때 없어지는 컴포넌트

 

App.jsx

import { useState, useEffect, useRef } from "react";
import "./App.css";
import Even from "./components/Even";

function App() {
  const [count, setCount] = useState(0);
  const isMount = useRef(false);

  // 1. 마운트 : 탄생
  useEffect(() => {
    console.log("App Mount");
  }, []);

  // 2. 업데이트 : 변화, 리렌더링
  useEffect(() => {
    if (!isMount.current) {
      isMount.current = true;
      return;
    }
    console.log("App Update");
    console.log("Update");
  }); // deps 생략하면, 리렌더링 시 매번 실행 됨

  const onClickButton = () => {
    setCount(count + 1); // setState는 비동기로 실행되기 때문에
    console.log(count); // count값이 바로 변하지 않음
  };

  return (
    <div className="App">
      <h1>Simple Counter {count}</h1>
      <button onClick={onClickButton}>클릭</button>
      <section>{count % 2 === 0 ? <Even /> : null}</section>
    </div>
  );
}

export default App;

 

Even.jsx

import { useEffect } from "react";

const Even = () => {
  useEffect(() => {
    console.log("Even Mount");
    return () => {
      // 3. 언마운트 : 제거
      // 클린업, 정리함수
      console.log("Even Unmount");
    };
  }, []);
  return <div>짝수입니다.</div>;
};

export default Even;
반응형