曾幾何時,你有沒有對元件中資料調用感到困擾呢?
同階層的元件資料傳遞,需要使用 Event Bus
,確實滿不好管理的。
或是相同的資料,需要在很多元件中去做變動時,變動到自己腦子都花了。
如果有一個資料庫,可以統一讓我們去做管理這些資料,該有多好?
就在這時候,Vuex
來了!聽說他可以解決我們的問題,讓我們來一起看看吧!
此張圖片取自官網,若我們可以先看懂這張圖片,便能理解Vuex資料狀態管理模式了。
可以看到圖片中多了幾個陌生的單字,是我們在Vue中沒有使用過的,別擔心,我們一一研究吧!
我們平常使用的 Vue
跟 Vuex
其實有很多相似之處,畢竟是同一個生態系的,所以我做一個對照圖讓大家比較好聯想。Vuex
就像把 Vue
資料處理的部分單獨拿出來,獨立成資料處理威力加強版。
我們可以先當作有一個專門放資料的元件,叫做 store
,也可以把它當成 Event Bus plus
。
那在這個 store
當中,我們一樣可以建立 data
放資料,建立 methods
放置方法用來處理資料,建立 computed
計算屬性,只是一切都換了個名字,而且變得更嚴謹了一些。
跟 Vue
元件的 data
有87%相像,就是拿來放資料的地方,沒有錯啦!
只是 Vuex
使用單一狀態樹,什麼意思?簡單說,就是所有元件都共用這筆資料,資料都是唯一的。
如何建立 state
呢? 那我們就先來創造一個 store
看看吧!
先建立一個 store
資料夾,在其中新增 index.js
檔案,我們的第一個 store
就建立完成囉!
之後我們可以開始建立資料了,像這樣:
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
count: 0
}
})
這樣我們就擁有了第一筆名為 count
的資料,他目前的值為0。
那我們要怎麼修改這筆資料呢?
就需要使用 mutation
囉!
這邊就是 Vue
跟 Vuex
比較不同的地方了,只要想更動資料,就是需要使用 mutation
裡面的方法才可以唷!
export default new Vuex.Store({
state: {
count: 0
},
mutations: {
increment (state) {
state.count++
}
}
})
像這樣我們就在 mutation
裡面新增了我們第一個更改資料的方法了。increment (state)
,可以看到我們將 state
傳入,便是傳入我們實際要更改資料值的地方。
除了 state
之外,我們也可以傳入其他參數,比如說:
// ...
mutations: {
increment (state, n) {
state.count += n
}
}
像這樣,就可以傳入我們要增加多少數量,並透過此方法做資料的更改,而這第二個參數就叫載荷(Payload)。
剛剛我們有了第一筆資料,也擁有了一個更動資料的方法,那我們到底要怎麼在元件中使用呢?
首先我們必須在 main.js
啟用 Vuex
,並 import
我們剛剛創立的 store
import Vue from 'vue'
import Vuex from 'vuex'
import store from './store'
告訴 Vue
,我們要使用這個 store
的資料
new Vue({
el: '#app',
store: store,
})
我們可以在 computed
使用 this.$store.state
用以取得放在 store.state
的資料
computed: {
count () {
return this.$store.state.count
}
也可以透過 commit
使用我們剛剛設定在 mutations
的方法,修改 state
資料
methods: {
increment() {
this.$store.commit('increment')
}
}
以上是簡單的 Vuex
入門,讓我們先大概理解 State
、 Mutation
是做什麼的
只是以上的範例,也並不完全是正確用法,我們可以發現目前的使用配置並不符合官方提供的 Vuex
狀態圖片Vue
的元件應該透過 Action
去修改 Store
的資料,而不是直接使用 commit()
那到底要怎麼做呢?明天我們繼續研究!