如何有效率地管理 React 局部狀態? 這次我選擇了 Zustand!
前情提要:
目前公司前端的 code base 使用 React,並採用Redux來管理應用程式層級的全局狀態,而各個頁面的 component 則單純使用 props 來傳遞資料。最近公司要改寫產品的其中一個頁面,並且提供新的功能。由於我們的前端 code base 一直以來都缺乏維護,其中包含一些難以閱讀且難以刪除的 legacy code,這次我們正好有機會局部重寫並重新規劃前端的資料傳遞邏輯架構。
一直以來我們的 component 都是用 props 來傳遞資料,有一些功能比較複雜的頁面元件,component tree 的深度可能達到十幾層,這使得這類型的複雜 元件的 props drilling 問題非常嚴重,不僅非常難以追蹤程式碼,也有嚴重的 re-render 問題。因此,當我接到這個任務時,我研究了一下我們目前的需求以及 React 生態系中的狀態管理工具,最終我選擇使用Zustand來管理這個頁面的局部狀態。
為何選擇使用 Zustand ?
需求: Component 層級的狀態管理
過去我習慣用 React 原生的 useContext hook 集中管理大component 的 state,來讓比較深層的 children components 直接呼叫 hook 來取得需要的 state。useContext 的好處就是非常簡單易學易用,同時又能解決 props drilling 的問題,但是 useContext 最令人可惜的點就在於,當任何一個 context 內的 state 被更新,所有使用到 useContext 的 components 都會被重新渲染,依然沒辦法有效避免 re-render 的問題。
前面提到,目前我們使用 Redux 來管理全局狀態,我們主要拿 redux 來管理像是 User 資訊、各頁面資訊等應用程式層級的資訊。redux 隨然能夠解決上述的 props drilling 和 re-render 問題,但是把某一個頁面的某一個 component 的 "局部狀態" 放於 "