Published on

Redux Code 구현

Action

  • Action Type을 정의한다.
  • Action 생성자를 만든다.
/* actionTypes.js */
export const INCREMENT = 'INCREMENT';
export const DECREMENT = 'DECREMENT';
export const SET_COLOR = 'SET_COLOR';

/* actions.js */
import * as types from './actionTypes';

export function increment() {
  return {
    type: types.INCREMENT,
  };
}

export function setColor(color) {
  return {
    type: types.SET_COLOR,
    color,
  };
}

Reducer

  • 이전 상태와 액션을 받아서 다음 상태를 반환한다.
  • reducer 파일을 여러개로 분리할 때에 redux에서 제공하는 combineReducers를 통해 하나로 합쳐서 사용한다.
/* reducers.js */
import * as types from '../actions/actionTypes';

const initialState = {
  number: 0,
};

export default function counter(state = initialState, action) {
  switch (action.type) {
    case types.INCREMENT:
      return {
        ...state,
        number: state.number + 1,
      };
    case types.DECREMENT:
      return {
        ...state,
        number: state.number - 1,
      };
    default:
      return state;
  }
}

Store

  • dispatch(action) : action을 reducer로 보낸다. 현재의 상태와 함께.
  • getState() : 현재상태를 반환한다.
  • subscribe(listener) : state가 바뀔때마다 실행될 콜백을 등록한다. unsubscribe function을 리턴한다.
/* store.js */
import { createStore } from 'redux';
import reducers from './reducers';
import * as types from './actions';

const store = createStore(reducers);

/* state 변경시 실행될 콜백 등록 */
const unsubscribe = store.subscribe(() => console.log(store.getState()));

/* reducer로 action을 보내고, reducer에서 리턴한 state로 변경된다. */
store.dispatch(action.increment());
store.dispatch(action.increment());
store.dispatch(action.decrement());
store.dispatch(action.setColor([200, 200, 200]));

/* 위에서 등록한 state변경 콜백을 끊는다 */
unsubscribe();