Zustand و TanStack Query (که قبلاً React Query بود) چی هستن، فرقشون چیه و دقیقاً توی پروژه‌های Next.js (App Router یا Pages Router) کجا و چرا ازشون استفاده می‌کنیم.

ابزاربرای چی استفاده می‌شه؟نوع stateجایگزین چی هست؟
Zustandمدیریت حالت‌های کلاینت (Client State)Client-side stateRedux, Context API, MobX
TanStack Queryمدیریت حالت‌های سرور (Server State)Server-side state + cacheuseEffect + fetch + manual state

۱. Zustand — برای Client State

چی هست؟

یک لایبرری خیلی سبک (کمتر از ۱ کیلوبایت!) برای مدیریت global state در ری‌اکت بدون boilerplate زیاد.

مزایای اصلی

  • API خیلی ساده و تمیز (مثل hook معمولی)
  • نیازی به Provider پیچیده نداره (ولی می‌تونی بذاری)
  • عملکرد عالی (به‌روزرسانی فقط کامپوننت‌هایی که واقعاً از state استفاده کردن)
  • پشتیبانی عالی از TypeScript
  • middleware آماده (persist, devtools, immer و …)

مثال واقعی در Next.js

// store/useUserStore.ts
import { create } from 'zustand'
import { devtools, persist } from 'zustand/middleware'

type UserStore = {
  user: { name: string; role: string } | null
  isDarkMode: boolean
  setUser: (user: any) => void
  logout: () => void
  toggleDarkMode: () => void
}

export const useUserStore = create<UserStore>()(
  devtools(
    persist(
      (set) => ({
        user: null,
        isDarkMode: false,
        setUser: (user) => set({ user }),
        logout: () => set({ user: null }),
        toggleDarkMode: () => set((state) => ({ isDarkMode: !state.isDarkMode })),
      }),
      { name: 'user-storage' } // ذخیره در localStorage
    )
  )
)

کجا از Zustand استفاده کنیم؟ (در Next.js)

  • تم دارک/لایت
  • وضعیت لاگین کاربر (وقتی از cookie یا localStorage می‌خونی)
  • تنظیمات کاربری (زبان، واحد پول و …)
  • سبد خرید (اگر فقط کلاینت‌ساید باشه)
  • حالت‌های UI (باز/بسته بودن سایدبار، modalها، فرم‌های چندمرحله‌ای)
  • هر چیزی که “حالت کلاینت” هست و نیازی به کش سرور نداره

۲. TanStack Query — برای Server State

چی هست؟

بهترین ابزار موجود برای مدیریت داده‌های سمت سرور: fetch، cache، sync، refetch، pagination، mutation و …

مزایای اصلی

  • کش هوشمند اتوماتیک
  • refetch خودکار هنگام focus، reconnect، interval
  • deduplication درخواست‌ها
  • pagination و infinite scroll آماده
  • mutation + optimistic update
  • عالی کار کردن با Next.js App Router (Server Components + Client Components)

مثال واقعی در Next.js 13+ (App Router)

// app/products/page.tsx (Server Component)
async function getProducts() {
  const res = await fetch('https://api.example.com/products', { cache: 'no-store' })
  return res.json()
}

export default async function ProductsPage() {
  const products = await getProducts() // فقط اولین بار از سرور می‌گیره

  return <ProductsClient initialData={products} />
}

// app/components/ProductsClient.tsx (Client Component)
'use client'
import { useQuery, useInfiniteQuery } from '@tanstack/react-query'

export function ProductsClient({ initialData }) {
  const { data, isLoading, fetchNextPage, hasNextPage } = useInfiniteQuery({
    queryKey: ['products'],
    queryFn: ({ pageParam = 1 }) => fetch(`/api/products?page=${pageParam}`).then(res => res.json()),
    initialData: { pages: [initialData], pageParams: [1] },
    getNextPageParam: (lastPage) => lastPage.nextPage ?? undefined,
  })

  // اینجا کش می‌شه، refetch اتوماتیک داره، pagination و …
}

کجا از TanStack Query استفاده کنیم؟

  • گرفتن لیست محصولات، پست‌ها، کامنت‌ها
  • پروفایل کاربر از API
  • هر نوع درخواست GET/POST/PUT/DELETE به بک‌اند
  • pagination, infinite scroll
  • وقتی می‌خوای داده‌ها همیشه به‌روز باشن (مثلاً چت، اعلان‌ها)

ترکیب ایده‌آل در Next.js App Router (بهترین روش ۲۰۲۵)

