2021年520前夕。近一年來主要都在作業務,不過對不斷提高Coding質量與速度的追求和思考一直沒停過。機緣巧合之下,有幸着重花時間完善了一套穩定、易用的狀態管理方案。html
---被舉報分割線---
我去,頭一回被舉報?打廣告?這,[無奈] 那就優化一版。
---被舉報分割線---vue
歡迎Star和訂閱 個人博客。
做者在工做歷程中,由最初用redux,而後到用vuex,再到實驗mobx、dva、react hooks甚至是自研工具,最後迴歸redux。react
在此期間,一直在探尋簡單易用,而且有完整類型提示的方案。就是當咱們輸入一兩個關鍵字,IDE自動彈出模型對應dispatch方法,再輸入空字符串'',自動提示可能要調用的方法等。平常要寫太多狀態管理代碼,徹底不必敲不少重複內容。git
那麼從新寫一個狀態管理庫?github
redux已經很好用,只是代碼略微繁瑣,爲什麼要從新寫?基於redux封裝是否可行?vuex
那是否要集成其餘路由、模塊化加載和網絡請求等模塊,讓用戶經過這個工具作大多數事?typescript
這實際上是不少集成式框架作的事。但狀態管理自己就是單獨一個模塊,不必和其餘模塊耦合在一塊兒。模塊化對於項目將來局部升級和改造要遠方便於集成式。redux
既然講到了類型推導提示,那麼是否只有TypeScript項目才能完美支持?微信
固然不少類型都是藉助TypeScript定義,但現在利用JSDoc註釋類型寫法也能讓JS項目支持類型提示和推導。網絡
是否能兼容已有項目?
只要遵循相應規則,正常狀況下都能兼容。
如今的狀態管理方案概念是:
model
管理狀態state
和更新狀態方法methods
使用狀態模型的好處是既能夠集中式管理狀態,同時可以讓不一樣組件實現跨組件共用狀態。
同時,每個狀態模型的經常使用方法可在該模型暴露,以供外界使用。
state
和更新狀態方法methods
簡化模型的構成元素,只須要狀態和更新狀態方法。更新狀態方法用於處理複雜狀態更新,也就是所謂的反作用。
{ name: 'counter', state: { count: 0 }, methods: { add({ state, update }, number) { update({ count: state.count + number }) } async delayAdd({ dispatch }, duration, number) { await new Promise(resolve => setTimeout( () => resolve(), duration )) dispatch('add', 1) } async run({ state, dispatch, getState }) { console.log('current count', state.count) await dispatch('delayAdd', 1000, 1) console.log('count after update', getState().count) } } }
而直接更新某個狀態只需經過方案庫暴露一個特有更新方法便可。好比:
updateModel('counter', { count: 100 })
這個過重要了,極大加快研發效率。
代碼實現地址:
Tredux:https://github.com/tredux-org...
項目只是給個參考,最重要的是這套狀態管理方案概念(代碼層面能夠有各類實現)。
其實封裝難度並不大,最難的是如何讓它在最簡單的用法下,可以覆蓋平常業務開發場景。
若是各位大佬以爲這套方案還能夠,想用到本身項目甚至是公司項目中,但又不太放心依賴外部庫,大能夠將源碼(一個TS文件)放到項目中單獨引用。
現有方案已在業務項目中穩定運行,歡迎各位試用。
固然,這一套簡單的狀態管理方案只是拋磚引玉,也但願市場上能涌現出更多輕量易用的解決方案,讓狀態管理更輕鬆。
感謝你花時間閱讀這篇文章。若是你喜歡這篇文章,歡迎點贊、收藏和分享,讓更多的人看到這篇文章,這也是對我最大的鼓勵和支持!
歡迎經過微信(搜索「蘇溪雲的博客」或者掃描下方二維碼)或Github訂閱個人博客。