redux 로 객체 다루기

최경락 (K_ROCK_)·2022년 6월 9일
0

개요

  • 현재 redux 를 이용하여 숫자, 문자열, 배열, 객체를 다뤄보는 연습을 하고 있다.
  • 객체의 reducer 를 작성하는 과정에서 막혔던 부분이 있어 해당 내용을 정리하고자 한다.

reducer

import { UPDATE_CONTENT, UPDATE_TITLE, CLEAR_OBJECT } from './types';

const initialState = {
  obj: {
    title: '기본제목',
    content: '기본본문',
  },
};

const objectReducer = (
  state = initialState,
  action: { type: string; payload: { title: string; content: string } }
) => {
  switch (action.type) {
    case UPDATE_CONTENT:
      return {
        obj: {
          ...state.obj,
          content: action.payload.content,
        },
      };
    default:
      return state;
  }
};

export default objectReducer;
  • 처음 작성 할 땐 위처럼 작성했는데, 작성 후 다시 생각해보니 위의 코드는 상태를 직접 변경하기 때문에 옳지 않은 방법인 것 같았다.

Object.assign()

  • 그래서 찾은 방법은 Object.assign() 메소드를 사용하는 것이다.
  • Object.assign() 은 인자로 들어온 객체들의 값을 복사하고, 첫번째 인자의 객체에 병합시켜 변경시킨 뒤, 병합된 객체을 반환한다.
    → 즉, 첫번째 인자만 직접 변경되고, 그 이외는 복사된다.
  • 아래의 코드를 보자.
case UPDATE_CONTENT:
      return Object.assign(state.obj, {
        obj: {
          ...state.obj,
          content: action.payload.content,
        },
      });
  • 위의 코드는 상태의 값이 직접 변경되지 않아야 하지만, 첫번째 인수에 들어가게 되어 상태를 직접 변경시킨다.
case UPDATE_CONTENT:
      return Object.assign({}, state.obj, {
        obj: {
          ...state.obj,
          content: action.payload.content,
        },
      });
  • 위에서 말했다시피 병합된 객체를 반환하는데, 빈 객체를 만들어 복사된 상태의 값을 사용하므로, 상태를 직접적으로 수정하지 않고 갱신한다.

+

0개의 댓글