본문 바로가기
frontend (React) 개발

(React) useEffect

by 꼰대코더 2023. 11. 20.

useEffect 는 직접적인 타켓 출력을 하지 않는 작업으로서 fetch request, DOM 직접 조작, 타이머 함수등을 실행한다. 
※ 함수 컴포넌트의 body에서는 값의 계산을 하고 이외의 작업( fetch request, DOM 직접 조작, 타이머 함수등)을 정의하지 않는것이 기본이다. 위의 작업을 side-effects 라고 부른다.

 

useEffect(callback[, dependencies]);

  • callback : 실행 함수, DOM 업데이트 후에 실행
  • dependencies : 옵션 의존오브젝트 array. 만약 의존오브젝트가 렌더링 사이에 변화가 있다면  callback 함수가 실행된다.

 

dependencies 가 없는 경우

 useEffect(() => {
    // 렌더링이 될때마다 실행
  });

 

[ ] 만 선언 되어 있는 경우

  useEffect(() => {
    // 맨 처음 렌더링 될 때 한번만 실행
  }, [ ]);

 

dependencies 가 한개인 경우

useEffect(() => {
  // 맨 처음 렌더링 경우 실행
  // name 이 변경되는 경우에만 실행
  document.title = `Greetings to ${name}`;
}, [name]);

 

dependencies 가 배열로 존재하는 경우

  useEffect(() => {
    // 최초 렌더링시 한번 실행
    // 그 다음 prop1, prop2, ..., state1, state2 중 하나라도 변경되는 경우에 실행
  }, [prop1, prop2, ..., state1, state2]);

 

side-effect 의 cleanup (socket 닫기, timer 종료등)

useEffect(function callback() => {
  // (1) Side-effect...

  return function cleanup() {
    // (2) Side-effect cleanup...
  };
}, dependencies);

 

실행 순서.

   맨처음 렌더링시           :  only (1) 만 실행

   dependencies 변경시  : (2) -> (1) 순으로 실행

   마지막 페이지 파기시    : only (2) 만 실행

   ※ cleanup 을 해주지 않으면 기존 callback 함수에서 생성한 접속이 살아 있게 된다.

 

 

 

useEffect 를 이용한 샘플 : 처음 페이지 로딩시 api 로 데이터를 불러들여 name 리스트를 표시

import { useEffect, useState } from 'react';

function FetchEmployees() {
  const [employees, setEmployees] = useState([]);

  useEffect(() => {
    async function fetchEmployees() {
      const response = await fetch('/employees');
      const fetchedEmployees = await response.json();
      setEmployees(fetchedEmployees);
    }

    fetchEmployees();
  }, []);

  return (
    <div>
      {employees.map(name => <div>{name}</div>)}
    </div>
  );
}

 

'frontend (React) 개발' 카테고리의 다른 글

(React) VS Code Extension - React Component Splitter  (0) 2023.11.23
(React) useContext  (0) 2023.11.23
(React) Props  (1) 2023.11.23
(React) useRef  (0) 2023.11.21
(React) useState  (0) 2023.08.11