Vuex應不應該用作頁面組件通信?


我現在做的項目正好與題主類似,主要是不同頁面間的一些狀態共享。先說結論,我們最終選擇了vuex。

其他回答中提到了event bus,全局對象等解決方案在頁面狀態共享這個場景上還是有些局限的。

event bus:event bus很好地解決了多層嵌套,兄弟組件的通信問題。但他沒法解決一個場景:現在與未來,event bus是即時性的,只有當前存在的實例可以訂閱到響應,那未來創建的實例呢?而題主面臨的應該就是這種場景,多頁面之間,之後的頁面創建了,如何能監聽到上個頁面的事件呢。

全局對象:全局對象的確能夠做到頁面狀態的共享,但是這樣做的健壯性跟局限就比較大了。

1. 全局對象誰都可以讀,誰都可以寫,這裡的誰不僅包含了我們的代碼還包含了第三方代碼。

2. 缺乏響應式的設計。

3. 沒有對寫操作的必要處理,比如一個狀態要求是date對象,因為一個地方寫成了string,會不會對所有頁面產生副作用呢?

vuex恰恰能夠解決以上兩個方案不足的地方。

題主疑惑的應該還有什麼樣的數據應該放在vuex中,頁面狀態、頁面數據等。

local state is ok

在我們現在的實踐中,我們將「共享」的狀態與數據放在vuex中,比如某全局的列表及選擇態。

在評論中,題主將所有ajax放在vuex,將vuex作為一個model層,我還是持保留意見的。無需緩存的一些列表數據,分頁數據,校驗請求等放在vuex中不太合適。vuex雖然可以將不同業務封裝成module,但是mutation,action名卻是全局維護的,項目越來越大,維護是個比較棘手的問題。

再引申一下,可能跟題主的項目並沒有關係。我理解中的model層處理的數據不僅僅只有ajax請求,還有從localstorege取到的同步數據,web socket取到的實時數據等等,可能為了性能問題,先輪詢,再socket,再將其他ajax請求改走socket。


個人項目體驗

1.如果只是做數據渲染,不存在數據修改,組件層級再多也不必vuex

2.簡單數據結構子父組件,不是"後代"組件的交互,用emit ,不用vuex

3.用戶信息用vuex ,因為用戶的許可權,頭像,昵稱等等常常會出現在各個組件中

4.對象數組再嵌套對象數組,兄弟組件的通信用vuex

以上……


推薦閱讀:

與AMD和CommonJS相比,UMD有什麼缺點?
為什麼vue的高仿項目層出不窮,而React和angular卻很少?
評價一下《Vue.js 權威指南》這本書?
如何評價大漠窮秋的文章《為什麼只會Vue的都是前端小白?》?
什麼叫組件化開發?

TAG:前端開發 | Vuejs | Vuex |