02 / 12
Kurulum ve devtools
QueryClient ve Provider, şaşırtan varsayılanlar, Devtools paneli ve ESLint eklentisi.
Kurulum
React rehberindeki gibi bir Vite projesi açın ve paketi ekleyin:1
$ pnpm add @tanstack/react-queryPaket React 18 ve sonrasıyla çalışır. TypeScript tarafında son iki yılda çıkan sürümleri destekler; şu an TypeScript 5.7 ve sonrası.12
QueryClient ve Provider
Cache, bir QueryClient örneğinin içinde yaşar. Bu örneği uygulamanın tepesinde QueryClientProvider ile verirsiniz; altındaki her component aynı cache'e erişir:1
// src/main.tsx
import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import App from "./App.tsx";
const queryClient = new QueryClient();
createRoot(document.getElementById("root")!).render(
<StrictMode>
<QueryClientProvider client={queryClient}>
<App />
</QueryClientProvider>
</StrictMode>,
);QueryClient'ı component'in dışında oluşturun. Component içinde new QueryClient() yazarsanız her render'da cache sıfırlanır. Component içinde oluşturmanız gerekiyorsa (ör. testler, sunucu) useState(() => new QueryClient()) kullanın.3
Don't
Provider'ı Context gibi düşünüp her sayfaya ayrı bir
QueryClientProviderkoymak. Uygulamada tek birQueryClientolur; cache'i tüm sayfalar paylaşır.3
Şaşırtan Varsayılanlar
TanStack Query hiçbir ayar yapmadan çalışır ama varsayılanları veriyi güncel tutmaya göre seçilmiştir, istek sayısını azaltmaya göre değil.45 İlk kullanımda şaşırtan davranışların çoğu bunlardan gelir:4
| Varsayılan | Değer | Ne demek |
|---|---|---|
staleTime | 0 | Cache'teki veri hemen "eski" sayılır |
| Otomatik yenileme | Mount, sekmeye dönüş, internet geri gelince | Eski veri bu anlarda arka planda yenilenir |
gcTime | 5 dakika | Hiçbir component kullanmayan veri 5 dakika sonra silinir |
retry | 3, artan bekleme ile | Hata ekranı gösterilmeden önce istek 3 kez daha denenir |
| Structural sharing | Açık | Veri değişmediyse aynı referans korunur |
TkDodo'nun hatırlattığı ilk nokta: staleTime: 0 olsa bile queryFn her render'da çalışmaz. Beklemediğiniz bir istek gördüyseniz büyük ihtimalle sekmeye geri döndünüz.5 Geliştirirken DevTools ile uygulama arasında gidip gelmek de sekme değişikliği sayılır. v5'ten beri yalnızca visibilitychange olayı dinlendiği için bu eskisinden daha seyrektir.5
İkinci nokta: hata ekranı üç tekrar bitene kadar gelmez. Geliştirirken "hata neden geç görünüyor" sorusunun cevabı budur.4 Testlerde retry: false ayarı için Provider ve hook testi dersine bakın.
Varsayılanları tüm uygulama için defaultOptions ile değiştirirsiniz. En sık değiştirilen staleTime'dır:46
const queryClient = new QueryClient({
defaultOptions: {
queries: {
staleTime: 60 * 1000, // 1 dakika boyunca istek atma
},
},
});staleTime ve gcTime farkı Cache ve stale time dersinin konusu.
Devtools
Devtools ayrı bir pakettir. Cache'teki her sorguyu, anahtarını, durumunu ve verisini gösterir; mutation'ları da izler:7
$ pnpm add @tanstack/react-query-devtoolsimport { ReactQueryDevtools } from "@tanstack/react-query-devtools";
<QueryClientProvider client={queryClient}>
<App />
<ReactQueryDevtools initialIsOpen={false} />
</QueryClientProvider>;Ekranın köşesine bir TanStack logosu gelir; tıklayınca panel açılır. Panel yalnızca NODE_ENV === "development" olduğunda bundle'a girer; production build'den kendiliğinden çıkar.7 Chrome, Firefox ve Edge için aynı paneli tarayıcının DevTools'una ekleyen eklentiler de var.7
TkDodo Devtools'u öğrenmenin en hızlı yolu olarak önerir: bir sorgunun ne zaman fresh, ne zaman stale, ne zaman inactive olduğunu canlı görürsünüz.6 Panelden bir sorguyu elle yenileyebilir, geçersiz kılabilir ya da hata durumuna sokabilirsiniz.
ESLint Eklentisi
Doküman kurulumla birlikte resmi lint eklentisini de önerir. Gözden kaçan hataların çoğunu yazarken yakalar:18
$ pnpm add -D @tanstack/eslint-plugin-query// eslint.config.js
import pluginQuery from "@tanstack/eslint-plugin-query";
export default [
...pluginQuery.configs["flat/recommended"],
// diğer ayarlar
];recommended setindeki kurallar:89
| Kural | Neyi yakalar |
|---|---|
exhaustive-deps | queryFn'in kullandığı ama queryKey'e eklenmemiş değişken |
stable-query-client | Her render'da yeniden oluşturulan QueryClient |
no-rest-destructuring | const { data, ...rest } = useQuery(); render optimizasyonunu bozar |
no-unstable-deps | useQuery sonucunu olduğu gibi bir hook'un bağımlılık dizisine koymak |
no-void-query-fn | Değer döndürmeyen queryFn |
infinite-query-property-order, mutation-property-order | Tip çıkarımını bozan seçenek sırası |
flat/recommended-strict buna prefer-query-options kuralını ekler; sorgu ayarlarını queryOptions ile yazmaya zorlar.8
Vite şablonu ESLint yerine Oxlint ve bir .oxlintrc.json ile gelir. Eklenti Oxlint'in JS plugin desteğiyle de çalışır; bu destek şu an alfa aşamasında. JSON dosyası eklentinin hazır setini içe aktaramaz, kuralları tek tek yazarsınız:8
// .oxlintrc.json
{
"plugins": ["react", "typescript", "oxc"],
"jsPlugins": ["@tanstack/eslint-plugin-query"],
"rules": {
"react/rules-of-hooks": "error",
"@tanstack/query/exhaustive-deps": "error",
"@tanstack/query/stable-query-client": "error",
"@tanstack/query/no-rest-destructuring": "warn",
"@tanstack/query/no-unstable-deps": "error",
"@tanstack/query/infinite-query-property-order": "error",
"@tanstack/query/mutation-property-order": "error"
}
}no-void-query-fn tip bilgisine ihtiyaç duyar; Oxlint bunu JS eklentilerine henüz vermediği için listede yok.8
Sürümü Sabitlemek
Tip düzeltmeleri patch sürümlerinde çıkar; doküman bunları kırıcı değişiklik saymaz. Bu yüzden paketi belirli bir patch sürümüne sabitlemeyi ve güncellerken tiplerin değişebileceğini beklemeyi önerir.2 Lock dosyası (package-lock.json, pnpm-lock.yaml) commit'lenmişse bu zaten sağlanır.
Kendin Dene
QueryClient'ıAppcomponent'inin içine taşıyın. ESLint ya da Oxlint hangi kuralla uyarıyor?Bir sorgu yazın ve Devtools'u açın. Başka bir sekmeye geçip dönün; sorgunun durumu nasıl değişiyor?
queryFn'i her zaman hata fırlatan bir fonksiyona çevirin. Hata ekranı kaç saniye sonra geliyor?retry: falseile tekrar deneyin.
Detaylı Öğrenmek İçin
Resmi doküman: "Important Defaults"; her varsayılanın nasıl değiştirileceği ve
staleTime: 'static'ileInfinityfarkı.4Yazı: TkDodo, "Practical React Query"; varsayılanların açıklaması, Devtools ve custom hook önerisi.6
Resmi doküman: "ESLint Plugin Query"; her kuralın doğru ve yanlış örnekleri.8
Kaynaklar
Paket kurulumu, React 18+ uyumluluğu ve ESLint eklentisi önerisi.
Desteklenen TypeScript sürümleri ve sürümü patch seviyesinde sabitleme önerisi.
`QueryClient`'ı render dışında ya da `useState` ile oluşturmak.
`staleTime`, `gcTime`, `retry`, otomatik yenileme ve structural sharing.
: — 20 Ağustos 2021. Stale-while-revalidate ve yenilemenin tetiklendiği anlar.
: — 16 Kasım 2020. Varsayılanların açıklaması, `staleTime` ve `gcTime` farkı, Devtools.
Kurulum, floating ve embedded mod, production'da yükleme ve tarayıcı eklentileri.
Flat config, strict set ve Oxlint kurulumu.
Rest destructuring'in izlenen property optimizasyonunu bozması.
Last updated: October 21, 2026
