Vue.js/Vuex

Vuex 10. Store 모듈화, 프로젝트 구조화

Jungsoomin :) 2020. 12. 20. 01:07

여러가지 속성 들을 분리시키려면 어떻게 해야하는지

  • Vuex.Store({}) 속성의 내용ES6의  Modules로 연결시킨다.
// store.js
import Vue from 'vue'
import Vuex from 'vuex'

export const store = enw Vuex.Store({
	state : {},
    getters : {},
    mutations : {},
    actions : {}
});

속성 파일의 분리

  • ES6 Modules Export => Import 문을 사용한 속성모듈화
import Vue from 'vue'
import Vuex from 'vuex'
import * as getters from './getters'
import * as mutations from './mutations'

//use() 는 전역적으로 기능을 추가할 때 사용한다. &store 로 접근 가능하다.
Vue.use(Vuex);

// Function 으로 따로 뺌
const storage = {
  fetch() {
    const arr = [];
    //ES6
    const map = Object.entries(localStorage);
    map.forEach((entry,index) => {
      if(entry[0] !== 'loglevel:webpack-dev-server'){
        const item = JSON.parse(entry[1]);
        arr.push(item)
      }
      console.log(arr)
      });
    return arr;
  }
};

export const store = new Vuex.Store({
  state: {
    // 전역적으로 사용되는 데이터
    todoItems: storage.fetch()
  },
  getters,
  mutations

});

 

분리시킨 속성 파일

//mutations

const  addOneItem = (state, TodoItem) => {
    const obj = {completed: false, item: TodoItem};
    //Object를 저장하기위해 stringify를 사용하는 것도 좋다.
    localStorage.setItem(TodoItem,JSON.stringify(obj));
    // mutations 는 반드시 state 인자로만 접근하다.
    state.todoItems.push(obj);
  };

  const removeOneItem = (state,itemInfo) => {

    localStorage.removeItem(itemInfo.todoItem.item);
    //배열요소 빼기 : (배열을 직접적으로 건드림) , slice(새로운 배열을 리턴 함)
    state.todoItems.splice(itemInfo.index, 1);
  };

  const toggleOneItem = (state,itemInfo) => {
    // 중앙 컴포넌트에서 관리되야한다.
    state.todoItems[itemInfo.index].completed = !state.todoItems[itemInfo.index].completed

    const item = itemInfo.todoItem.item;

    localStorage.removeItem(item);
    localStorage.setItem(item,JSON.stringify(itemInfo.todoItem));
  };

  const clearAllItems = (state) => {
    state.todoItems = [];
    localStorage.clear();
  };

  export { addOneItem, removeOneItem, toggleOneItem, clearAllItems }

 


모듈화

  • 데이터의 속성에 따라 다른 Store 로 나누어 줌으로서 Store 가 비대해지는 것을 막을 수 있다.
  • Vuex.Storemodules 속성을 사용한다.
//store.js

import Vue from 'vue'
import Vuex from 'vuex'
import todo from 'modules/todo.js'

export const store = new Vuex.Store({
	moudles : {
    	// or todo (ES6)
        // id : ModuleName
    	moduleA: todo,
    }
});


//todo.js 데이터 관련 Store 속성이 들어가면 된다.
const state = {};
const getters = {};
const mutations = {};
const actions = {};

 

사용 예시

  • main.js 에 있는 Vuex 에 기술된 Store 생성자의 속성은 modules 만 남게 된다.
  • 객체 형식으로 속성 값들의 내용을 채워준다.
  • modules 속성에 키:값으로 기술한다.
//main.js

import Vue from 'vue'
import Vuex from 'vuex'
import todoApp from './modules/todoApp'

//use() 는 전역적으로 기능을 추가할 때 사용한다. &store 로 접근 가능하다.
Vue.use(Vuex);

export const store = new Vuex.Store({
  modules : {
    todoApp
  }
});

따로 분리시킨 Store 파일

// todoApp.js

const storage = {
  fetch() {
    const arr = [];
    //ES6
    const map = Object.entries(localStorage);
    map.forEach((entry,index) => {
      if(entry[0] !== 'loglevel:webpack-dev-server'){
        const item = JSON.parse(entry[1]);
        arr.push(item)
      }
      console.log(arr)
    });
    return arr;
  }
};

// 객체 형식으로 적어줌

 const state = {
  // 전역적으로 사용되는 데이터
  todoItems: storage.fetch()
};

 const getters = {
    storedTodoItems(state){
      return state.todoItems;
    }
 };

 const mutations = {
   addOneItem(state, TodoItem) {
     const obj = {completed: false, item: TodoItem};
     //Object를 저장하기위해 stringify를 사용하는 것도 좋다.
     localStorage.setItem(TodoItem,JSON.stringify(obj));
     // mutations 는 반드시 state 인자로만 접근하다.
     state.todoItems.push(obj);
   },

   removeOneItem(state,itemInfo) {
     localStorage.removeItem(itemInfo.todoItem.item);
     //배열요소 빼기 : (배열을 직접적으로 건드림) , slice(새로운 배열을 리턴 함)
     state.todoItems.splice(itemInfo.index, 1);
   },

   toggleOneItem(state,itemInfo) {
     // 중앙 컴포넌트에서 관리되야한다.
     state.todoItems[itemInfo.index].completed = !state.todoItems[itemInfo.index].completed

     const item = itemInfo.todoItem.item;

     localStorage.removeItem(item);
     localStorage.setItem(item,JSON.stringify(itemInfo.todoItem));
   },

   clearAllItems(state) {
     state.todoItems = [];
     localStorage.clear();
   }
 };

// export default 는 단 한번만 export 시킨다는 의미.
 export default {
   state,
   getters,
   mutations
 }

 

'Vue.js > Vuex' 카테고리의 다른 글

Vuex 9.mapMutations , mapActions  (0) 2020.12.20
Vuex 8.mapState, mapGetters  (0) 2020.12.19
Vuex 7.Helper 함수 개요  (0) 2020.12.19
Vuex 6.Actions  (0) 2020.12.19
Vuex 5.Mutations  (0) 2020.12.19