업데이트:

VUEX

상태관리를 위한 라이브러리. 데이터의 변경사항을 추적하고 관리해주는 도구.

VUEX 주요기술

기존에 컴포넌트 내부에서 작성했던 영역을 vuex의 각 기술과 아래와 같이 매칭해볼 수 있음.
이 기술을 사용하게 되면, 각 컴포넌트에 기술했던 메소드들을 store에 기술하여 관리하게 됨.

  • state (data)
  • mutations (methods)
  • actions (methods - 비동기처리)
  • getters (computed)

설치

//vue 2.x
> npm install vuex

//vue 3.x
> vue add vuex

사용방법

//main.js
import Vue from "vue";
import Vuex from "vuex";

Vue.use(Vuex);

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

new Vue({
  el: "#app",
  store,
  render: h => h(App)
});

state

사용할 변수(data 속성)를 미리 기술하여, 관리대상에 포함시켜 놓음.
즉, state 영역에 항상 변경된 값을 저장해야 됨.

mutations

state의 속성들을 유일하게 변경할 수 있는 영역으로, 컴포넌트 내부나 actions, getters에서
바로 data를 변경하는 것을 금지함. 즉, 상태변화 추적을 위한 영역.
컴포넌트나 다른 영역에서 mutations에 정의된 메소드를 호출할 경우 commit 을 사용.

//store에서 mutations 호출
state : {
	message : 'hello'
},
mutations: {
	introMsg (state, msg){
		state.message = msg;
	}
},
actions: {
	callMsg ({commit, dispatch}, message){
		commit('introMsg', message);
		dispatch('richMsg', message)
	},
	richMsg ({commit}, message){
		commit('introMsg', message+' world!');
	}
}
//component 내부에서 mutations 호출
<template>
  <div>
    <button @click="hi()"></button>
  </div>
</template>

<script>
  ...
  methods : {
    hi(){
      this.$store.commit('introMsg', 'Hello World!!')
    }
  }
  ...
</script>

actions

비동기처리를 위한 메소드정의 영역으로 setTimeout()이나 http 통신 처리와 같이 결과를 받아올 타이밍이 예측되지 않은 로직을 정의.
state값을 바로 접근할 수 없고, mutations에 data를 전달하여 mutations에서 변경하도록 해야 함.
다른 actions 메소드나 외부에서 actions메소드를 호출할 때는 dispatch 를 사용.

getters

computed 와 같은 역할을 대체할 수 있음.

  //store
  stage : {
	  message : 'hello'
  },
  getters: {
	returnMsg (state){
		return state.message;
	}
  }
})
//component
<template>
  <p></p>
</template>
//component
computed : {
	message (){
		this.$store.getters.returnMsg;
	}
}

Helper함수

helper함수를 이용해 component 내부에서 vuex를 쉽게 사용할 수 있음. (store 속성들을 내부 메서드 처럼 사용가능)

  • mapState
  • mapGetters
  • mapMutations
  • mapActions
state: {
	todolist : ['abcd']
},
getters: {
	todoAll (state){
		return state.todolist;
	}
},
mutations: {
	addTodo(state, todo){
		state.todolist.push(todo);
	},
	delTodo(state, delIdx){
		state.todolist.splice(delIdx,1);
	}
}
<template>
  <ul>
    <li v-for="(todo, index) in this.todolist" :key="index">
       <button @click.prevent="delTodo(index)">delete</button>
    </li>
  </ul>
</template>
//component
import { mapState, mapGetters, mapMutations } from "vuex";
export default {
  computed: {
    ...mapState({
      //computed에 state 헬퍼함수도 적용가능.
      todolist: "todolist"
    }),
    ...mapGetters({
      todolist: "todoAll"
    })
  },
  methods: {
    ...mapMutations({
      delTodo: "delTodo"
    })
  }
};

[주의] 여기서 스프레드 오퍼레이터(…) 문법을 사용하였는데, 이는 ES6 문법으로 사용할 경우 babel preset이 필요함.
스프레드 오퍼레이터를 사용하는 이유는,
아래와 같이 스프레드 오퍼레이터 문법을 사용하지 않고 헬퍼함수를 바로 정의할 수 있지만, 추가 메소드를 정의할 수 없는 단점이 있음.

//component
import { mapGetters, mapMutations } from "vuex";
export default {
  computed: mapGetters({
    todolist: "todoAll"
  }),
  methods: {
    ...mapMutations({
      delTodo: "delTodo"
    })
  }
};

댓글남기기