• 카테고리

    질문 & 답변
  • 세부 분야

    프론트엔드

  • 해결 여부

    미해결

vuex mutations 질문입니다.

20.08.05 10:19 작성 조회수 245

0

안녕하세요.

강의 수강 후 직접 프로젝트를 만들어보고 있습니다.

vuex의 mutations와 관련된 질문입니다.

vuex의 state는 반드시 mutations를 이용해서 값을 변경해줘야 한다고 알고 있습니다.

근데 아래와 같이 배열이 중첩된 구조일때

const itemArr = [
    {
        id: 1,
        name: '상품A'
        options: ['옵션A', '옵션B']
    },
    {
        id: 2,
        name: '상품B',
        options: ['옵션C', '옵션D']
    }
]

상품B의 옵션 중 하나를 삭제해야 되는 경우는 어떻게 해야 될까요?

기존에는 아래와 같이 컴포넌트단에서 commit을 할 때 상품B의 id값을 인자로 전달을 하고 store의 mutations에서는

state에서 itemArr을 꺼내와 전달받은 id값과 비교해 상품B를 찾고 다시 options 배열을 꺼내서 삭제할 요소를 찾은 후 삭제를 하였습니다.

코드는 아래처럼..

// 컴포넌트
...
methods: {
    delItem(itemId, optionName) {
        this.$store.commit('order/DELETE_ITEM_OPTION', { itemId, optionName });
    }
}

// store
...
export const mutations = {
    DELETE_ITEM_OPTIONS(state, { itemId, optionName }) {
        const item = state.itemArr.find(item => item.id === itemId);
        const delIdx = item.options.findIndex(op => op === optionName);
        item.options.splice(delIdx, 1);
    }
}

근데 컴포넌트단에서는 itemArr을 화면에 그리면서 for문을 돌면서 delItem 메서드를 호출하게 될 텐데 이미 삭제 대상이되는 item 객체(itemArr의 요소)를 알고 있는 상황인데요

위처럼 itemId를 넘기면 mutations에서 다시한번 state에서 itemArr 배열을 꺼내와서 item의 id를 비교해야 될텐데 같은 작업을 store에서 다시 반복해야 되더라구요

그래서 아래와 같이 itemId를 넘기는게 아닌 삭제 대상이 되는 item 객체(itemArr 요소)를 바로 인자로 넘겨버려도 될까요?

// 컴포넌트
...
methods: {
    delItem(item, optionName) {
        this.$store.commit(‘order/DELETE_ITEM_OPTION’, { item, optionName });
    }
}

// store
…
export const mutations = {
    DELETE_ITEM_OPTIONS(_state, { item, optionName }) {   // state는 안쓰임
        const delIdx = item.options.findIndex(op => op === optionName);
        Item.options.splice(delIdx, 1);
    }
}

지금까지는 mutations에서는 반드시 state에서 값을 꺼내와서 값을 변경해줬는데 위처럼 state에서 꺼내지 않고 item 객체를 전달받아서 변경을해도 상관이 없을까요?

권장되지 않는 방식인지 궁금합니다.

감사합니다.

답변 2

·

답변을 작성해보세요.

1

보통은 1번 방식으로 많이 하는데 2번도 동작한다면 상관은 없을 것 같습니다.

확인을 위해서 다음을 콘솔로그로 찍어 두 아이템이 같은 객체인지 확인해보세요.

console.log(state.itemArr.find((i) => i.id === item.id) === item)

0

치훈이님의 프로필

치훈이

질문자

2020.08.06

답변 감사합니다!!