티스토리 뷰

웹개발(프론트)/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
    링크
    «   2024/11   »
    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
    글 보관함