useEffect 알아보기

2024. 7. 30. 20:05·Stack/React
반응형

useEffect는 컴포넌트가 3가지 상태일때 동작된다.

  • Mount : 화면에서 생성될때
  • Upadate : 화면에서 업데이트 될때
  • UnMount : 화면에서 사라질때

useEffect는 기본적으로 인자로 callback 함수를 인자로 받는다.

useEffect 의 형태

첫번째, useEffect의 인자로 callback 함수만 받는 경우

useEffect(() => {

		// code.

});

해당경우는 component가 처음 렌더링될때 , 그리고 화면 다시 리렌더링 될 때 실행된다.

두번째, useEffect의 인자로 callback 함수와 배열을 받는 경우 (dependency array)

useEffect(() => {

		// code.

} , [value] );

component가 처음 렌더링될때 , 그리고 dependency array안에 있는 value의 값이 바뀔때 실행된다.

dependency array가 있지만 값이 없는 경우

useEffect(() => {

		// code.

} , [] );

해당 경우는 component가 렌더링 될때 한번만 실행된다.

Clean up의 경우

useEffect(() => {

		// code 작동 

		return () => {
				// clean up 코드 실생
		}

} , [] );

다음과 같이 useEffect 안에 return 을 넣은 경우는 clean up code로 Component가 UnMount 될때 실행된다. (ex : 타이머)

실제 코드로 살펴보기

'use client';

import { ChangeEvent, ChangeEventHandler, useEffect, useState } from 'react';

const useEffect1 = () => {
  const [count, setCount] = useState(1);
  const [name, setName] = useState('');

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

  const handleInputChange = (e: ChangeEvent<HTMLInputElement>) => {
    setName(e.target.value);
  };

  // 렌더링 될때 마다 실행
  // mount + 렌더링 될 때 마다 실행
  useEffect(() => {
    console.log('렌더링 될때 마다 실행');
  });

  // count가 변할때만  실행
  // mount 될 때 , [ value ] 의 값이 변할 때 만 실행
  useEffect(() => {
    console.log('count 변화');
  }, [count]);

  // 처음에 mount 할 때만 실행
  useEffect(() => {
    console.log('mounting 때만 실행');
  }, [count]);

  return (
    <>
      <div>
        <span>count : {count}</span>
      </div>
      <button className="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded" onClick={handleCountUpdate}>
        update
      </button>
      <div>
        <input type="text" value={name} onChange={handleInputChange} />
        <span> name : {name}</span>
      </div>
    </>
  );
};

export default useEffect1;

해당 코드에는 3개의 useEffect가 있는데 각각이 실행될때는 다음과 같다.

  • mount 될때 , rerendering 될 때
  • mount 될때 , count 의 값이 변할 때
  • mount 될때만

Clean Up 사용하는 방법

timer.tsx

'use client';

import { useEffect, useState } from 'react';

const Timer = () => {
  const [time, setTime] = useState(0);

  useEffect(() => {
    const timer = setInterval(() => {
      console.log('타이머 작동중');
      setTime((prev) => prev + 1);
    }, 1000);

		// clean up을 사용한 코드
    return () => {
      clearInterval(timer);
      console.log('타이머 종료');
    };
  }, []);

  return (
    <div>
      <div>{time}</div>
      <span>타이머를 시작합니다</span>
    </div>
  );
};

export default Timer;

page.tsx

'use client';

import Timer from '@/app/components/timer';
import { useState } from 'react';

const CleanUp = () => {
  const [showTimer, setShowTimer] = useState(false);

  const handChangeShowTimer = () => {
    setShowTimer((prev) => !prev);
  };

  return (
    <div>
      {showTimer ? <Timer /> : <div>0</div>}
      <button className="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded" onClick={handChangeShowTimer}>
        Timer Toogle
      </button>
    </div>
  );
};

export default CleanUp;

해당 코드는 button으로 timer를 활성화 시키는 코드이다.

만약 cleanup 코드가 없는경우 화면에 타이머가 없어도 , 내부의 console.log('타이머 작동중') 코드는 계속 작동 되는 일이 생긴다.

return () => {
    clearInterval(timer);
    console.log('타이머 종료');
  };

useEffect의 return으로 컴포넌트가 unmount 될때 올바른 방법으로 처리를 하자

반응형

'Stack > React' 카테고리의 다른 글

useMemo 알아보기  (5) 2024.08.07
custom hook 만드는법 알아보기  (0) 2024.08.04
useRef 알아보기  (2) 2024.08.01
useState 알아보고 정리하기  (1) 2024.07.31
Context API에 대해 알아보자  (1) 2024.05.23
'Stack/React' 카테고리의 다른 글
  • custom hook 만드는법 알아보기
  • useRef 알아보기
  • useState 알아보고 정리하기
  • Context API에 대해 알아보자
WHITE_FROST
WHITE_FROST
개발공부리뷰블로그
    반응형
  • WHITE_FROST
    하얀하얀IT
    WHITE_FROST
  • 전체
    오늘
    어제
    • 분류 전체보기 (119)
      • Stack (43)
        • Next.js (7)
        • React (12)
        • React-Native (15)
        • TypeScript (0)
        • Python (2)
        • JavaScript (2)
        • Android (1)
        • DB (2)
        • JAVA (1)
      • Obsidian (1)
      • AI (3)
      • AI Tools (0)
      • Tools (0)
      • Mac (0)
      • Error (7)
      • 알고리즘 정리 (6)
      • 알고리즘 문제풀이 (46)
      • 공부일상 (4)
      • 개발 도구 & 라이브러리 (0)
      • 정보처리기사 (0)
      • 기타 (6)
      • Tip (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Python
    Expo
    프로그래머스
    reactnative
    알고리즘
    오블완
    코테준비
    SWEA
    코테
    Next.js
    javascript
    boj
    hooks
    리액트네이티브
    React-Native cli
    ReactHook
    d1
    백준
    D2
    error
    ios
    react-native-maps
    react
    mongoDB Atlas
    react-native
    티스토리챌린지
    mongodb cloud
    코딩테스트
    java
    React Hooks
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
WHITE_FROST
useEffect 알아보기
상단으로

티스토리툴바