만약 우리가 작업하는데 있어 동기작업인 http와 함께 로직을 짜야하는 상황이 온다 가정해보자.
이렇게 작동하는 이유는 만약에 여러 mutaions이 실행되면 모든 mutaions이 최신 상태를 받아야만 하기 때문이다.
Vuex에는 비동기식 코드를 위한 더 나은 개념이 있다. mutations과 getters외에도 액션(Actions)이 있다.
컴포넌트는 액션을 트리거하고 이는 mutaion을 commit하여 쓴다.
actions는 비동기식 코드를 사용할 수 있기 때문에 컴포넌트와 mutations 사이에 actions을 넣는 것은 일반적으로 좋은 방식이라고 여겨진다.
동기식 코드만을 사용한다면 문제될 것이 없고 컴포넌트 내부에서 mutations을 직접 commit()하는 것도 종종 문제가 되진 않는다.
그럼에도 action을 사이에 놓는 건 좋은 관행으로 여겨지는데 mutation에 실수로 비동기식 코드를 넣는 것을 방지해주기 때문이다.
const store = createStore({
state(){
return{
counter : 0
}
},
mutations:{
increament(state){
state.counter += 2;
},
increase(state, payload){
state.counter += payload.value;
}
},
actions:{
increment(context){
setTimeout(function () {
context.commit('increment');
},500);
},
increase(context, payload){
setTimeout(function () {
context.commit('increase', payload);
},500)
}
},
getters:{
...
}
})
export default {
components: {
...
},
methods: {
addOne() {
this.$store.commit({
type: "increase",
value:10
})
}
}
};
context를 로그 찍어보면 다음과 같이 볼 수 있는데
context.dispatch를 이용해 작업 내부에서 다른 작업을 전달할 수 있고 HTTP 요청을 보낼 때도 도움이 된다.
getters를 사용하여 게터에서 얻는 특정 값을 가져올 수도 있다. 게터에 접근하는 것만으로 충분하지 않을 때는 상태(state)를 직접적으로 사용할 수도 있다.