一. 基本介绍

Zustand 是 2021 年Star 增长最快的 React 状态管理库,最近同事强烈安利并在项目中使用,本文是一篇学习稿。
image.png

二. 使用方式

安装方式很简单:

  1. npm install zustand # or yarn add zustand

基本使用方式如下,首先我们创建一个 store,zustand 会导出 create 函数,通过创建函数你可以创建一个 store并返回一个 hook,函数参数 set可以用于设置状态。

  1. import create from 'zustand'
  2. const useStore = create(set => ({
  3. bears: 0,
  4. increasePopulation: () => set(state => ({ bears: state.bears + 1 })),
  5. removeAllBears: () => set({ bears: 0 })
  6. }))

之后你可以绑定自己的组件,使用这些状态以及状态管理函数,注意你不需要包裹 Store Provider。

  1. function BearCounter() {
  2. const bears = useStore(state => state.bears)
  3. return <h1>{bears} around here ...</h1>
  4. }
  5. function Controls() {
  6. const increasePopulation = useStore(state => state.increasePopulation)
  7. return <button onClick={increasePopulation}>one up</button>
  8. }

三. 特点

1. 小巧

Zustand 是一个非常小巧的状态管理库,Bundle Size 只有 945 B 。
image.png

2. 无需 Provider

3. Makes hooks the primary means of consuming state

让 hooks 回归消费状态的基础意义。

四. Seletors 选择器

你可以传入选择器来获取 Store 中的切片数据,如果依赖上下文的话,你可以用 useCallback 来保存选择器,避免重复计算,优化性能。

  1. const fruit = useStore(useCallback(state => state.fruits[id], [id]))

如果选择器和上下文无关,你可以另外存储这个选择器。

  1. const selector = state => state.berries
  2. function Component() {
  3. const berries = useStore(selector)

五. 覆盖状态

set函数默认执行合并操作,第二个参数设置为 true ,可以执行替换操作,替换数仓中的值。

  1. import omit from "lodash-es/omit"
  2. const useStore = create(set => ({
  3. salmon: 1,
  4. tuna: 2,
  5. deleteEverything: () => set({ }, true), // clears the entire store, actions included
  6. deleteTuna: () => set(state => omit(state, ['tuna']), true)
  7. }))

六. 在 action 中获取 state 的值

set 支持传入函数更新,第一个参数是 state,除此之外你还可以通过 get方法获取状态。

  1. const useStore = create((set, get) => ({
  2. sound: "grunt",
  3. action: () => {
  4. const sound = get().sound
  5. // ...
  6. }
  7. })

七. 结合 Redux devtools