狀態管理
Context / Zustand / Redux Toolkit
推薦Zustand
寫起來簡短,也不用費工夫用 Provider 包起來。如果是不常改變的值,不必安裝函式庫,用 Context 就夠了
比較程式碼
修改程式碼,右邊的預覽會跟著變化。
import { createContext, useContext, useState } from "react"
import { CartHeader, ProductRow, Shell } from "./ui"
const CartContext = createContext({ count: 0, add: () => {} })
function Header() {
const { count } = useContext(CartContext)
return <CartHeader count={count} />
}
function Product({ name }: { name: string }) {
const { add } = useContext(CartContext)
return <ProductRow name={name} onAdd={add} />
}
export default function App() {
const [count, setCount] = useState(0)
const add = () => setCount(count + 1)
return (
<CartContext.Provider value={{ count, add }}>
<Shell>
<Header />
<Product name="商品 A" />
<Product name="商品 B" />
</Shell>
</CartContext.Provider>
)
}特色
React 內建。用 Provider 包住元件來分送值,再用 useContext 讀取。值一改變,所有讀取它的地方都會重新渲染
適用情境
共享不常改變的值,例如目前登入的使用者或深色模式設定
特色
目前很受歡迎的函式庫。用 create 把值和修改它的方法集中在一處,在任何地方都能使用。不需要 Provider,程式碼也很簡短
適用情境
推薦。共享經常改變的值,例如購物車裡的商品
特色
讓歷史悠久的 Redux 能寫得更簡短的工具。規則比較多,所以即使多人一起開發,寫法也能保持一致
適用情境
維護公司裡已經在使用 Redux 的程式碼。多人一起開發大型應用程式