<template>
<h3>{{counter}}</h3>
</template>
<script>
export default {
computed:{
counter(){
return this.$store.getters.finalCounter
}
},
}
</script>
this.
키워드 밑으로 $store...
가 너무 귀찮다면 mapGetters를 이용해봐도 좋겠다.<template>
<h3>{{finalCounter}}</h3>
</template>
<script>
import {mapGetters} from "vuex";
export default {
computed:{
...mapGetters(['finalCounter'])
},
}
</script>
computed 객체 내부에서 이 함수를 사용할 수 있다.
mapGetters가 제공하는 객체는 computed 프로퍼티로 구성되어 있는 객체이며 자동으로 정의된다.
mapGetters는 배열을 인수로 받는다.
{{ }}
구문에 finalCounter를 자유롭게 쓸 수 있다. finalCounter가 연산 프로퍼티의 이름이기 때문이다.mapGetters를 사용하면 특히 컴포넌트에서 게터를 여러 개 사용할 경우 저장소를 불필요하게 파고들 필요 없이 코드를 효율적으로 작성할 수 있다.
<template>
<button @click="addOne">Add 2</button>
</template>
<script>
export default {
methods:{
addOne(){
this.$store.commit("increament");
}
}
}
</script>
<template>
<button @click="inc">Add 2</button>
<button @click="incs({value:10})">Add 10</button>
</template>
<script>
import {mapActions} from "vuex";
export default {
methods:{
...mapActions({
inc:'increment',
incs : 'increase'
})
}
}
</script>
매핑
하여사용했다. 저장소 및 상태 등이 점차 많아짐에 따라 Vuex가 제공하는 여러 유용한 기능 중에 모듈을 설정해서 저장소를 여러 모듈로 나누는 기능을 사용하면 좋다.
애플리케이션에 하나의 저장소가 있고 그 저장소가 다수의 모듈로 이루어져 코드를 관리하기 쉬워지는 것이다.
우선 기존의 모듈을 분리한다.
const customedModule = {
state(){},
mutations:{},
actions:{},
getters:{}
}
const store = createStore({
modules:{
식별자 : customedModule
}
...
})
기본적으로 저장소로 결합된 모듈들은 같은 레벨에 결합된다.
따라서 해당 저장소에 모듈을 결합하면 모듈을 만들기 전처럼 게터 등을 저장소에서 바로 찾을 것이다.
그래서 모듈을 사용해도 액션을 디스패치하고 게터를 전처럼 사용할 수 있다.
하지만 분명 다른점이 있을 것이다. 무엇일까?
mutations, actions, getters는 전역(global)이라 메인 저장소에서 전처럼 액세스할 수 있지만 state는 모듈의 지역 상태이기 때문에 모듈 내에 상태는 해당 모듈에만 적용되는 것이다.
말을 어렵게 했는데 그냥 한마디로 state가 지역변수처럼 바뀌어 다른 모듈에서는 해당 state를 사용할 수 없다는 뜻이다.
그렇다면 이를 어떻게 타파할 수 있을까 바로 rootState, rootGetters이다.
const customedModule = {
state(){
return {
counter : 0
}
},
getter:{
testAuth(rootState, rootGetters) {
return rootState.isLoggedIn
},
}
}
local state 외에도 모듈 전체를 지역 모듈로 만들 수 있다.
바로 네임스페이스를 이용해서 여러 모듈을 분명히 분리하는 것인데 어떤 경우에 사용할까
애플리케이션이 커지면서 이름이 중복되는 경우가 생긴다. 한 저장소 내 다른 모듈에서 getters나 actions등에 같은 이름을 사용하게 될 수 있다.
const customedModule = {
namespaced:true
...
}
namespaced를 true로 설정하면 state뿐만이 아니라 모듈 전체가 store로부터 분리되어야 한다는 걸 Vuex에 알린다.
즉, state를 제외하고 하나의 객체로 결합되던 것이 이제는 아예 분리가 된다는 뜻이다.
네임스페이스는 store의 modules에 모듈을 추가할 때 지정하는 키이다. 이 경우 numbers가 counterModule의 네임스페이스인것인데 이제 이 네임스페이스를 이용해 모듈 내 action과 getter등을 다뤄야 한다.
<template>
<h3>{{counter}}</h3>
<p>We do more...</p>
</template>
<script>
export default {
computed:{
counter(){
return this.$store.getters.normalizedCounter;
}
}
}
</script>
<template>
<h3>{{counter}}</h3>
<p>We do more...</p>
</template>
<script>
export default {
computed:{
counter(){
return this.$store.getters['numbers/normalizedCounter'];
}
}
}
</script>
<template>
<h3>{{finalCounter}}</h3>
</template>
<script>
import {mapGetters} from "vuex";
export default {
computed:{
...mapGetters('numbers', ['finalCounter'])
},
methods:{
addOne() {
// this.$store.commit("increase", {value:10});
this.$store.dispatch({
type: "numbers/increase",
value:10
})
}
...mapActions('numbers', {
inc:'increment',
incs : 'increase'
})
}
}
</script>