İçeriğe atla
devcards.space
ReactFrontend

Zustand Nedir? Basit, Hızlı, Ölçeklenebilir State Management

Zustand ile sıfır boilerplate'e yakın global state yönetimi. Store oluşturma, selectors, async actions, persist middleware ve TypeScript desteği.

7 dakika okuma
Zustand infografiği: store oluşturma, selectors, async actions ve persist middleware'i gösteren genel bakış

Zustand, React uygulamaları için tasarlanmış küçük, hızlı ve ölçeklenebilir bir global state management kütüphanesidir. Provider gerektirmez, Redux'a oranla minimum boilerplate ile çalışır ve TypeScript desteği baştan beri birinci sınıftır. Selectors ile gereksiz re-render'ları yazılı bir şekilde önler, persist middleware ile state'i localStorage'a kalıcı yazabilirsiniz. Bu rehberde infografikteki bölümleri açarak temel kullanımdan ileri pattern'lere kadar adım adım giderek tüm Zustand iş akışını gösteriyoruz.

Zustand Nedir?

React için küçük, hızlı ve ölçeklenebilir bir state management kütüphanesidir. Reducer/action/dispatch boilerplate'i olmadan; çağrılan bir hook ile state ve setter elde edersiniz.

  • Daha az boilerplate
  • Minimal setup
  • Built-in React desteği
  • Hem küçük hem büyük uygulamalar için

Neden Zustand?

Zustand'ın getirdiği avantajlar:

  • Provider gerektirmez
  • Minimal API
  • TypeScript ile yerleşik destek
  • React Native API'siyle uyumlu
  • Redux'a göre çok daha hafif (small footprint)

Kurulum

Tek paket; runtime bağımlılığı olarak kurulur.

bash
npm install zustand

Bir Store Oluşturma (Temel Fikir)

create fonksiyonu, set'i alan bir factory ile state ve action'ları döndürür. Hook olarak kullanılabilir.

stores/counter.ts
ts
import { create } from "zustand";

type CounterState = {
  count: number;
  increment: () => void;
  decrement: () => void;
};

export const useCounter = create<CounterState>((set) => ({
  count: 0,
  increment: () => set((s) => ({ count: s.count + 1 })),
  decrement: () => set((s) => ({ count: s.count - 1 })),
}));

Store'u Kullanma

Store, doğrudan bir hook'tur. Değer ve action'ları okumak için çağırırsınız; component'i içine sarmaya gerek yok.

tsx
function Counter() {
  const { count, increment } = useCounter();
  return (
    <button onClick={increment}>
      Count: {count}
    </button>
  );
}

Selectors (ÖNEMLİ)

Yalnızca ihtiyaç duyduğunuz alanı seçmek için selector geçirin. Bu, sadece o alan değiştiğinde re-render olmasını sağlar — performans için kritiktir.

ts
const count = useCounter((s) => s.count);
const increment = useCounter((s) => s.increment);

Async Actions

Store içinde async fonksiyon tanımlayıp set'i çağırabilirsiniz. Veri çekme, login gibi async işler de doğal akışta yer alır.

ts
export const useUsers = create((set) => ({
  users: [],
  loading: false,
  fetchUsers: async () => {
    set({ loading: true });
    const res = await fetch("/api/users");
    const users = await res.json();
    set({ users, loading: false });
  },
}));

Persist Middleware

persist middleware, store içeriğini localStorage'a yazar. Sayfa yenilense bile state korunur. sessionStorage veya custom storage da kullanılabilir.

ts
import { create } from "zustand";
import { persist } from "zustand/middleware";

export const useTheme = create(
  persist<{ theme: "light" | "dark"; toggle: () => void }>(
    (set) => ({
      theme: "light",
      toggle: () =>
        set((s) => ({ theme: s.theme === "light" ? "dark" : "light" })),
    }),
    { name: "theme" }
  )
);

Temel Kavramlar

Zustand ile sürekli karşılaşacağınız parçalar:

  • create — store oluşturmak
  • set / get — state güncellemek ve okumak
  • selectors — sadece ihtiyacınızı dinlemek
  • persist — state'i kalıcı yazmak
  • subscriber — store dışında dinlemek
  • middleware — devtools, persist, immer vb.

Zustand vs Redux

İkisinin temel farkları:

  • Zustand: minimal boilerplate, provider yok, hızlı kurulum
  • Redux: action/reducer/dispatch, daha katı yapı, daha fazla setup
  • Zustand modern projelerde gittikçe yaygınlaşıyor
  • Redux Toolkit, klasik Redux'a göre boilerplate'i azaltır ama yine de ağırdır

Kullanım Alanları

Zustand'ın özellikle parladığı senaryolar:

  • Global UI state (theme, modal, sidebar)
  • Paylaşılan client state
  • Küçük-orta ölçekli uygulamalar
  • React Native uygulamaları
  • Form draft/auto-save state

Özet

Zustand; basit, hızlı ve performanslıdır. Boilerplate'i minimum tutar, mükemmel geliştirici deneyimi sunar ve modern React uygulamaları için harika bir varsayılan tercihtir. Server state için React Query, client state için Zustand kombinasyonu modern stack'lerde en yaygın görünen ikilidir.

Sıkça Sorulan Sorular

Bu konuda en çok merak edilenler.

Zustand mı, Redux Toolkit mi?

Yeni projelerde Zustand çoğu zaman yeterli ve daha az boilerplate getirir. Çok büyük ekipler, katı action history takibi veya devtools temelli iş akışı isteyenler için Redux Toolkit hâlâ güçlü bir seçim.

Server state için de kullanılır mı?

Kullanılabilir ama önerilmez. React Query/TanStack Query gibi server state'e özel kütüphaneler cache, deduplication ve refetch konusunda çok daha üstündür. Zustand'ı client state için kullanın.

TypeScript ile zorluk yaşar mıyım?

Hayır — Zustand'ın TS desteği güçlüdür. create<TState>() jenerik kullanımıyla tüm action ve state tipleri çıkarsanır. Sadece middleware kombinasyonlarında dikkatli tip imzaları gerekir.

Birden fazla store olur mu?

Evet, idealdir. Her domain için ayrı store oluşturmak (auth, cart, ui) Zustand'ın önerdiği yaklaşımdır. Tek bir mega store yerine küçük store'larla daha temiz ve test edilebilir bir mimari kurarsınız.

DevTools desteği var mı?

Evet — devtools middleware'i ile Redux DevTools'a action gönderebilirsiniz. Geliştirme sırasında state geçmişini görmek ve debug yapmak için çok kullanışlıdır.

Bu konuyla bağlantılı diğer infografikler.

Daha fazla developer infografiği keşfedin

Yeni içerikleri kaçırmamak için ana sayfayı ziyaret edin.

Tüm infografikleri gör