vuex 是 vue 的狀態管理器, 就像redux , mobx 是react 的狀態管理器。 其實我覺得vuex 跟react 的 mobx 比較像。 Vuex 比 redux 更容易上手, 安裝也簡單。 然後也不需要middleware 處理非同步Action(saga, thunk)。這裡我不講什麼是狀態管理器, 我在介紹redux那一篇我有討論過了 連結 最後 vuex 是vue 官方的狀態管理器, 所以他會在官方調試工具(devtool), 方便我們Debug
以下是vuex的流程:
state: 一個管理我們所有應用程式的狀態,
mutations: 更改Vuex的store中的狀態的唯一方法是提交mutation
actions:Action 提交的是mutation,而不是直接變更狀態。
Action 可以包含任意異步操作。
getters: store 中定義“getter”(可以認為是store 的計算屬性)
在我的vue component 裡面我在@click 觸發addTodo action, 然後把this.inputTodo 傳到我的store addTodo action 裡面。
//App.js
...
<button @click="addTodo">Add Todo</button>
...
addTodo () {
this.$store.dispatch('addTodo', this.inputTodo)
this.inputTodo=''
}
// store.js
// 我的state存放我的todo object
export const state = {
todos: [
{
id: 1,
text: "learn vue"
},
{
id: 2,
text: "learn css"
}
]
}
//這裡有addTodo, editTodo, deleteTodo mutation, 這些可以改變state的質
export const mutations = {
addTodo (state, payload) {
state.todos.push({
id: state.todos.length+1,
text: payload
})
},
editTodo (state, payload) {
payload.todo.text = payload.value
},
deleteTodo (state, payload) {
state.todos.splice(state.todos.indexOf(payload), 1)
}
}
//這些action 決定要commit 那些 mutation, 還有傳payload(參數)進去
export const actions = {
addTodo (context, payload) {
context.commit('addTodo', payload)
},
deleteTodo (context, payload) {
context.commit('deleteTodo', payload)
},
editTodo (context, payload) {
context.commit('editTodo', payload)
}
}
//這裡是getters 就是算好的質。
export const getters = {
todos: state => state.todos
}