vue3輕量級狀態(nf-state)的設計思路和使用思路

前情回顧

告別Vuex,發揮compositionAPI的優勢,打造Vue3專用的輕量級狀態

製作一個輕量級的狀態管理外掛:Vue-data-state

原始碼

https://gitee。com/naturefw/vue-data-state

線上演示

https://naturefw。gitee。io/vite2-vue3-demo/

安裝

npm i nf-stateoryarn add nf-state

技術棧

vue3

compositionAPI

不支援vue2、TypeScript、vue-devTools

特點

輕量級:全部原始碼只有一百行左右。

簡單方便:相當於大號 reactive 的使用方式。

可以跟蹤狀態:記錄日誌,程式碼定位,監聽,外掛,初始化

其他

和 Vuex、pinia 做一下比較

有網友問我,和Vuex4、Vuex5(預覽版)、pinia的區別。

之前一直研究Vuex4和實現自己的想法,Vuex5只是聽說還不知道啥樣的,pinia也沒有留意。

但是問到了,那麼就需要去了解一下,順便學習一下先進經驗。

網上找了一下,資料比較少,只有一個對比介紹,B站還有一個影片介紹,看了之後確實有所收穫。

我想最大的區別就是設計思路的區別吧。

Vuex4:我的我的全是我的,getter、mutation、action、module等都要做到Vuex的內部。

Vuex5:不要那麼多了,只留下mutation、action即可,其他的自行處理。(如果理解有誤,還請多多批評)

pinia:輕量級(打包後1KB)、靈活註冊,也不要那麼多,留幾個主要的即可。(同上)

nf-state:借鑑MVC的思路,狀態管理本身只負責狀態和跟蹤,其他的操作交給controller處理,不用包括在狀態管理內部。元件可以直接獲取狀態,也可以透過controller來操作狀態。

nf-state 的設計思路

vue3輕量級狀態(nf-state)的設計思路和使用思路

狀態管理負責的

狀態管理本身,只負責狀態的註冊和跟蹤,其他的操作都交給controller,controller可以按照模組或者功能點來劃分,這樣更易於維護。

狀態的分類

按使用範圍劃分:

全域性狀態

區域性狀態

按特點劃分:

普通狀態:直接使用reactive

只讀狀態:readonly套reactive

跟蹤狀態:proxy套reactive

如何實現跟蹤

使用proxy的set,對狀態的修改進行攔截,這樣就可以實現記錄狀態變化的日誌、監聽/攔截狀態的變化、設定鉤子實現外掛、持久化等功能,最後可以定位到改變狀態的程式碼的位置(元件名稱、函式名稱、程式碼行列數、修改時間等)

controller負責的

controller 實現狀態的具體操作方式,比如使用者狀態需要的使用者登入、使用者退出等具體的操作。

相當於把 Vuex 的getter、action、module拿出來單獨處理,利用 compositionAPI 的靈活性,更便於維護和複用。

元件負責的

元件的模板:在模板裡面可以直接使用```$state。xxx```來讀取狀態

程式碼:程式碼裡可以透過 import 的方式引入狀態,然後可以直接讀取狀態。

如果是簡單情況,可以直接修改狀態;

如果是複雜情況,可以透過controller來操作狀態。

因為狀態管理內部,可以使用proxy的set對狀態的改變進行跟蹤,也可以設定監聽和鉤子,想當然自帶mutation功能,所以我們可以不必透過mutation的方式來修改狀態。