跳到主要内容

切片模式

将存储切分为更小的存储

随着你添加更多的功能,你的存储可能会变得越来越大,越来越难以维护。

你可以将你的主存储切分为更小的个体存储,以实现模块化。在 Zustand 中实现这一点非常简单!

第一个个体存储:

export const createFishSlice = (set) => ({
fishes: 0,
addFish: () => set((state) => ({ fishes: state.fishes + 1 })),
})

另一个个体存储:

export const createBearSlice = (set) => ({
bears: 0,
addBear: () => set((state) => ({ bears: state.bears + 1 })),
eatFish: () => set((state) => ({ fishes: state.fishes - 1 })),
})

你现在可以将这两个存储合并为一个有边界的存储

import { create } from 'zustand'
import { createBearSlice } from './bearSlice'
import { createFishSlice } from './fishSlice'

export const useBoundStore = create((...a) => ({
...createBearSlice(...a),
...createFishSlice(...a),
}))

在 React 组件中的使用

import { useBoundStore } from './stores/useBoundStore'

function App() {
const bears = useBoundStore((state) => state.bears)
const fishes = useBoundStore((state) => state.fishes)
const addBear = useBoundStore((state) => state.addBear)
return (
<div>
<h2>熊的数量:{bears}</h2>
<h2>鱼的数量:{fishes}</h2>
<button onClick={() => addBear()}>添加一只熊</button>
</div>
)
}

export default App

更新多个存储

你可以在一个函数中同时更新多个存储。

export const createBearFishSlice = (set, get) => ({
addBearAndFish: () => {
get().addBear()
get().addFish()
},
})

将所有的存储组合在一起的方式与之前相同。

import { create } from 'zustand'
import { createBearSlice } from './bearSlice'
import { createFishSlice } from './fishSlice'
import { createBearFishSlice } from './createBearFishSlice'

export const useBoundStore = create((...a) => ({
...createBearSlice(...a),
...createFishSlice(...a),
...createBearFishSlice(...a),
}))

添加中间件

向组合存储添加中间件与向其他普通存储添加中间件相同。

向我们的 useBoundStore 添加 persist 中间件:

import { create } from 'zustand'
import { createBearSlice } from './bearSlice'
import { createFishSlice } from './fishSlice'
import { persist } from 'zustand/middleware'

export const useBoundStore = create(
persist(
(...a) => ({
...createBearSlice(...a),
...createFishSlice(...a),
}),
{ name: 'bound-store' },
),
)

请记住,你应该只在组合存储中应用中间件。在个体切片内部应用它们可能会导致意外的问题。

与 TypeScript 的使用

关于如何在 Zustand 中使用 TypeScript 使用切片模式的详细指南可以在这里找到。