O que você vai aprender neste tutorial
✓ Fundamentos do Zustand
✓ Criação de store
✓ Definição de actions
✓ Selectors
✓ Middlewares
Step 1: Configuração
npm install zustand
Step 2: Store Básica
// store/counterStore.ts
import { create } from 'zustand';
interface CounterState {
count: number;
increment: () => void;
decrement: () => void;
reset: () => void;
}
export const useCounterStore = create<CounterState>((set) => ({
count: 0,
increment: () => set((state) => ({ count: state.count + 1 })),
decrement: () => set((state) => ({ count: state.count - 1 })),
reset: () => set({ count: 0 }),
}));
Step 3: Uso em Componentes
function Counter() {
const { count, increment, decrement, reset } = useCounterStore();
return (
<div>
<p>Count: {count}</p>
<button onClick={increment}>+</button>
<button onClick={decrement}>-</button>
<button onClick={reset}>Reset</button>
</div>
);
}
Step 4: Otimização com Selectors
// Subscrever apenas valores necessários
function CountDisplay() {
const count = useCounterStore((state) => state.count);
return <p>Count: {count}</p>;
}
function CountActions() {
const increment = useCounterStore((state) => state.increment);
return <button onClick={increment}>+</button>;
}
Step 5: Store Complexa
// store/todoStore.ts
import { create } from 'zustand';
interface Todo {
id: number;
text: string;
completed: boolean;
}
interface TodoState {
todos: Todo[];
addTodo: (text: string) => void;
toggleTodo: (id: number) => void;
removeTodo: (id: number) => void;
}
export const useTodoStore = create<TodoState>((set) => ({
todos: [],
addTodo: (text) =>
set((state) => ({
todos: [...state.todos, { id: Date.now(), text, completed: false }],
})),
toggleTodo: (id) =>
set((state) => ({
todos: state.todos.map((todo) =>
todo.id === id ? { ...todo, completed: !todo.completed } : todo
),
})),
removeTodo: (id) =>
set((state) => ({
todos: state.todos.filter((todo) => todo.id !== id),
})),
}));
Step 6: Middleware de Persistência
import { create } from 'zustand';
import { persist } from 'zustand/middleware';
export const useSettingsStore = create(
persist<SettingsState>(
(set) => ({
theme: 'light',
setTheme: (theme) => set({ theme }),
}),
{
name: 'settings-storage',
}
)
);
Step 7: Actions Assíncronas
interface UserState {
user: User | null;
loading: boolean;
fetchUser: (id: string) => Promise<void>;
}
export const useUserStore = create<UserState>((set) => ({
user: null,
loading: false,
fetchUser: async (id) => {
set({ loading: true });
try {
const res = await fetch(`/api/users/${id}`);
const user = await res.json();
set({ user, loading: false });
} catch {
set({ loading: false });
}
},
}));
Resumo
Zustand é uma biblioteca de gerenciamento de estado mais leve e simples que Redux. Não requer Provider e a otimização com selectors é fácil.
← Voltar para a lista