티스토리 뷰

웹개발(프론트)/React

useEffect

수달찌 2021. 4. 2. 23:05

 

 

useEffect

useEffect는 컴포넌트가 랜더링 될 때마다 지정 작업을 하게 하는 함수이다.

 

useState가 해당 변수가 변화할 때마다, 컴포넌트가 랜더링 하게 만들었다면,

useEffect는 랜더링 했을때의 행동을 지정할 수 있다.

 

좀 더 대단하게 말하자면

useState가 데이터 유형 state를 대체한다면,

useEffect는 lifecycle대체할 수 있다.

 

life Cycle

목차 react의 hook에 대해 정리할려 했는데, 정리할려하니 life Cycle에 대하여 서술한 뒤 정리하여야 처음보는사람이 이해하기 쉬울 것 같아 먼저 적게되었다. life Cycle 생명주기 라는 뜻으로 코드를

sirong.tistory.com

 

구성

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

export default function App() {
  const [count, setCount] = useState(0);

  useEffect(() => {  
    console.log("U clicked",count);
  });

  return (
    <div>
      <p>U clicked {count}</p>
      <button onClick={() => setCount(count + 1)}>
        Click!
      </button>
    </div>
  );
}

 

결과를 보면서 얘기하자면,

랜더링 했을때의 행동임으로 맨 처음 컴포넌트가 생성될 때도 포함이다.

때문에 콘솔창을보면 초기값인 U clicked 0 도 포함되어있다.

 

 

첫 랜더링만 작동 (componentDidMount)

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

export default function App() {
  const [count, setCount] = useState(0);

  useEffect(() => {  
    console.log("U clicked",count);
  },[]);

  return (
    <div>
      <p>U clicked {count}</p>
      <button onClick={() => setCount(count + 1)}>
        Click!
      </button>
    </div>
  );
}

 

해당 코드를 실행시키면 U clicked 0 한 줄밖에 안 뜬다.

useEffect(() => {
  랜더링 했을시 작동함수
}, [해당객체가 변화하였을때 작동]);

useEffect는 이렇게 구성되어있는데,

  useEffect(() => {  
    console.log("U clicked",count);
  },[]);

 

 

여기서 해당 함수는 console.log("U Clicked", count);

가 되겠고,

변화해야 하는 객체 (트리거)는

지금 [ ]로 비어 있다.

즉, 없다는 뜻이므로, 맨 처음 컴포넌트가 랜더링 될 때만 만들어지는 것이다.

(ComponentDidUpdate)

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

export default function App() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    console.log(count);
  },[count]);

  return (
    <div>
      <p>U clicked {count}</p>
      <button onClick={() => setCount(count + 1)}>
        Click!
      </button>
    </div>
  );
}

해당 코드는 count로 인해 재 랜더링 될 때마다 실행된다.

근데.. 좀 자세하기 보면 문제가 하나 있는데,

count가 변함없는 맨 처음에도 실행된다.

 

만약 맨처음 랜더링은 없애고 싶다면,

다른 곳에선 ref 썼던데 어차피 useState 쓸 거

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

export default function App() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    if(count)
      console.log(count);
    else
      ;
  },[count]);

  return (
    <div>
      <p>U clicked {count}</p>
      <button onClick={() => setCount(count + 1)}>
        Click!
      </button>
    </div>
  );
}

이렇게 쓰면 된다.

'웹개발(프론트) > React' 카테고리의 다른 글

useMemo  (0) 2021.04.04
useReducer  (0) 2021.04.03
Hooks / useState  (0) 2021.04.01
life Cycle  (0) 2021.03.31
styled component  (0) 2021.03.25
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함