React/React Study

[React Study] useEffect 넌 뭐다냐 ...?!

요정솜이 2023. 2. 16. 17:21

state가 변경될 때 마다 코드는 계속 실행된다

code again & again & again & again

2pm 열일중

 

 

state가 변화할 때 모든 component / code들이 다시 실행된다 2pm 재소환 ...

➡️ 우리가 변화된 value를 볼 수 있는 이유 ? 모든 code들이 다시 실행되기 때문이다

 

하지만 component 내부의 몇몇 코드는 처음 딱 ! 한번만 실행되고 다시 실행될 필요가 없을 때가 있다

example. API를 호출하거나 어떤 중요한 일을 할 때에는 계속 다시 실행되지 않고 딱 ☝🏻

 

component가 맨 처음 render될 때만 특정 코드의 실행을 제한 할 수 있는 방법 (다시 실행 ❌)

useEffect

컴포넌트가 렌더링 될 때마다 특정 작업을 실행할 수 있도록 하는 React Hook 

코드가 딱 한번만 실행될 수 있도록 보호 !

 

클래스형 컴포넌트에서 사용할 수 있었던 생명주기 메소드를 함수형 컴포넌트에서도 useEffect를 통해 사용할 수 있게 됐다 👍🏻

출처 : https://projects.wojtekmaj.pl/react-lifecycle-methods-diagram/

useEffect 사용법
useEffect(function, deps)
✅ 첫 번째 argument (function) : 우리가 딱 한번 실행 할 코드
✅ 두 번째 argument (deps) : 배열 형태, 배열 안에는 검사하고자 하는 특정 값 or 빈 배열

 

첫 render시 보이는 화면 / 콘솔 창
counter가 변경될 때 보이는 화면 / 콘솔 창

👀 useEffect 안에 함수가 counter가 변경이 되어도 첫 번째 render에만 실행되고 실행되지 않는걸 볼 수 있다

 

첫 render시 보이는 화면 / 콘솔 창
input value 변경 시 보이는 화면 / 콘솔 창
counter가 변경될 때 보이는 화면 / 콘솔 창

🚫 원하는 keyword를 입력하고 나서도 counter 변화시 검색이 계속 되고 있다

state가 변경될 때 마다 모든 코드가 실행 !

 

특정한 부분만이 변화했을 때 원하는 코드를 실행할 수 있는 방법 

 

deps (useEffect의 두 번째 인자)

✅ 빈 배열 [ ] : 코드가 단 한번만 실행 (react가 지켜볼 게 아무것도 없으니까 처음 한번만 실행)
✅ [변화되는 값] : 특정 값이 변화될 때 마다 실행 ➡️ react한테 특정 값을 지켜봐! 라고 명령 👀

 

  • deps에 특정 값을 넣게 된다면 component가 마운트, 업데이트, 언마운트, 업데이트 되기 직전 모두 호출이 된다
  • useEffect 안에 사용하는 state, props가 있다면 deps에 넣어주는 것이 규칙 ⭐️
  • 만약 사용하는 값을 넣어주지 않는다면 useEffect 안의 함수가 실행될 때 최신 state, props를 가리키지 않는다
  • deps 파라미터 생략 시 component가 리렌더링 될 때 마다 useEffect 함수가 호출된다

첫 render시 보이는 화면 / 콘솔 창
input value 변경 시 보이는 화면 / 콘솔 창
counter가 변경될 때 보이는 화면 / 콘솔 창

useEffect(() => {
    console.log("SEARCH FOR", keyword);
  }, [keyword]);

✅ counter가 변화할 때에는 위 코드가 실행되지 ❌ ➡️ keyword가 변화할 때만 실행

요것이 바로 빈 배열을 입력하였을 때 코드가 단 한번만 실행되는 이유

 

하지만 검색창은 아직 완벽하게 동작한다고 볼 수 없다

그 이유는 component가 시작될 때도 검색이 되고 있기 때문이다

아래와 같이 체크 할 조건을 넣어준다면 ?!

keyword의 길이가 5보다 길 때 검색을 하겠다

useEffect(() => {
    if (keyword !== "" && keyword.length > 5) {
      console.log("SEARCH FOR", keyword);
    }
  }, [keyword]);

첫 render시 보이는 화면 / 콘솔 창
counter가 변경될 때 보이는 화면 / 콘솔 창
keyword 글자 수가 5보다 작을 때 보이는 화면 / 콘솔 창
조건에 부합할 시 실행되는 코드 !

// 배열 안에 여러개의 변화되는 값을 적을 수 있다 ! (함수도 작성할 수 있음)
useEffect(() => {
   console.log("I run when keyword & counter changes.");
  }, [keyword, counter]);

 

✏️ 마지막 정리

1. Component가 mount 됐을 때 (처음 나타났을 때)

  • 첫 렌더링 시 한 번만 실행하고 싶을 때는 deps 위치에 빈 배열을 넣는다
  • 배열 생략 시 리렌더링 될 때마다 실행된다
useEffect(() => {
	console.log("mount 될 때만 실행!");
});

2. Component가 update 될 때 (특정 props, state가 바뀔 때)

  • deps = 의존 값이 들어있는 배열
  • 특정 값이 업데이트 될 때 실행하고 싶을 때는 배열 안에 검사하고 싶은 값을 넣어준다
  • 업데이트 될 때에만 실행하는 것이 아니라 마운트 될 때도 실행된다 ➡️ 업데이트 될 때에만 함수를 실행하고 싶다면 조건문을 사용하면 된다
useEffect(() => {
	console.log("name이 update 될 때에 실행");
}, [name]);

// 업데이트 될 때에만 함수를 실행하고 싶을 때!
useEffect(() => {
	if(name !== "") {
		console.log("name이 update 될 때에 실행");
	}
}, [name]);

3. Component가 unmount 될 때 (사라질 때) & update 되기 직전에

  • clean up 함수 반환
  • 언마운트 될 때만 clean up 함수를 실행하고 싶을 때 두 번째 파라미터로 빈 배열을 넣는다
  • 특정 값이 업데이트 되기 직전에 clean up 함수를 실행하고 싶을 때 배열 안에 검사하고 싶은 값을 넣어준다
useEffect(() => {
	console.log(name);
	return () => {
		console.log("clean up");
		console.log(name);
	};
}, []);

 

Bookmark 📚

https://xiubindev.tistory.com/100

 

React Hooks : useEffect() 함수

useEffect 함수는 리액트 컴포넌트가 렌더링 될 때마다 특정 작업을 실행할 수 있도록 하는 Hook 이다. useEffect는 component가 mount 됐을 때, component가 unmount 됐을 때, component가 update 됐을 때, 특정 작업을

xiubindev.tistory.com


오랜만에 2pm 옵화들의 again & again & again & again나 들어야겠다 🎵