본문 바로가기
개발

(React)카운터 Redux로 만들기 - 6

by 싼쵸 2022. 6. 24.
반응형

가장 기본 예제인 카운터를 redux를 이용해 만들어 볼 거다
항상 리덕스를 사용할 줄 모르는 것에 부끄러움이 가득했는데 이번 기회에 타파할 예정이다.
참고 유데미 강의React 완벽 가이드 with Redux, Next.js, TypeScript

이번강의에서는 Redux에서 ReduxToolkit를 활용해 코드를 리팩토링 할 예정이다.

ReduxToolkit은 리덕스의 몇가지 특징을 단순환 시킨 라이브러리라고 생각하면 편하다.

 

기존 index.js

import { legacy_createStore } from 'redux';

const initialState = { counter: 0, counterShow: true };
const counterReducer = (state = initialState, action) => {
  if (action.type === 'increment') {
    return {
      ...state,
      counter: state.counter + 1,
    };
  }
  if (action.type === 'increase') {
    return {
      ...state,
      counter: state.counter + action.payload,
    };
  }

  if (action.type === 'decrement') {
    return {
      ...state,
      counter: state.counter - 1,
    };
  }
  if (action.type === 'showSwitch') {
    return {
      ...state,
      counterShow: !state.counterShow,
    };
  }
  return state;
};
const store = legacy_createStore(counterReducer);

export default store;

변경 후 index.js

import { createSlice, configureStore } from '@reduxjs/toolkit';

const initialState = { counter: 0, counterShow: true };

const counterSlice = createSlice({
  name: 'counter',
  initialState,
  reducers: {
    // 어떤 액션을 하냐에따라 자동으로 메서드가 실행된다.
    //자동으로 기존상태를 안바꾸고 자동으로 새로운 객체를 생성해준다.
    increment(state) {
      state.counter++;
    },
    decrement(state) {
      state.counter--;
    },
    increase(state, action) {
      //action을 매개변수로 활용
      state.counter = state.counter + action.payload;
    },
    toggleCounter(state) {
      state.counterShow = !state.counterShow;
    },
  },
});

const store = configureStore({
  reducer: counterSlice.reducer,
});
//action를 보내는 것
export const counterActions = counterSlice.actions;
export default store;

변경 후 Counter.js

import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { counterActions } from '../store';
const Counter = () => {
  const dispatch = useDispatch();
  const counter = useSelector((state) => state.counter);
  const toggle = useSelector((state) => state.counterShow);

  console.log('toggle', toggle);
  const incrementHandler = () => {
    dispatch(counterActions.increment());
  };

  const increaseHandler = () => {
    dispatch(counterActions.increase(10)); //{type : 유니크 식별자, payload: 10}
  };
  const decrementHandler = () => {
    dispatch(counterActions.decrement());
  };
  const toggleCounterHandler = () => {
    dispatch(counterActions.toggleCounter());
  };
  return (
    <>
      <h1>Redux Counter</h1>
      {toggle && <div>{counter}</div>}

      <button onClick={incrementHandler}>increment</button>
      <button onClick={increaseHandler}>increase by 5</button>
      <button onClick={decrementHandler}>decrement</button>

      <button onClick={toggleCounterHandler}>Toggle Counter</button>
    </>
  );
};

export default Counter;

counterActions를 import해서 생성된 메서드를 이용했다.

훨씬 코드도 간결해지고 유지보수가 쉬워졌다는 생각이든다.

반응형

'개발' 카테고리의 다른 글

[React] 뽀모도로 개발 일기 - 1  (9) 2023.03.09
웹 폰트 최적화하기  (3) 2023.03.06
(React)카운터 Redux로 만들기 - 5  (0) 2022.06.24
(React)카운터 Redux로 만들기 - 4  (0) 2022.06.23
(React)카운터 Redux로 만들기 -3  (0) 2022.06.23

댓글