JavaScript와 HTML, CSS등에 대해서는 일체 다루지 않는다.
기초지식은 다른 강의를 참조하도록 하라.
참고:
[Package]Bower(Front End Pacakage 관리) 설치
http://vuejs.kr/update/2017/01/08/using-vue-with-vuex-vue-rotuer/
vue에서 vuex를 붙혀서 사용하는 방법은 여러분들도 이제 알았다.
조금 더 깔끔하게 사용하는 방식이 있는데 바로 핼퍼를 사용하는 것이다.
결합도를 조금 더 낮추는 효과가 있으며 전역을 사용하는 vuex를 좀 더 컴포넌트적인 관점으로 보게해준다.
그리고 마크업 관점에서 코드가 길어지는걸 대비할 수 있다.
이를 이용하는게 바로 helper들이고 vuex map함수라고 부르는 경우도 있다.
뭐라고 부르건 여러분들의 마음이다.
helper 함수 종류
mapState - state를 연결해주는 함수
mapGetters - getters를 연결해주는 함수
mapMutations - mutations를 연결해주는 함수
mapActions - actions를 연결해주는 함수
엄청 당연한 말만 써놨는데 생각해 보니까 당연하다.
예제는 기존 코드를 변경하는 방식으로 진행할 생각이다.
https://github.com/justkukaro/vue-test-server/tree/master/testserver
ajax콜을 받는 백엔드 서버이다. 없으면 없는대로 진행해도 무리는 없다.
https://github.com/justkukaro/vue-test-server/tree/master/vuex-actions
이것이 저번까지 했던 helper를 쓰지 않는 코드이다.
https://github.com/justkukaro/vue-test-server/tree/master/vuex-helper
이 코드가 핼퍼를 사용하는 코드이다.
/* store.js */
import Vue from 'vue'
import Vuex from 'vuex'
import axios from 'axios'
Vue.use(Vuex);
export default new Vuex.Store({
state: {
count: 0,
weight: 2,
random: 0,
},
mutations: {
increment(state) {
state.count++;
},
decrement(state) {
state.count--;
},
successGenerateRandomNumber(state, payload){
state.random = payload.num;
},
failGenerateRandomNumber(/*state, payload*/){
console.log('ERROR!');
}
},
getters:{
count(state, getters){
return Math.pow(state.count, getters.weight);
},
weight(state, /*getters*/){
return state.weight;
},
random(state, /*getters*/){
return state.random;
}
},
actions:{
generateRandomNumber({commit, /*state*/}, /*payload*/) {
axios.get(`http://localhost:4321/`)
.then((res) => {
commit('successGenerateRandomNumber', res.data);
})
.catch((res) => {
commit('failGenerateRandomNumber', res);
});
}
}
})
저번에 사용했던 store가 딱 적당한 예제인데 모든 부분이 조금씩 사용되고 있다.
<!--HelloWorld.vue-->
<template>
<div class="hello">
<b>count : {{$store.state.count}}</b><br>
<b>count^2 : {{$store.getters.count}}</b><br>
<b>random : {{$store.getters.random}}</b><br>
<input type="button" @click="increment()" value="increment"/>
<input type="button" @click="decrement()" value="decrement"/>
<input type="button" @click="randomNumber()" value="random"/>
</div>
</template>
<script>
export default {
name: 'HelloWorld',
data() {
return {}
},
created: function () {
},
methods: {
increment: function () {
this.$store.commit('increment')
},
decrement: function () {
this.$store.commit('decrement')
},
randomNumber: function () {
this.$store.dispatch('generateRandomNumber', /*100*/);
}
}
}
</script>
<style scoped>
</style>
모든 요소들을 사용하는 것을 볼 수 있다.
먼저 state부터 바꿔보자.
mapState
import {mapState} from 'vuex'
상단에는 당연히 위처럼 선언해준다.
computed: {
...mapState([
'count'
])
}
mapState는 state를 끌어와서 사용할 수 있다.
만약 여러분이 적은게 store내에 존재하지 않다면 당연히 아무것도 출력하지 않는 빈문자열이 출력된다. === 아무것도 출력안됨.
이 state는 computed에 선언해주어야한다.
반드시 computed여야하는건 아니지만 권장된다.
<b>count : {{count}}</b><br>
그러면 여러분은 이렇게 사용할 수 있게 된다.
마크업적으로 훨씬 깔끔하게 되었다.
...mapState({
cnt: 'count',
})
여러분은 무조건 배열만 써야하는것은 아니다.
만약 이름을 정하고 싶다면 object를 사용해도 무방하다.
<b>count : {{cnt}}</b><br>
당연하게 호출하는 방식도 바뀌게 된다.
mapGetters
...mapGetters({
count: 'count'
}),
사용방식 역시 똑같다. 당연히 배열로도 사용가능하다.
computed: {
...mapState({
cnt: 'count',
}),
...mapGetters({
count: 'count'
}),
}
이 Getters는 computed에 선언해주어야한다.
반드시 computed여야하는건 아니지만 권장된다.
<b>count^2 : {{count}}</b><br>
위 처럼 사용할 수 있다.
mapMutations
increment: function () {
this.$store.commit('increment')
},
decrement: function () {
this.$store.commit('decrement')
},
이 두녀석을 통째로 바꿔보자.
import {mapState, mapGetters, mapMutations} from 'vuex'
일단 당연히 선두에 선언해줘야한다.
methods: {
...mapMutations({
increment: 'increment',
decrement: 'decrement'
}),
randomNumber: function () {
this.$store.dispatch('generateRandomNumber', /*100*/);
}
},
이 녀석들은 methods에 선언해줘야한다.
그리고 store에 있는 변수들과 연결시켜준다.
<input type="button" @click="increment()" value="increment"/>
<input type="button" @click="decrement()" value="decrement"/>
그러면 놀랍게도 함수가 직접 store와 연결된다.
이는 장점과 단점이 함께 있어서 필자생각에는 좀 주의를 요하긴 하는거 같다.
mapActions
randomNumber: function () {
this.$store.dispatch('generateRandomNumber', /*100*/);
}
이번엔 이녀석을 바꿔보자.
import {mapState, mapGetters, mapMutations, mapActions} from 'vuex'
이제 helper 4총사를 모두 선언하였다.
methods: {
...mapMutations({
increment: 'increment',
decrement: 'decrement'
}),
...mapActions({
randomNumber: 'generateRandomNumber'
}),
},
이 녀석역시 methos에 선언해줘야한다.
<input type="button" @click="randomNumber()" value="random"/>
코드 하나 수정없이 직접 actions과 연결하였다.
helper의 사용유무의 장점과 단점
이 개념은 react포스팅 react-redux에도 똑같이 존재하는 개념이다.
물론 둘 다 써본 필자의 입장에서는 개념은 똑같지만 vuex가 좀더 세련되 보인다, 다만 큰 작업을 하거나 자유도 측면에서는 redux가 좀더 낫다.
다만 react-redux나 vuex helper같은 개념이 왜 필요하냐는 것이다.
사실 없이 쓰는 사람들도 굉장히 많다.
이를 이해하기위해서는 원자 디자인을 이해해야한다.
필자도 한번 포스팅 할 생각이고 필자가 포스팅을 완료하면 이 항목이 수정 될?수도 있을것이다.
그러나 아직 개념을 모르는 사람들이 있다면 이 포스팅을 보시면 도움이 될 것이다.
간단히 말하자면 모든 컴포넌트에는 data와 methods가 없고 외부만 존재하고 데이터는 store에서 처리한다는 개념이다.
즉 모든 데이터는 store에서 일괄처리한다는 것인데 아주 여러가지 단점과 아주 여러가지 장점을 함께 가진다.
그래서 뭐가 좋다라고 말하기는 힘들다. 그러니 여러분들은 알아보고 잘 생각해서 사용하는 것이 좋다.
'Programming > JavaScript-Vue' 카테고리의 다른 글
[Vue-20]값의 동적 변경과 양방향바인딩, 그리고 v-model(실용편) (0) | 2019.06.28 |
---|---|
[Vue-19]components와 props, 그 못다한 이야기 (0) | 2019.06.25 |
[Vue-17]vuex 사용하기(actions로 비동기 통신) (0) | 2019.06.18 |
[Vue-16]vuex 사용하기(getters) (0) | 2019.06.18 |
[Vue-15]mixin 만들고 사용해보자.(기능만 재사용가능하게 하는 방법) (0) | 2019.05.15 |