五分鐘學完 Redux
"Redux evolves the ideas of Flux, but avoids its complexity by taking cues from Elm. Even if you haven't used Flux or Elm, Redux only takes a few minutes to get started with." 光看 Redux 官方網站自己這樣講這段,都不覺得臉紅嗎,根本就是在反串 (笑死)
** Redux 是一套用來管理 global state 的 library,基本概念跟 Flux 類似,不過他是把你 app 中所有的 state 全部拉到一個集中的 store 來管理,再切出很多小的 store,這些就叫做 slice。所以,如果你沒有這麼多種資料需要交互管理,基本上可以不用 Redux,因為只會把事情搞得更複雜。
** 建立 Redux slice 的時候,會再另外定義 reducer,來定義說我有哪些功能,可以怎麼樣轉換 state (data)。
** Action Creator: 用來產生觸發事件用的 (trigger event), action 建立之後,丟給 useDispatch hook 回傳給你的 dispatch() 函數,就可以觸發 store 中 slice 的狀態改變。 (可以想成 Store Write 的操作。)
** Selector: 因為 store 被切成各種 slice,所以 selector 是用來取得你在元件中想要從 store 讀取的某個 slice,用法就是傳給他一個 closure,這個 closure 會拿到 root state ,你再把想要的 slice 取得之後做回傳。 (可以想成 Store Read 的操作。)
** 如果寫 Redux reducer 遇到非同步 async 機制參與,譬如說 API Request,這時就需要搭配 Redux 的 Thunk,他有點像是你把 Promise 包起來,把該做的 async 一起寫好打包。
** 但是 thunk 這類的東西沒辦法直接透過 createSlice 的 reducer 來銜接,要另外在一個 extraReducer 裡面定義。
** 為了要方便打包這些有 Promise 相關的操作,RTK 又提供了一個工具函數叫 createAsyncThunk。
** Redux 不同版本的 extraReducer 寫法又不太一樣,比較舊版的寫法 extraReducer 是一個 object,是直接寫 state => function 的對應。 新版的寫法是給他一個 closure,他會把一個 builder object 傳給你,你再利用這個 builder object 註冊你的 async thunk 處理狀態對應。
** 在 RTK 2.0 的版本中,官方提到 extraReducer asyncThunk 很詬病,因此提供了新的寫法,但我還沒研究 😂
** RTKQuery 基本上是類似 swr 的東西,用來處理 data fetching 和 data caching,但是 API 設計得很複雜,有點難用 LOL
** Redux vs Context? 其實 Redux 底層就是透過 Context Hook 的機制,只是 Context 本身是用來解決 property propogation ,但不適合 high frequency update value,而 Redux 是把 Store 放在 Context 內,避免過度頻繁去更新 context wrapper 。
好吧 好像不止五分鐘 😂