Vuex 是什么?
Vuex 是一個專為 Vue.js 應用程序開發(fā)的狀態(tài)管理模式兽赁。它采用集中式存儲管理應用的所有組件的狀態(tài),并以相應的規(guī)則保證狀態(tài)以一種可預測的方式發(fā)生變化驻粟。Vuex 也集成到 Vue 的官方調試工具devtools extension友扰,提供了諸如零配置的 time-travel 調試、狀態(tài)快照導入導出等高級調試功能赚爵。
什么是“狀態(tài)管理模式”棉胀?
讓我們從一個簡單的 Vue 計數(shù)應用開始:
new Vue({??
// state??
data () {? ??
return {? ? ??
count: 0? ??
}? },?
?// view??
template:{
{{ count }}
},??
// actions??
methods: {? ? increment () {? ? ? this.count++? ? }? }})
這個狀態(tài)自管理應用包含以下幾個部分:
state,驅動應用的數(shù)據(jù)源冀膝;
view唁奢,以聲明方式將state映射到視圖;
actions窝剖,響應在view上的用戶輸入導致的狀態(tài)變化麻掸。
以下是一個表示“單向數(shù)據(jù)流”理念的極簡示意:
但是,當我們的應用遇到多個組件共享狀態(tài)時赐纱,單向數(shù)據(jù)流的簡潔性很容易被破壞:
多個視圖依賴于同一狀態(tài)脊奋。
來自不同視圖的行為需要變更同一狀態(tài)。
對于問題一千所,傳參的方法對于多層嵌套的組件將會非常繁瑣狂魔,并且對于兄弟組件間的狀態(tài)傳遞無能為力。對于問題二淫痰,我們經(jīng)常會采用父子組件直接引用或者通過事件來變更和同步狀態(tài)的多份拷貝最楷。以上的這些模式非常脆弱,通常會導致無法維護的代碼待错。
因此籽孙,我們?yōu)槭裁床话呀M件的共享狀態(tài)抽取出來,以一個全局單例模式管理呢火俄?在這種模式下犯建,我們的組件樹構成了一個巨大的“視圖”,不管在樹的哪個位置瓜客,任何組件都能獲取狀態(tài)或者觸發(fā)行為适瓦!
另外,通過定義和隔離狀態(tài)管理中的各種概念并強制遵守一定的規(guī)則谱仪,我們的代碼將會變得更結構化且易維護玻熙。
這就是 Vuex 背后的基本思想,借鑒了Flux疯攒、Redux嗦随、和The Elm Architecture。與其他模式不同的是敬尺,Vuex 是專門為 Vue.js 設計的狀態(tài)管理庫枚尼,以利用 Vue.js 的細粒度數(shù)據(jù)響應機制來進行高效的狀態(tài)更新贴浙。
什么情況下我應該使用 Vuex?
雖然 Vuex 可以幫助我們管理共享狀態(tài)署恍,但也附帶了更多的概念和框架崎溃。這需要對短期和長期效益進行權衡。
如果您不打算開發(fā)大型單頁應用锭汛,使用 Vuex 可能是繁瑣冗余的笨奠。確實是如此——如果您的應用夠簡單袭蝗,您最好不要使用 Vuex唤殴。一個簡單的global event bus就足夠您所需了。但是到腥,如果您需要構建是一個中大型單頁應用朵逝,您很可能會考慮如何更好地在組件外部管理狀態(tài),Vuex 將會成為自然而然的選擇乡范。引用 Redux 的作者 Dan Abramov 的話說就是:
Flux 架構就像眼鏡:您自會知道什么時候需要它配名。