본문 바로가기

React/이론공부

[React Hooks] useEffect

useEffect 란?

- 어떠한 컴포넌트가 Mount (화면에 첫 렌더링) , Update (다시 렌더링), Unmount (화면에서 사라질 때) 에 어떤 특정 작업을 처리할 코드를 실행할 때 사용하는 hook 

 

useEffect 기본 구문

 

1. 인자로 콜백함수만 받는 경우

useEffect(() => { 작업 }}
렌더링이 될 때 마다 실행이 됨

 

2. 첫번째 인자로 콜백함수를 받고 , 두번째 인자로 배열 (dependency array)을 받는 경우

useEffect(() => {
	작업  
}, [value])
화면에 첫 렌더링이 될 때 실행됨, value 의 값이 변경될 때 실행됨
만약 빈 배열을 줄 경우, 화면이 처음 렌더링 될 때만 실행됨

 

useEffect 기초 예제

 

1. 계속 렌더링 될 경우

function App() {
  const [count, setCount] = useState(1);

  const handleCountUpdate = () => {
    setCount(count + 1)
  }

  useEffect(() => {
    console.log("렌더링")
  })

  return (
    <div className="App">
      <button onClick={handleCountUpdate}>Update</button>
      <span>
        count : {count}
      </span>
    </div>
  );
}

 

2. 특정 요소가 변화할때만 useEffect 를 실행 할 경우

두 번째 인자로 배열을 주면 되는데, 변화 될 값을 넣어주도록 한다.
function App() {
  const [count, setCount] = useState(1);
  const [name, setName] = useState("")

  const handleCountUpdate = () => {
    setCount(count + 1)
  }

  const handleInputChange = (e) => {
    setName(e.target.value)
  }

  useEffect(() => {
    console.log("렌더링")
  }, [count])

  return (
    <div className="App">
      <button onClick={handleCountUpdate}>Update</button>
      <span>
        count : {count}
      </span>
      <input type="text" value={name} onChange={handleInputChange} />
      <span>name : {name}</span>
    </div>
  );
}

 

3. 마운팅 될 때만 useEffect 실행 할 경우

두 번째 인자로 빈 배열을 주면, 마운팅 (첫 렌더링)할 때만 실행된다.
function App() {
  const [count, setCount] = useState(1);
  const [name, setName] = useState("")

  const handleCountUpdate = () => {
    setCount(count + 1)
  }

  const handleInputChange = (e) => {
    setName(e.target.value)
  }

  useEffect(() => {
    console.log("마운팅")
  }, [])

  return (
    <div className="App">
      <button onClick={handleCountUpdate}>Update</button>
      <span>
        count : {count}
      </span>
      <input type="text" value={name} onChange={handleInputChange} />
      <span>name : {name}</span>
    </div>
  );
}

 

 

Clean up 함수란?

1. useEffect 안에서 return 할 때 실행 된다. (useEffect 의 뒷정리를 해주는 함수)

2. 컴포넌트가 마운트 될 때 이벤트 리스너를 통해 이벤트를 추가했다면 컴포넌트가 언마운트 될 때 이벤트를 삭제해주어야 한다.

그렇지 않으면 컴포넌트가 리렌더링 될 때마다 새로운 이벤트 리스너가 핸들러에 바인딩 될 것이다.
=> 이는 자주 리렌더링 될 경우에 메모리 누수가 발생함

 

Clean up 사용 예제

 

1. Timer 컴포넌트 생성

컴포넌트가 사라질 때 이벤트를 삭제해주기 위해서 컴포넌트를 만드는 것임.
import React, { useEffect } from "react";

function Timer({ props }) {
  useEffect(() => {
    const timer = setInterval(() => {
      console.log("타이머 돌아가는중 ...");
    }, 1000);

    return () => {
      clearInterval(timer);
      console.log("타이머가 종료되었습니다.");
    };
  }, []);
  return (
    <div>
      <span>타이머를 시작합니다. 콘솔을 보세요!</span>
    </div>
  );
}

export default Timer;
1. Timer 컴포넌트가 첫 렌더링 되었을 때, 1초에 한번씩 콘솔로그에 "타이머 돌아가는 중..." 이 나옴.
2. Timer 컴포넌트가 화면에서 사라질 때 (즉, 언마운트 되었을 때) timer 의 setInterval 함수가 종료될 수 있도록 return으로 이벤트를 삭제해준다. (clearInterval)

 

2. App.js 에서의 작업

토글을 해서, 컴포넌트가 마운트했다가 언마운트될 수 있도록 해준다.
function App() {
  const [showTimer, setShowTimer] = useState(false)

  return (
    <div className="App">
      {showTimer && <Timer />}
      <button onClick={() => setShowTimer(!showTimer)}>Toggle Timer</button>
    </div>
  );
}

 

 

mount 작업과 unmount 작업

 

1. Mount 시에 하는 작업들

- props 로 받은 값을 컴포넌트의 로컬 상태로 설정
- 외부 API 요청 (REST API 등)
- 라이브러리 사용 (D3, Video.js 등)
- setInterval 을 통한 반복작업 혹은 setTimeout 을 통한 작업 예약

 

2. UnMount 시에 하는 작업들

- setInterval , setTimeout 을 사용하여 등록한 작업들 clear 하기 (clearInterval , clearTimeout)
- 라이브러리 인스턴스 제거

 

'React > 이론공부' 카테고리의 다른 글

[React Hooks] useContext & Context  (0) 2023.01.24
[React Hooks] useRef  (0) 2023.01.24
[React Hooks] useState  (0) 2023.01.20
리액트 개발 환경 설치하기  (0) 2023.01.16
React (리액트)에 대해서  (0) 2023.01.16