Programming Language/Vue
[Vue] 08)Vuex 활용 예시
Sergemeow
2023. 5. 8. 17:05
Before start
- 객체 메서드 축약형을 사용하기
// before
const obj1 = {
addValue: function(value){
return value
},
}
// after
const obj2 = {
addValue(value){
return value
},
}
src / store / index.js
- vuex의 핵심 컨셉 4가지
- state
- 중앙에서 관리하는 모든 상태 정보
- $store.state로 접근 가능
- store의 state에 message 데이터 정의
- getters
- mutations
- actions
- state
// store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
message: 'message in store'
},
getters: {
},
mutations: {
},
actions: {
},
modules: {
}
})
// App.vue
<template>
<div id="app">
<h1>{{ $store.state.message }}</h1>
</div>
</template>
...
export default{
name: 'App',
computed: {
message(){
return this.$store.state.message
},
},
}
- component에서 state 사용
- $store.state로 바로 접근하기보다 computed에 정의 후 접근하는 것을 권장
- Vue 개발자 도구에서 관리하면을 Vuex로 변경하면 관리 되고 있는 state 확인 가능
actions
- state를 변경할 수 있는 mutations 호출
- component에서 dispatch()에 의해 호출됨
- dispatch(A, B)
- A: 호출하고자하는 actions 함수
- B: 넘겨주는 데이터(payload)
- actions에 정의된 changeMessage 함수에 데이터 전달하기
- component에서 actions는 dispatch()에 의해 호출됨
// App.vue
<template>
<div id="app">
<h1>{{ message }}</h1>
<input type="text" @keyup.enter="changeMessage" v-model="inputData">
</div>
</template>
<script>
export default{
...
data() {
return{
inputData: null,
}
},
methods: {
changeMessage(){
const newMessage = this.inputData
this.$store.dispatch('changeMessage', newMessage)
this.inputData = null
},
},
}
</script>
- actions의 첫번째 인자는 context
- context는 store의 전반적인 속성을 모두 가지고 있으므로 context.state와 context.getters를 통해 mutations을 호출하는 것이 모두 가능
- dispatch()를 사용해 다른 actions도 호출할 수 있음
- 단, actions에서 state를 직접 조작하는 것은 삼가야함
- actions의 두번째 인자는 payload
- 넘겨준 데이터를 받아서 사용
mutations
“actions에서 commit()을 통해 mutations 호출하기”
- mutations는 state를 변경하는 유일한 방법
- component 또는 actions에서 commit()에 의해 호출됨
- commit(A, B)
- A: 호출하고자하는 mutations 함수
- B: payload
// store/index.js
export default new Vuex.Store({
...
actions: {
changeMessage(context, message){
context.commit('CHANGE_MESSAGE', message)
},
},
...
})
“mutations 함수 작성하기”
- mutations는 state를 변경하는 유일한 방법
- mutations 함수의
- 첫번째인자는 state
- 두번째인자는 payload
// store/index.js
export defualt new Vuex.Store({
...
mutations: {
CHANGE_MESSAGE(state, message){
// console.log(state)
// console.log(message)
state.message = message
},
},
...
})
getters
- getters는 state를 활용한 새로운 변수
- getters 함수의
- 첫번째 인자는 state
- 두번째 인자는 getters
// store/index.js
export default new Vuex.Store({
...
getters: {
messageLength(state){
return state.message.length
},
doubleLength(state, getters){
return getters.messageLength * 2
},
},
...
})
// App.vue
export default{
...
computed: {
message(){
return this.$store.state.message
},
messageLength(){
return this.$store.getters.messageLength
},
doubleLength(){
return this.$store.getters.doubleLength
},
},
...
}
- getters 역시 state와 마찬가지로 computed에 정의해서 사용하는 것을 권장
// App.vue
<template>
<div id="app">
<h1>길이 {{ messageLength }}의 메시지 {{ message }}를 입력받음</h1>
<h3>x2 : {{ doubleLength }}<h3>
<input type="text" @keyup.enter="changeMessage" v-model="inputData">
</div>
</template>