$ vue create vuex-app // vue 프로젝트 생성
$ cd vuex-app // 디렉토리 이동
$ vue add vuex // Vue CLI를 통해 vuex plugin 적용
vsc의 bash에서 위의 명령어로 Vue 프로젝트를 생성하고 Vuex를 추가하면, 아래와 같은 경고문이 나온다.

yes를 선택하고 진행해도 무방하다.

src/store/index.js가 vuex instance를 정의하는 곳이다.
// vuex instance 구조
export default new Vuex.Store({
// 1. state
state: {
},
// 2. getters
getters: {
},
// 3. mutations
mutations: {
},
// 4. actions
actions: {
},
modules: {
},
})
중앙 저장소에서 관리하는 모든 상태 정보
$store.state로 state에 접근하여 계산된 속성을 정의 후 사용 (권장방법)// src/store/index.js
export default new Vuex.Store({
state: {
message: 'message in store'
},
...
})
// app.vue
<template>
<div id="app">
<h1>{{ $store.state.message }}</h1>
</div>
</template>
// src/store/index.js
export default new Vuex.Store({
state: {
message: 'message in store'
},
...
})
// app.vue
<template>
<div id="app">
<h1>{{ message }}</h1>
</div>
</template>
<script>
export default {
...
computed: {
message() {
return this.$store.state.message
}
}
}
</script>
// 예시1
const store = new Vuex.Store({
state: {
todos: [
{ id: 1, text: '...', done: true },
{ id: 2, text: '...', done: false }
]
},
getters: {
// state를 첫번째 인자로 받는다.
doneTodos: state => {
return state.todos.filter(todo => todo.done)
}
}
})
// 예시2
getters: {
// 두번째 인자로 getters를 받는다.
doneTodosCount: (state, getters) => {
return getters.doneTodos.length
}
}
// store/index.js
getters: {
// ...
doneTodosCount: (state, getters) => {
return getters.doneTodos.length
}
}
// 컴포넌트에서 값에 접근
computed: {
doneTodosCount () {
return this.$store.getters.doneTodosCount
}
}
// store/index.js
getters: {
// ...
getTodoById: (state) => (id) => {
return state.todos.find(todo => todo.id === id)
}
}
store.getters.getTodoById(2) // -> { id: 2, text: '...', done: false }
store.commit을 호출store.commit에 payload를 추가 전달인자를 사용할 수 있다.
// ...
mutations: {
// 두번째 인자 n이 payload를 받는 매개변수
increment (state, n) {
state.count += n
}
}
// payload를 10으로 보내고 있다.
store.commit('increment', 10)
payload는 여러 필드를 포함하는 객체로 보낼 수 있다.
// ...
mutations: {
increment (state, payload) {
state.count += payload.amount
}
}
store.commit('increment', {
amount: 10
})
// mutation-types.js
export const SOME_MUTATION = 'SOME_MUTATION'
// store.js
import Vuex from 'vuex'
import { SOME_MUTATION } from './mutation-types'
const store = new Vuex.Store({
state: { ... },
mutations: {
// ES2015에서 계산 된 프로퍼티 이름 기능을 사용하여
// 상수를 함수 이름으로 사용할 수 있습니다
[SOME_MUTATION] (state) {
// 변이 상태
}
}
})
actions가 mutations와 다른 점은 아래와 같다.
const store = new Vuex.Store({
state: {
count: 0
},
mutations: {
increment (state) {
state.count++
}
},
actions: {
increment (context) {
context.commit('increment')
}
}
})
context 객체는 store 인스턴스의 모든 메소드와 프로퍼티를 가지고 있는 객체이다.
context.commit : mutations를 커밋context.state : state에 접근context.getters : getters에 접근store.dispatch 메소드를 통해 호출dispatch(A, B)store.dispatch('increment')
payload로 함께 dispatch로 액션을 사용할 수 있다.
// 페이로드와 함께 디스패치
store.dispatch('incrementAsync', {
amount: 10
})
// 객체와 함께 디스패치
store.dispatch({
type: 'incrementAsync',
amount: 10
})
this.$store.dispatch('actions-name')을 사용하여 컴포넌트에서 액션을 호출
// App.vue
<template>
<div>
<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)
}
}
}
</script>
// store/index.js
export default new Vuex.Store({
...
actions: {
changeMessage(context, message) {
// context, message(payload) 사용
},
}
})