관심사의 분리
관심사의 분리(Separation of Concerns) 원칙에 따라 스토어의 액션, 뮤테이션, 게터 등을 분리해 관리할 수 있습니다.
스토어의 index.js
파일에서 actions
부분을 제거한 후, 외부에서 불러와 설정되도록 코드를 변경합니다.
// store/index.js
import actions from './actions';
export default new Vuex.Store({
// ...
actions,
});
actions.js
파일을 만든 후, 분리된 액션 코드를 별도로 관리할 수 있습니다.
분리된 액션은 shop
객체의 메서드에 접근할 수 있어야 하므로 shop
모듈을 불러와야 합니다.
// store/actions.js
import shop from '@/api/shop';
export default {
addBookToCart({state, getters, commit}, book) {
if (!getters.checkOutOfStock(book)) {
const cartItem = state.cart.find(item => item.id === book.id);
if (!cartItem) {
commit('pushBookToCart', book.id);
} else {
commit('increamentBookQuantity', cartItem);
}
commit('decreamentBookInventory', book);
}
},
purchage({state, commit}) {
shop.buyBooks(
state.cart,
() => {
commit('emptyCart');
commit('notifyStatus', '성공');
},
() => {
commit('notifyStatus', '실패');
}
);
},
fetchBooks({commit}) {
return new Promise((resolve, reject) => {
shop.getBooks(books => {
commit("setBooks", books)
resolve();
});
});
}
};
NOTE
동일한 방법으로 스테이트, 게터, 뮤테이션 또한 분리 가능합니다.
// store/index.js
import Vue from 'vue';
import Vuex from 'vuex';
import state from '@/store/state';
import getters from '@/store/getters';
import actions from '@/store/actions';
import mutations from '@/store/mutations';
Vue.use(Vuex);
export default new Vuex.Store({
state,
getters,
actions,
mutations
});
스토어 디렉토리는 다음과 같이 구성됩니다.
src/store
├── index.js
├── state.js
├── getters.js
├── actions.js
└── mutations.js