A sweet way to lazy load slices
npm i zustand zustand-injectors
Auto lazy load slices
// 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 }));
},
});
// 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
),
}
)
);
// main.tsx
import { useLayoutEffect } from "react";
import { useStore } from "zustand";
const Component = () => {
const { count, incrementCount, decrementCount } = useStore(counterStore);
return null;
};
Manual lazy load slices
// 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 }));
},
});
// 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: () => {},
}))
);
// 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;
};