ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • useReducer는 언제 쓸까?
    Code Etc/코딩테스트 2023. 2. 15. 02:15
    반응형

    React에서 상태를 관리할 때 useState를 쓴다.

    import React, { useState } from 'react';
    
    function Counter() {
      const [number, setNumber] = useState(0);
    
      const onIncrease = () => {
        setNumber(prevNumber => prevNumber + 1);
      };
    
      const onDecrease = () => {
        setNumber(prevNumber => prevNumber - 1);
      };
    
      return (
        <div>
          <h1>{number}</h1>
          <button onClick={onIncrease}>+1</button>
          <button onClick={onDecrease}>-1</button>
        </div>
      );
    }
    
    export default Counter;

    여기서 counter를 살펴보면

    H1에 state에 있는 number를 표기해주고

    숫자 1을 늘리고 줄일 수 있는 버튼이 있다.

     

    여기서 onIncrease함수와 onDecrease함수를 사용해서

    숫자의 state값을 변경해주고 있는데, 상태 업데이트를 다양하게 하거나 이전에 있는 값을 그대로 가져와

    변화를 줄 경우에 counter 컴포넌트에 작성해야 하는 양이 늘어나게 되고 가독성도 떨어진다.

     

    그리고 비슷한 동작을 하는 다른 컴포넌트가 있을 경우에도 재사용하기가 어렵다.

     

    이를 해결하기 위해 useReducer라는 리액트 훅을 사용하면 좋다.

     

    import React, { useReducer } from 'react';
    
    function reducer(state, action) {
      switch (action.type) {
        case 'INCREMENT':
          return state + 1;
        case 'DECREMENT':
          return state - 1;
        default:
          return state;
      }
    }
    
    function Counter() {
      const [number, dispatch] = useReducer(reducer, 0);
    
      const onIncrease = () => {
        dispatch({ type: 'INCREMENT' });
      };
    
      const onDecrease = () => {
        dispatch({ type: 'DECREMENT' });
      };
    
      return (
        <div>
          <h1>{number}</h1>
          <button onClick={onIncrease}>+1</button>
          <button onClick={onDecrease}>-1</button>
        </div>
      );
    }
    
    export default Counter;

    위 코드는 reducer를 사용한 화면이다

     

    reducer는 사용하고 싶은 곳에 useReducer를 넣어주면 된다.

    useReducer의 매개변수를 살펴보면 실제 reducer동작을 하는 함수가 첫 번째 인자이고, 두번째 인자는 초기값이다.

    reducer함수는 useReducer에 선언된 prev값(코드에서 첫 번째 인자인 state)를 받고 action인자를 전달받는다.

     

    함수를 사용할 때는 dispatch와 함께 reducer함수에서 선언한 type 중 사용할 함수를 object형식으로 할당해주면 된다.

    reducer는 state성질을 가지고 있으므로 setState를 해주지 않아도 useReducer로 선언한 변수의 state가 변화되어

    리액트에서도 render가 일어난다.

     

    리액트에서 유용한 state와 함께  거기서 한 발 더 나아간 Reducer까지 두 가지 모두 적재적소에 사용하면

    큰 도움이 될 것 같다.

     

    반응형

    'Code Etc > 코딩테스트' 카테고리의 다른 글

    카운팅 정렬하기  (0) 2023.03.03
    파이썬으로 백준 문제풀기  (0) 2023.03.02
    연속 부분 수열의 합 구하기  (0) 2023.01.13
    재귀함수란?  (0) 2023.01.11
    최단거리를 구해보자 - 다익스트라 알고리즘  (0) 2023.01.07

    댓글

Designed by Tistory.