咱們平時開發的大部分項目,因爲複雜度不夠, 不多使用 Vuex、Redux 等狀態管理庫,就算引入了 Vuex 這些庫,也只是看成一個全局數據引用,並不是對應用狀態進行管理。javascript
但一旦頁面的複雜度比較高,必然要引入狀態管理,今天就聊聊我理解中的狀態管理。vue
若是涉及到舉例,因爲我對Vuex
更熟悉,團隊內也大多比較熟悉Vue
,所以會使用Vuex
做例子。java
舉例幾個須要用 Vuex 的例子:測試
// Page.vue <page> <component-a /> <component-b /> </page>
// ComponentA.vue <div> <component-a-child /> </div>
好比這個例子中,<component-a-child />
想和<component-b />
通訊,使用事件傳遞來解決很是麻煩。spa
固然也可使用 EventBus,加一個全局的 vue 實例解決,但用 EventBus 還須要去關心事件的綁定解綁,須要手動處理事件,當這類組件,就會變得很是麻煩。設計
最好的解決辦法就是抽象出通用的組件狀態,放到 state 裏面,接着經過 action/mutation 改變通用狀態,而須要這些狀態的組件則本身調用(mapState/mapGetter),不須要去關注組件之間的關係。code
// Page.vue <page> <topic-list :list="list" :activity="activity" :user="user" /> </page>
// TopicList.vue <div> <topic-header :list="list" :activity="activity" :user="user" /> <template v-for="item in list"> <topic :list="list" :data="item" :activity="activity" :user="user" /> </template> </divt
這個例子裏:list="list" :activity="activity" :user="user"
在被不斷的傳遞,實際裏面的組件可能只須要裏面的一兩個屬性。component
固然,例子裏面的代碼比較簡單,也能夠經過合理的組件設計來解決。事件
但一旦碰到這種某幾個狀態數據不斷被其子組件以及後代組件使用的情況,能夠考慮使用狀態管理來解耦,可能使代碼更加簡潔。ip
之前是:
如今是:
最主要是因爲解決使得單個組件複雜度的提高,但相比總體複雜度的下降以及更高的可維護性,這點代價是徹底值得。