Vuex是Vue.js的狀態管理庫,主要使用于大型單頁應用程序(SPA)。Vuex可以將所有組件的狀態集中在一個地方進行管理,使得應用程序的整個狀態變得非常清晰、易于理解。在Vuex中,我們不需要通過事件或傳遞 props 來同步不同組件狀態。這種狀態集中的管理方式大大提高了應用程序的可維護性和可重用性。
Vuex是由五個基本原則組成的:
1. State(狀態):單一狀態樹,一個對象包含全部應用層級的狀態。整個應用的狀態存儲在一個單一的對象中。
2. Getters(讀取器):通過getters獲取state數據,并進行一些派生數據。getters就像是 store 的計算屬性,我們可以將 store 中的數據通過它進行處理之后再返回給我們,根據使用場景有時候我們需要把數據處理之后再做一個展示或者操作。
3. Mutations(變更):用于修改 State 中的數據。只提供同步修改 State 的方法。
4. Actions(動作):類似于Mutation,但是Action可以包含異步操作。Action與Mutation之間的區別就在于Mutation是用來修改狀態的,而Action是用來處理業務邏輯的。
5. Modules(模塊):模塊將一個 Store 分離成多個子模塊,每個模塊都擁有自己的 State、Getters、Mutations、Actions 和子模塊。
使用這些原則,我們可以設計出一個非常好的狀態管理系統。下面我們分別對Vuex的State、Getters、Mutations、Actions和Modules進行詳細講解。
State(狀態)
狀態是存儲在Vuex中的數據。這些數據被存儲在單一的狀態樹中,可以從應用程序的任何地方訪問。可以看下面這個例子:
```
const store = new Vuex.Store({
state: {
count: 0
}
})
```
在這個例子中,我們創建了一個名為`store`的 Vuex Store。在創建 Store 的同時,我們定義了一個 State 對象。State 對象中只有一個屬性,這個屬性名稱為`count`,它的初始值為 0。這個`count`屬性將會存儲在整個應用程序中,我們可以在程序的任何地方訪問它。
Getters(讀取器)
Getter 非常適合處理那些有著計算后的屬性,并不需要修改 State 中的值。下面這個示例讓我們看到了如何使用 Getter 來處理 State 中的數據。
```
const store = new Vuex.Store({
state: {
todoList: [
{id: 1, text: 'Hello', done: true},
{id: 2, text: 'Vue', done: false},
{id: 3, text: 'Vuex', done: false},
]
},
getters: {
doneTodoList: state => {
return state.todoList.filter(todo => todo.done)
}
}
})
```
在這個例子中,我們定義了一個名為`doneTodoList`的 Getter。這個 Getter 是一個函數,它會返回過濾后的`todoList`數組(只包含`done`屬性為 true 的項)。我們可以在組件中使用`mapGetters`輔助函數來訪問 Getter 。
Mutations(變更)
Mutation 用于修改 State 中的數據。Mutation 可以在 Store 對象中定義,類似于這樣:
```
const store = new Vuex.Store({
state: {
count: 0
},
mutations: {
increment (state) {
state.count++
}
}
})
```
在這個例子中,我們定義一個名為`increment`的 Mutation。這個 Mutation 會將 State 中的`count`屬性加 1。我們可以在組件中通過`this.$store.commit('increment')`調用這個 Mutation。
Actions(動作)
Action 類似于 Mutation,主要的目的是處理異步請求。Action 對象可以在 Store 對象中定義,類似于 Mutation。下面是一個使用 Action 的例子:
```
const store = new Vuex.Store({
state: {
count: 0
},
mutations: {
increment (state) {
state.count++
}
},
actions: {
increment ({ commit }) {
setTimeout(() => {
commit('increment')
}, 1000)
}
}
})
```
在這個例子中,我們定義了一個名為`increment`的 Action。這個 Action 會在 1 秒之后調用`increment` Mutation。我們可以在組件中通過`this.$store.dispatch('increment')`來調用這個 Action。
Modules(模塊)
對于大型的應用程序而言,單一的 State 對象可能會變得難以維護。為了解決這個問題,Vuex 提供了一個模塊系統。可以將State的數據分散到不同的模塊中,每個模塊負責管理它自己的State、Getters、Mutations、Actions 和子模塊。
這里是一個模塊的示例:
```
const moduleA = {
state: { ... },
mutations: { ... },
actions: { ... },
getters: { ... }
}
const moduleB = {
state: { ... },
mutations: { ... },
actions: { ... }
}
const store = new Vuex.Store({
modules: {
a: moduleA,
b: moduleB
}
})
```
在這個例子中,我們定義了兩個模塊,名為 `moduleA`和`moduleB`。我們通過`new Vuex.Store()`語句來創建了一個 Vuex Store。在創建 Store 對象的時候,我們將模塊分別存儲在 Store 的`modules`屬性中。
總結
在Vue.js兩個核心概念:組件和響應式數據,是為解決單頁應用中數據流管理和組件復用而設計的。而Vuex則是為了管理全局狀態而設計的。Vuex的State、Getters、Mutations、Actions和Modules五個基本原則,可以讓應用的狀態管理變得非常清晰、易于理解,大大提高應用程序的可維護性和可重用性。