persist middleware.
What You’ll Build
You’ll create a persistent shopping cart store that demonstrates:- Using the
persistmiddleware - Saving state to localStorage
- Automatic state rehydration
import { create } from "zustand";
import { persist } from "zustand/middleware";
const useCartStore = create(
persist(
(set) => ({
items: [],
total: 0,
actions: {
addItem: () => set((state) => ({})),
removeItem: () => set((state) => ({})),
clearCart: () => set((state) => ({}))
},
}),
{
name: "useCartStore",
}
)
);
export default useCartStore;
import { create } from "zustand";
import { persist } from "zustand/middleware";
const useCartStore = create(
persist(
(set) => ({
items: [],
total: 0,
actions: {
addItem: (item) => set((state) => {
const newItems = [...state.items, item];
const newTotal = state.total + item.price;
return { items: newItems, total: newTotal };
}),
removeItem: (itemId) => set((state) => {
const itemToRemove = state.items.find(i => i.id === itemId);
const newItems = state.items.filter(i => i.id !== itemId);
const newTotal = state.total - (itemToRemove?.price || 0);
return { items: newItems, total: newTotal };
}),
clearCart: () => set({ items: [], total: 0 })
},
}),
{
name: "useCartStore",
}
)
);
export default useCartStore;
import useCartStore from '../store/useCartStore';
function ShoppingCart() {
const items = useCartStore((state) => state.items);
const total = useCartStore((state) => state.total);
const { addItem, removeItem, clearCart } = useCartStore(
(state) => state.actions
);
const handleAddItem = () => {
addItem({
id: Date.now(),
name: "Product",
price: 29.99
});
};
return (
<div>
<h2>Shopping Cart</h2>
<p>Total: ${total.toFixed(2)}</p>
<ul>
{items.map((item) => (
<li key={item.id}>
{item.name} - ${item.price}
<button onClick={() => removeItem(item.id)}>Remove</button>
</li>
))}
</ul>
<button onClick={handleAddItem}>Add Item</button>
<button onClick={clearCart}>Clear Cart</button>
</div>
);
}
export default ShoppingCart;
TypeScript Persistent Store
You can also create persistent stores with TypeScript:- JavaScript
- TypeScript
store/useCartStore.js
Understanding Persist Middleware
The persist middleware template fromtemplates/store-persist.js:
- Automatic saving: State is saved to localStorage on every change
- Rehydration: State is restored when the store is initialized
- Storage key: The
nameoption sets the localStorage key
Customizing Persistence
You can customize the persist middleware after generation:Next Steps
Actions & State
Learn action patterns
Basic Store
Start with the basics