modules/todos.js

    import { createAction, handleActions } from 'redux-actions';
    import produce from 'immer';
    
    (...)
    
    const todos = handleActions(
      {
        [CHANGE_INPUT]: (state, { payload: input }) =>
          produce(state, draft => {
            draft.input = input;
          }),
        [INSERT]: (state, { payload: todo }) =>
          produce(state, draft => {
            draft.todos.push(todo);
          }),
        [TOGGLE]: (state, { payload: id }) =>
          produce(state, draft => {
            const todo = draft.todos.find(todo => todo.id = = = id);
            todo.done = !todo.done;
          }),
        [REMOVE]: (state, { payload: id }) =>
          produce(state, draft => {
            const index = draft.todos.findIndex(todo => todo.id = = = id);
            draft.todos.splice(index, 1);
          }),
      },
      initialState,
    );
    
    export default todos;

     

    immer를 사용한다고 해서 모든 업데이트 함수에 immer를 적용할 필요는 없습니다. 일반 자바스크립트로 처리하는 것이 더 편할 때는 immer를 적용하지 않아도 됩니다. 예를 들어 위 코드에서 TOGGLE을 제외한 업데이트 함수들은 immer를 쓰지 않는 코드가 오히려 더 짧기 때문에 이전 형태를 유지하는 것도 무방합니다.

    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.