Redux: react 전역 상태 관리

redux 기본 사용법

세팅

1. 클릭 이벤트 받는 컴포넌트 생성

import React from "react";

const Counters = ({ number, onIncrease, onDecrease, onReset }) => {
  return (
    <div>
      <h1>{number}</h1>
      <div>
        <button onClick={onIncrease}>+1</button>
        <button onClick={onDecrease}>-1</button>
        <button onClick={onReset}>reset</button>
      </div>
    </div>
  );
};

export default Counters;

위에서 상태(state) number값 받고, 'onIncrease, onDecrease, onReset'는 상태를 변하게 하는 함수이다.

이 함수들은 리듀서 함수로 만든다.



2. 액션 타입 지정

const INCREASE = "counter/INCREASE";
const DECREASE = "counter/DECREASE";
const RESET = "counter/RESET";


3. 액션 생성 함수

export const increase = () => ({
  type: INCREASE,
});
export const Decrease = () => ({
  type: DECREASE,
});
export const Reset = () => ({
  type: RESET,
});

액션을 생성하는 함수

'increase'를 호출하면 'type: INCREASE'를 반환 시켜준다.



4. 상태(state) 초기값 설정

const initialState = {
  number: 0,
};

상태의 초기값을 설정한다.

number 라는 상태가 0이라는 값을 가지고 있다.

(참고로 폴더를 나누게 된다면 2,3, 4+5로 나눈다 -> 상태 초기값은 리듀서 함수가 있는 곳어 넣음)



5. 리듀서 함수

const counter = (state = initialState, action) => {
  switch (action.type) {
    case INCREASE:
      return {
        number: state.number + 1,
      };
    case DECREASE:
      return {
        number: state.number - 1,
      };
    case RESET:
      return {
        number: (state.number = 0),
      };
    default:
      return state;
  }
};

export default counter;

설정한 상태의 초기값과 action값을 받는다.



6. root 리듀서 생성

./modules/index.js

import { combineReducers } from "redux";
import Counters from "../components/Counters";

const rootReducer = combineReducers({
  // modules/Counter.js의 리듀서 함수
  Counters,
});

export default rootReducer;

위의 Counters는 2~5번에서 했던 리듀서 함수 이다.

리듀서들이 늘어나면 다음과 같이 모든 리듀서를 받는 root리듀서를 만든뒤 rootReducer만 전달한다.

7. store

위에서 만든 rootReducer를 이제 store를 생성하여 현재 프로젝트에서 관리 할 수 있게 한다.

store는 App.js에 다음과 같이 설정한다.

import React from "react";
import ReactDOM from "react-dom";
import App from "./App";

// =-=-
// store 생성 함수
import { createStore } from "redux";

// 리액트에서 store를 사용하게 해준다.
import { Provider } from "react-redux";

// 만든 리듀서들을 넣은 rootReducer
import rootReducer from "./modules/index";

const store = createStore(rootReducer);
// =-=-

ReactDOM.render(
  <React.StrictMode>
    {/** Provider로 <App/>을 감싸고, store를 전달한다. */}
    <Provider store={store}>
      <App />
    </Provider>
  </React.StrictMode>,
  document.getElementById("root")
);

필요 모듈 부분


  1. 이전에 만든 rootReducer를 가져와서 다음과 같이 store를 생성하여 store변수에 저장한다.
const store = createStore(rootReducer);
  1. redux는 react만을 위한 것이 아니기 때문에 store를 다음과 같이 Provider로 전송해야한다.
ReactDOM.render(
  <React.StrictMode>
    <Provider store={store}>
      <App />
    </Provider>
  </React.StrictMode>,
  document.getElementById("root")
);
  1. 그리고 <App/> 을 Provider로 감싸주어서 store를 모든 리액트 파일에서 접근 할 수 있도록 한다.