$ vue create vuex-app // Vue 프로젝트 생성
$ cd vuex-app // 디렉토리 이동
$ vue add vuex // Vue CLI를 통해 vuex plugin 적용
// index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
},
getters: {
},
mutations: {
},
actions: {
},
modules: {
}
})
$store.state
로 state 데이터에 접근동기적
이어야 함state
를 받으며, component 혹은 Actions에서 commit()
메서드로 호출됨비동기
작업을 포함할 수 있다는 차이가 있음commit()
메서드로 mutations를 호출해서 state를 변경함context
객체를 인자로 받으며, 이 객체를 통해 store.js의 모든 요소와 메서드에 접근할 수 있음 (== 즉 state를 직접 변경할 수 있지만 하지 않아야 함)state
, 두번째 인자로 getter
를 받음모든 상태 정보
state
를 변경하기 위한 methods비동기 작업이 포함될 수 있는(외부 API 와의 소통 등)
methods새로운 변수 값
// before
const obj1 = {
addValue: function (value) {
return value
},
}
// after
const obj2 = { addValue(value) {
return value
},
}
$store.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>
computed
에 정의 후 접근하는 것을 권장// App.vue
<template>
<div id="app">
<h1>{{ message }}</h1>
</div>
</template>
<script>
export default {
name: 'App',
computed: {
message() {
return this.$store.state.message
},
},
}
</script>
dispatch(A, B)
dispatch()
에 의해 호출됨// App.vue
<template>
<div id="app">
<h1>{{ message }}</h1>
<input type="text" @keyup.enter="changeMessage" v-model="inputData">
</div>
</template>
<script>
export default {
name: 'App',
data() {
return {
inputData: null,
}
},
methods: {
changeMessage() {
const newMessage = this.inputData
this.$store.dispatch('changeMessage', newMessage)
this.inputData = null
},
},
}
</script>
context
// store/index.js
export default new Vuex.Store({
...
actions: {
changeMessage(context, message) {
console.log(context)
console.log(message)
}
},
...
})
actions에서 commit()을 통해 mutations 호출하기
commit()
에 의해 호출됨commit(A, B)
// store/index.js
export default new Vuex.Store({
...
actions: {
changeMessage(context, message) {
context.commit('CHANGE_MESSAGE', message)
}
},
...
})
mutations 함수 작성하기
state
두 번째 인자는 payload
// store/index.js
export default new Vuex.Store({
...
mutations: {
CHANGE_MESSAGE(state, payload) {
// console.log(state)
// console.log(message)
state.message = payload
}
},
...
})
getters 사용해 보기
state
두 번째 인자는 getters
// store/index.js
export default new Vuex.Store({
...
getters: {
messageLength(state) {
return state.message.length
},
},
...
})
getters의 다른 함수 사용해 보기
// store/index.js
export default new Vuex.Store({
...
getters: {
messageLength(state) {
return state.message.length
},
// messageLength를 이용해서 새로운 값을 계산
doubleLength(state, getters) {
return getters.messageLength * 2
}
},
...
})
getters 출력하기
// App.vue
<template>
<div id="app">
<h1>{{ message }}의 길이는 {{ messageLength }}</h1>
<h2>X2 : {{ doubleLength }}</h2>
<input type="text" @keyup.enter="changeMessage" v-model="inputData">
</div>
</template>
<script>
export default {
...
computed: {
message() {
return this.$store.state.message
},
messageLength() {
return this.$store.getters.messageLength
},
doubleLength() {
return this.$store.getters.doubleLength
}
}
}
</script>
https://github.com/mjieun0956/TIL/tree/master/Vue/08.%20Vuex