본문 바로가기
Framework/React

useEffect()

by cariño 2022. 9. 29.
728x90
반응형

useEffect()

  • side effect를 수행하기 위한 Hook
  • 리액트의 side effect는 효과, 영향을 말한다.

예를 들면 서버에서 데이터를 받아오거나 수동으로 DOM을 변경하는 작업들을 말한다.
이러한 작업이 effect라 불리는 이유는 다른 컴포넌트에 영향을 미칠 수 있으며, 렌더링 중에는 작업이 완료될 수 없기 때문이다.
즉 렌더링이 끝난 이후에 실행되어야 하는 작업들이다.

이러한 작업이 side로 실행된다는 의미에서 side effect라 불린다.

 

// import logo from './logo.svg';
import './App.css';
import { useEffect, useState } from 'react';

function App() {
  const [count, setCount] = useState(1)
  const [name, setName] = useState('')

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


  // 인자로 이벤트 받아옴
  const handleInputChange = (e) => {
    setName(e.target.value)
  }

  // useEffect는 인자로 콜백함수를 전달받는다.
  // 렌더링 될때마다 매번 실행된다. 
  useEffect(() => {
    console.log('count 렌더링')
  }, [count]) 

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

  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>
  );
}

export default App;

 


 

useEffect 사용해보기

 

//1. useEffect실행 count값이 변화될 때만 렌더링이 실행된다. 
  useEffect(() => {
    console.log('count 렌더링')
  }, [count]) 

 // 2. useEffect실행 name값이 변화됐을 때 실행된다.
  useEffect(() => {
    console.log('name 렌더링')
  }, [name])

 

  • 마운트 + [item] 변경될때만 실행
  • 해당 요소의 업데이트 됐을때만 useEffect가 실행된다.

 

useEffect(이펙트 함수, 의존성 배열)

  • useEffect() 함수만으로 생명주기함수와 동일한 기능을 수행할 수 있다.
  • 의존성 배열은 말 그대로 Effect 의존하고 있는 배열이다.
    배열안에 있는 변수중에 하나라도 값이 변경되면 이펙트 함수가 실행된다.
  • 기본적으로 이펙트 함수는 처음 컴포넌트가 렌더링된 이후와 업데이트 된 re-render 이후에 실행된다.

 

//맨 처음 렌더링 될때만 실행
  useEffect(() => {
    console.log('렌더링')
  }, [])

 

useEffect(이펙트 함수, [])

  • 의존성 배열에 빈배열을 넣게 된다면 이펙트 함수가 mount, unmount시 단 한번씩만 실행된다.
  • 해당 이펙트함수가 state, props 어떤값에도 의존하지 않는것으로 여러번 실행되지 않는다.
// 업데이트 될 때마다 호출
useEffect(이펙트 함수);

 

useEffect(이펙트 함수)

  • 의존성 배열을 생력하면 컴포넌트가 업데이트 될 때마다 호출된다.

 

  • 함수 컴포넌트안에서 실행되기때문에 해당 컴포넌트의 state, props에도 접근할 수 있다.

 


 

useEffect & Clean up - Timer

 

//App.js
import './App.css';
import { useState } from 'react';
import Timer from './Component/Timer';

function App() {

  const [showTimer, setShowTimer] = useState(false)
  return (
    <div>
    	// showTimer가 true일때만 timer실행
      {showTimer && <Timer />}

      <button onClick={() => setShowTimer(!showTimer)}>Toggle Timer</button>
    </div>
  );
}

export default App;

 

<Timer /> -> {showTimer && <Timer />}

  • component에서 useState showTimer가 true일때만 Timer를 보여줄 수 있도록
  • 버튼이 클릭될 때마다 showTimer가 변경된다.

 

//Timer.jsimport React, { useEffect } from 'react'

export default function Timer(props) {

    // 타이머가 맨처음 렌더링 됐을 때 
    //useEffect안에있는 콜백함수가 실행된다.
    //setInterval의 인자로 들어가있는 것을 1초마다 계속해서 실행해줌
    useEffect(() => {
        const timer = setInterval(() => {
            console.log('timer 돌아가는중')
        }, 1000)

        return () => {
            clearInterval(timer)
            console.log('타이머가 종료되었습니다.')
        }
    }, []) //화면 첫렌더링에만 실행이기에 빈배열

    return (
        <div>
            <span>타이머를 시작합니다.
                콘솔을 보세요
            </span>
        </div>
    )
}

 

1) Timer컴포넌트 실행

  • Toggle Timer버튼을 누르면 Timer 컴포넌트가 마운트된다. (첫 렌더링)
  • (Timer.js) useEffect안에 있는 콜백함수가 실행된다. 예문에는 setInterval콜백함수를 추가했고 인자로 들어가있는 console문을 1초에 한번 씩 찍게 해놨다.

 

2) Timer컴포넌트 종료

  • unMount시 console.log가 종료되어야 한다.
  • Timer의 리턴값으로 그 함수안에는 정리되는 내용을 넣어준다.
  • 예시문은 setInterval을 끝내 줄 수 있는 함수로 clearInterval을 넣어주었다.
728x90

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

conditional rendering  (0) 2022.10.11
리액트에서 setState는 비동기로 동작 ??  (1) 2022.10.03
React TodoList 만들기  (0) 2022.10.03
class 컴포넌트에서 function 컴포넌트로  (0) 2022.09.26
React 기초 지식  (0) 2022.09.05

댓글