삐옹

리액트 기초편(1) useEffect [❓] 본문

React

리액트 기초편(1) useEffect [❓]

삐옹 2022. 5. 26. 17:01
주의

이 글을 함수형 컴포넌트 + react hook API를 기반으로 작성했습니다.

 

HOOK

class형 컴포넌트로 작성하지 않고 state와 다른 react기능들을 사용할 수 있게 해주는 기능.

 

State

: 상태값이 저장된 변수

useState

: state 변수와 state 변수를 변경하는 함수를 반환

 

Side effect(effect)

: 화면이 렌더링 된 이후에 처리되어야 하는 부수적인 것들. 예) API 호출

: 요청 즉시 1차 렌더링 함으로써 UX 측면에서 좋다

 

종류 

정리가 필요한 것

정리가 필요하지  않은 것(network request, DOM 수동조작, 로깅 등)

 

useEffect 

useEffect의 기본 형태입니다.

useEffect(() => {
	// 여기에 렌더링 이후 실행할 effect(함수)를 적습니다
    
    return () => {
    	// 여기에 unmount나 unsubscribe 코드를 적습니다
    }
}, [props명, state명, ...]) // 의존성 배열(dependencies array) = deps
  • deps : 변경을 감지할 데이터, 혹은 빈배열을 넣습니다.

하는 일?

: 컴포넌트를 렌더링 할 때 우리가 넘긴 함수(‘effect’라고 부릅니다)를 기억했다가, 렌더링이 일어난 후에 어떤 일을 해야하는지 말합니다.

다시 말해 DOM이 업데이트를 수행한 이후에 함수를 불러냅니다. 렌더링 후 effect 호출 (+clean up + deps) 

 

컴포넌트 안에서 쓰는 이유는 뭔가요?

: 컴포넌트 안에 둠으로써 state 값에 함수(effect)가 접근 할 수 있습니다. 최신 state값을 바로 얻을 수 있습니다. 

함수(컴포넌트가 함수형으로 만들어져있으니 당연한 말입니다) 안에 있기 때문에 자바스크립트(혹은 브라우저)가 가지고 있는 API를 사용할 수 있습니다.

 

렌더링 이후 매번 실행이 되나요?

: 기본적으로 첫 번째 렌더링과 이후의 모든 업데이트에서 실행됩니다. react는 effect가 수행되는 시점은 이미 DOM이 업데이트되었음을 보장합니다.

 

 

1. 처음 렌더링 됬을 때

state값이 변경되거나 어떤 식으로든 re-rendering이 일어날 때마다 실행됩니다.

useEffect(()=> {
	console.log("나타났을때만 호출")
},)

만약 처음 렌더링되고 딱 한 번만 실행시키고 싶다면 deps 위치에 빈배열을 넣습니다.

useEffect(()=> {
	console.log("나타났을때만 호출")
},[])

2. 컴포넌트가 re-rendering 될 때(<= 특정 state, props가 바뀔 때)

useEffect(()=> {
	console.log("나타났을때만 호출")
},[props(바뀌는값)])

3. 컴포넌트가 DOM에서 제거될 때

useEffect(()=> {
	console.log("나타났을때만 호출")
    return console.log("클린업 함수")
},)

 

4. 렌더링 이후 effect 실행 + cleanup 코드예시

import React, { useState, useEffect } from 'react';

function FriendStatus(props) {
  const [isOnline, setIsOnline] = useState(null);

  useEffect(() => {
    function handleStatusChange(status) {
      setIsOnline(status.isOnline);
    }
    ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
    // effect 이후에 어떻게 정리(clean-up)할 것인지 표시합니다.
    return function cleanup() {
      ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
    };
  });

  if (isOnline === null) {
    return 'Loading...';
  }
  return isOnline ? 'Online' : 'Offline';
}

Clean-up

effect 정리가 필요한 경우 return 안에 정리를 위한 함수를 넣어서 반환할 있다. 정리가 필요 없을 아무것도 반환하지 않습니다.

 


요약

  • useeffect = side effect (+clean up) 
  • effect에 정리가 필요한 경우 return 안에 정리를 위한 함수를 넣어서 반환할 수 있다. 정리가 필요 없을 땐 아무것도 반환하지 않습니다.

참고

React Hook 공식문서

https://ko.reactjs.org/docs/hooks-effect.html

 

Using the Effect Hook – React

A JavaScript library for building user interfaces

ko.reactjs.org

 

side effect

https://velog.io/@yes3427/React-Side-Effect

 

[React] Side Effect란?

React 컴포넌트가 화면에 렌더링된 이후에 비동기로 처리되어야 하는 부수적인 효과들을 Side Effect라고 한다. 대표적인 예로어떤 데이터를 가져오기 위해서 외부 API를 호출하는 경우,일단 화면에

velog.io

 

use effect

https://velog.io/@jmean12/useEffect%EB%9E%80

 

useEffect란

useEffect를 알기위해선 side Effect를 알아야한다.React 컴포넌트가 화면에 렌더링된 이후에 비동기로 처리되어야 하는 부수적인 효과들을 흔히 Side Effect라고 일컽는다. 대표적인 예로 어떤 데이터를

velog.io

state와 re-rendering

https://velog.io/@kimyoungyin/React-%EA%B8%B0%EC%B4%88%EC%97%90%EC%84%9C-%EB%B2%97%EC%96%B4%EB%82%98%EA%B8%B0-State%EC%99%80-re-rendering%EC%97%90-%EB%8C%80%ED%95%B4

 

[React] 기초에서 벗어나기 : State와 re-rendering에 대해

state와 re-rendering의 관계에 대해서 좀 더 깊이 알아보자!

velog.io