精读《zustand 源码》

本文详述了zustand的状态管理库,包括创建store、访问store、细粒度memo、set合并与覆盖、异步操作以及监听指定变量等功能。文章通过源码分析,展示了zustand如何利用React语法实现数据流管理,并探讨了其实现的简洁性和正交性。此外,还介绍了关键API的实现细节,如create函数和context的运用。
摘要由CSDN通过智能技术生成

zustand 是一个非常时髦的状态管理库,也是 2021 年 Star 增长最快的 React 状态管理库。它的理念非常函数式,API 设计的很优雅,值得学习。

概述

首先介绍 zustand 的使用方法。

创建 store

通过 create 函数创建 store,回调可拿到 get set 就类似 Redux 的 getStatesetState,可以获取 store 瞬时值与修改 store。返回一个 hook 可以在 React 组件中访问 store。

import create from 'zustand'

const useStore = create((set, get) => ({
  bears: 0,
  increasePopulation: () => set(state => ({ bears: state.bears + 1 })),
  removeAllBears: () => set({ bears: 0 })
}))

上面例子是全局唯一的 store,也可以通过 createContext 方式创建多实例 store,结合 Provider 使用:

import create from 'zustand'
import createContext from 'zustand/context'

const { Provider, useStore } = createContext()

const createStore = () => create(...)

const App = () => (
  <Provider createStore={createStore}>
    ...
  </Provider>
)

访问 store

通过 useStore 在组件中访问 store。与 redux 不同的是,无论普通数据还是函数都可以存在 store 里,且函数也通过 selector 语法获取。因为函数引用不可变,所以实际上下面第二个例子不会引发重渲染:

function BearCounter() {
  const bears = useStore(state => state.bears)
  return <h1>{bears} around here ...</h1>
}

function Controls() {
  const increasePopulation = useStore(state => state.increasePopulation)
  return <button onClick={increasePopulation}>one up</button>
}

如果嫌访问变量需要调用多次 useStore 麻烦,可以自定义 compare 函数返回一个对象:

const { nuts, honey } = useStore(state => ({ nuts: state.nuts, honey: state.honey }), shallow)

细粒度 memo

利用 useCallback 甚至可以跳过普通 compare,而仅关心外部 id 值的变化,如:

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

原理是 id 变化时,useCallback 返回值才会变化,而 useCallback 返回值如果不变,useStore 的 compare 函数引用对比就会为 true,非常巧妙。

set 合并与覆盖

set 函数第二个参数默认为 false,即合并值而非覆盖整个 store,所以可以利用这个特性清空 store:

const useStore = create(set => ({
  salmon: 1,
  tuna: 2,
  deleteEverything: () => set({ }, true), // clears the entire store, actions included
}))

异步

所有函数都支持异步,因为修改 store 并不依赖返回值,而是调

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值