@Redux/toolkit #2

준호·2020년 11월 7일

createSlice

createSlice는 생성된 reducer함수를 reducer라는 필드를 포함하는 "slice"객체와 actions이라는 객체 내부에서 생성된 액션 생성함수를 반환한다.

리덕스 모듈 하나를 만들기 위해서는 action type을 정의하고, actionCreator를 만들고 Reducer까지 만들어야 하는데 createSlice로 한번에 다 해결이 가능하다.

createSlice는 다음 옵션과 함께 option 객체를 인자로 사용한다.

name: createAction types를 생성하기 위해 사용되는 prefix
initialState : reducer의 초기 상태
reducer: key는 action type문자열이 되고, 메소드는 해당 액션이 dispatch 될 때 실행 될 reducer이다.

createSlice에 의해 생성된 리듀서는 현재 dispatch된 액션이 아닌 다른 액션에 의해 자동으로 현재 상태를 반환하도록 처리되어 있기에, 직접 핸들링 하지 않아도 된다.

const counterSlice = createSlice({
  name: 'counter',
  initialState: 0,
  reducers: {
    increment: state => state + 1,
    decrement: state => state - 1
  }
})

const store = configureStore({
  reducer: counterSlice.reducer
})

document.getElementById('increment').addEventListener('click', () => {
  store.dispatch(counterSlice.actions.increment())
})

export const { increment } = slice.action;
export default todoSlice.reducer

일반적으로 Redux에서는 절대적으로 불변성(immutable)을 지키며 코드를 짜야 한다.
array.push() 같은 식으로 state를 직접 변경하는 방법은 좋지 않다.
그러나 @redux/tool-kit의 createSlicecreateReducer 는 Immer 라이브러리의 produce로 래핑한다. 이로 인해 개발자는 내부의 상태를 변형하는 코드를 작성 해도(state.push() 같은 코드를 써도) 안전하게 불변성을 지킬 수 있게 된다.

기존에 리덕스를 사용 할 땐 이전 값을 불변성을 지키며 수정하기 위해 spread 연산자를 사용했다.

const todosReducer = createReducer([], {
  [addTodo]: (state, action) => {
    const todo = action.payload
    return [...state, todo]
  },
  (...)
})

createReducer에서는 새로운 값을 반환하려면 return을 사용해주고 , 기존 값을 변형하려면 return 없이 수행하면 알아서 불변성을 지켜준다.

const todosReducer = createReducer([], {
  [addTodo]: (state, action) => {
    // push는 기존의 배열에 todo를 추가한다.
    // 즉 배열을 mutate하지만 사용가능하다.
    const todo = action.payload
    state.push(todo)
  },
  (...)
})

요약

configureStore : Redux DevTools Extension을 자동으로 설정해주고, 기존 리덕스의 createStore 같은 역할을 담당한다.

createAction : 액션 타입 문자열을 받아 이 타입을 사용하는 액션 생성자 함수를 반환.

createReducer : 초기 상태값과 redcuer함수에 대한 lookup테이블을 받아 이를 처리하는 reducer를 작성

createSlice : createAction과 createReducer 역할을 모두 한개의 함수에서 모두 수행한다.

profile
빠르게 발전중인 프론트엔드 개발자

0개의 댓글