Server Components       → داده اولیه رو مستقیم از سرور بگیر (بدون کش کلاینت)
Client Components       → 
     ├─ TanStack Query   → برای داده‌های داینامیک، pagination، mutation
     └─ Zustand          → برای حالت‌های کلاینت (تم، سبد خرید محلی، UI state)

یه قانون طلایی

اگر داده از سرور میاد و ممکنه تغییر کنه → TanStack Query
اگر داده فقط توی مرورگر تولید/ذخیره می‌شه → Zustand

مثال واقعی ترکیب هر دو

// استفاده همزمان
function Header() {
  const user = useUserStore(state => state.user)           // Zustand
  const { data: notifications } = useQuery({               // TanStack Query
    queryKey: ['notifications', user?.id],
    enabled: !!user?.id,
  })

  return (
    <header>
      {user?.name} - اعلان‌ها: {notifications?.length}
    </header>
  )
}

خلاصه نهایی — کی از کدوم استفاده کنیم؟

سناریوابزار پیشنهادی
تم، زبان، تنظیمات کاربریZustand
وضعیت لاگین (فقط کلاینت)Zustand + persist
سبد خرید (فقط local)Zustand
لیست محصولات، پست‌ها، پروفایلTanStack Query
pagination / infinite scrollTanStack Query
فرم ثبت‌نام / ویرایش (mutation)TanStack Query
داده‌هایی که نیاز به کش هوشمند دارنTanStack Query

اگه پروژه Next.js داری، ترکیب Zustand + TanStack Query الان (۲۰۲۵) بهترین و مدرن‌ترین ستاپه و تقریباً همه شرکت‌های بزرگ دارن ازش استفاده می‌کنن.

Zustand — مستندات و لینک‌های اصلی

Zustand یک لایبرری سبک برای مدیریت client state هست. مستنداتش خیلی ساده و کامله.

نوعلینکتوضیح کوتاه
مستندات رسمیZustand Documentationراهنمای کامل API، middlewareها (مثل persist و devtools) و مثال‌ها.
گیت‌هاب رسمیpmndrs/zustandسورس‌کد، مثال‌های پیشرفته و third-party extensions.
دمو تعاملیZustand Demoتست سریع storeها بدون کدنویسی.
راهنمای کلیReact State Management with Zustandمقاله‌ای در مورد مقایسه با Redux و مثال‌های پایه.

Zustand با Next.js — راهنماها و تیوترینال‌ها

برای Next.js (App Router و SSR)، این لینک‌ها عالی هستن. تمرکز روی جلوگیری از hydration errors و persist state.

نوعلینکتوضیح کوتاه
راهنمای رسمی Next.jsSetup with Next.jsچگونگی ستاپ Provider، SSR و caching در App Router.
تیوترینال Next.js 14Zustand in Next.js 14گام‌به‌گام با TypeScript و مثال counter store.
تیوترینال Next.js 15How To Use Zustand With Next.js 15شامل persistence، best practices و حل hydration errors.
مثال عملیImplement Zustand in Next.js Appساخت counter app با localStorage و رفع hydration.
مثال CartZustand with Next.js 13مدیریت سبد خرید بدون prop drilling.

TanStack Query — مستندات و لینک‌های اصلی

TanStack Query (قبلاً React Query) برای server state و caching عالیه. مستنداتش پر از مثال‌های React/Next.js هست.

نوعلینکتوضیح کوتاه
مستندات رسمیTanStack Query Docsپوشش کامل queries, mutations, caching و integrations.
Quick StartQuick Start Guideمثال‌های پایه برای setup و استفاده در React.
گیت‌هاب رسمیTanStack/queryسورس، مثال‌ها و community extensions.
OverviewTanStack Query Overviewتوضیح server state vs client state و مزایا.

TanStack Query با Next.js — راهنماها و تیوترینال‌ها

این لینک‌ها روی integration با App Router، SSR و hydration تمرکز دارن. عالی برای پروژه‌های واقعی.

نوعلینکتوضیح کوتاه
مثال رسمی Next.jsNext.js ExampleSSG, prefetching و infinite queries در App Router.
تیوترینال پایهTanStack Query 101 with Next.jsbasics، caching و SSR با مثال‌های ساده.
راهنمای کامل Next.js 14+TanStack Query and Next.js 14 Integrationprefetching، hydration و Server Components.
بحث RedditTanStack Query in Next.jsتجربیات واقعی، repoهای مثال و CRUD.
راهنمای LogRocketUsing TanStack Query with Next.jsintegration با Next.js 13+ و ReactQueryStreamedHydration.