zustand-injectors
Version:
A sweet way of lazy load slices
146 lines (115 loc) • 3.4 kB
Markdown
[](https://github.com/zustandjs/zustand-injectors/actions?query=workflow%3ACI)
[](https://www.npmjs.com/package/zustand-injectors)
[](https://bundlephobia.com/result?p=zustand-injectors)
[](https://discord.gg/MrQdmzd)
A sweet way to lazy load slices
## Install
```bash
npm i zustand zustand-injectors
```
## Usage
**Auto lazy load slices**
```tsx
// src/create-decrement-slice.ts
import type { StateCreator } from "zustand";
import type { CounterStore } from "./counter-store";
export const createDecrementSlice: StateCreator<
CounterStore,
[],
[],
{ decrementCount: () => void }
> = (set) => ({
decrementCount: () => {
set((currentState) => ({ count: currentState.count - 1 }));
},
});
```
```tsx
// src/counter-store.ts
import { createStore } from "zustand";
import { injectors } from "zustand-injectors";
export type CounterState = { count: number };
export type CounterActions = {
incrementCount: () => void;
decrementCount: () => void;
};
export type CounterStore = CounterState & CounterActions;
export const counterStore = createStore<CounterStore>()(
injectors(
(set) => ({
count: 0,
incrementCount: () => {
set((currentState) => ({ count: currentState.count + 1 }));
},
decrementCount: () => {},
}),
{
"decrement-slice": () =>
import("./create-decrement-slice").then(
(mod) => mod.createDecrementSlice
),
}
)
);
```
```tsx
// main.tsx
import { useLayoutEffect } from "react";
import { useStore } from "zustand";
const Component = () => {
const { count, incrementCount, decrementCount } = useStore(counterStore);
return null;
};
```
**Manual lazy load slices**
```tsx
// src/create-decrement-slice.ts
import type { StateCreator } from "zustand";
import type { CounterStore } from "./counter-store";
export const createDecrementSlice: StateCreator<
CounterStore,
[],
[],
{ decrementCount: () => void }
> = (set) => ({
decrementCount: () => {
set((currentState) => ({ count: currentState.count - 1 }));
},
});
```
```tsx
// src/counter-store.ts
import { useLayoutEffect } from "react";
import { createStore } from "zustand";
import { injectors } from "zustand-injectors";
export type CounterState = { count: number };
export type CounterActions = {
incrementCount: () => void;
decrementCount: () => void;
};
export type CounterStore = CounterState & CounterActions;
export const counterStore = createStore<CounterStore>()(
injectors((set) => ({
count: 0,
incrementCount: () => {
set((currentState) => ({ count: currentState.count + 1 }));
},
decrementCount: () => {},
}))
);
```
```tsx
// src/main.tsx
import { useLayoutEffect } from "react";
import { useStore } from "zustand";
const Component = () => {
const { count, incrementCount, decrementCount } = useStore(counterStore);
useLayoutEffect(() => {
counterStore.injectAsyncSliceInitializer("decrement-slice", () =>
import("./create-decrement-slice").then((mod) => mod.createDecrementSlice)
);
}, []);
return null;
};
```