Angular
NGXS
本篇主要是認識 NGXS 這套狀態管理工具,瞭解基本概念,以及和 NGRX 使用上的差異。
a. 透過 npm 安裝 @ngxs/store 套件
b. 在 app.module.ts
引入 NgxsModule
NGXS 包含四個概念,以下是官網介紹:
ng g class <<state file name>>
指令產生 ts 檔案
ng g class todos.state
,Class 名稱會是 TodosState
todos.state.ts
:建立完 state 之後,再到 app.module.ts
的 NgxsModule.forRoot([])
引入 State:
addTodo(StateContenxt<T>, ActionClass? )
StateContenxt<T>
:取得可操作此 state 的 context 物件,內建幾種方法:
getState(): T
:取得目前 state 的值setState(val: T)
:重新建立 or 重設目前 state 的值patchState(val: part<T>)
:更新目前 state 的值dispatch([actions])
:觸發一或多個 actions,可傳入陣列todos.state.ts
:store.dispatch(new AddTodo('title'))
方法,執行對應的 Action 和取得資料app.component.ts
@Select
:如上方範例,可透過 path 訂閱指定 state,其資料型態為 Observable
@Select
裝飾器,也可改寫成 store.select()
語法,如下:建立一個簡易的 Todo List 模板:
app.component.html
透過 store.dispatch([actions])
可執行一至多個 actions,回傳值為 Observable:
app.component.ts
根據上方程式碼,可參考範例:https://angular-ivy-tbbm1b.stackblitz.io
總結使用 Ngxs 步驟如下:
@Select
訂閱指定狀態store.dispatch()
方法執行 action自己在過去專案中並沒有使用過 NGXS 來管理狀態,剛好最近接手的案子有碰到,才趁著機會研究前人撰寫的程式碼邏輯。
和 React 組件分層設計,須仰賴 Redux 狀態管理不同;Angualr 本身內建的 Service 概念,搭配 RxJS 使用,其實就能應對較複雜的狀態管理。再透過引入使用 NGXS ,更能有效簡化程式碼,以便後續維護。