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를 쓰지 않는 코드가 오히려 더 짧기 때문에 이전 형태를 유지하는 것도 무방합니다.