React Query Nedir? Nasıl Kullanılır?

YBS Web
3 min readDec 24, 2022

React Query, bir React uygulamasında veri çekme ve yönetme için bir kütüphanedir. Bu kütüphane, veri istemlerini yönetmek, önbellekleme, tarama, çoklu isteklerin yönetimi gibi birçok işlemi otomatik olarak gerçekleştirir. Bu sayede uygulamanızda veri çekme ve yönetme işlemlerinin yönetimi için daha az kod yazmanıza yardımcı olur.

React Query’yi kullanmak için öncelikle kütüphaneyi projenize dahil etmeniz gerekmektedir. Bu, npm veya yarn komutlarını kullanarak yapılabilir:

npm install react-query
yarn add react-query

Daha sonra, veri çekmek istediğiniz bir API’ye bir istek göndermek için useQuery hook'unu kullanabilirsiniz. Örneğin, bir REST API'sına bir GET isteği göndermek için şu şekilde kullanabilirsiniz:

import { useQuery } from 'react-query'

function Bilesen() {
const { data, error, isLoading } = useQuery('todos', () =>
fetch('https://my-api.com/todos').then((res) => res.json())
)

if (isLoading) return 'Yükleniyor...'
if (error) return 'Error Bulundu: ' + error.message

return (
<ul>
{data.map((todo) => (
<li key={todo.id}>{todo.title}</li>
))}
</ul>
)
}

React Query, veri çekme işlemlerinde önbellekleme ve tarama gibi özellikleri de otomatik olarak sağlar. Örneğin, useQuery hook'unun ikinci parametresi olarak bir config objesi geçebilirsiniz. Bu objede, önbellekleme ve tarama ayarları gibi özellikleri yapılandırabilirsiniz.

React Query, aynı zamanda çoklu veri isteklerini yönetmek için de kullanılabilir. Örneğin, bir liste sayfasında sayfadaki tüm öğelerin ayrı ayrı veri istekleri yapılırken, bu isteklerin hepsinin tamamlanmasını bekleyen bir spinner göstermek isteyebilirsiniz. Bu durumda, useMutation hook'un işlemini kullanarak çoklu veri isteklerini yönetebilirsiniz.

Örneğin:

import { useMutation } from 'react-query'

function MyListPage() {
const [mutate] = useMutation(() => {
const todoPromise = fetch('https://my-api.com/todos').then((res) => res.json())
const userPromise = fetch('https://my-api.com/users').then((res) => res.json())
return Promise.all([todoPromise, userPromise])
})

useEffect(() => {
mutate()
}, [mutate])

return (
<>
<TodoList />
<UserList />
</>
)
}

Burada, useMutation hook'u ile bir istek fonksiyonu tanımladık. Bu fonksiyon, todo ve kullanıcı listelerini çeken iki veri isteğini gerçekleştirerek, todo ve kullanıcı listelerini döndüren bir Promise döndürür. Daha sonra, useEffect hook'unu kullanarak mutate fonksiyonunu çalıştırdık. Bu sayede, todo ve kullanıcı listelerinin verilerini aynı anda çektik ve iki liste için ayrı ayrı useQuery hook'ları kullanmadık.

React Query, veri çekme işlemlerinde kullandığınız API’lerin tipine ve yapısına göre farklı özellikler sunar. Bu özellikleri ayrıntılı olarak inceleyerek, komplike veri çekme işlemlerinde React Query’yi nasıl daha etkili bir şekilde kullanabileceğinizi öğrenebilirsiniz.

Bundan önce biz bir adet daha komplike örneği görmüş olalım:

Aşağıdaki örnekte, bir ürünler listesi sayfasında ürünleri çeken bir veri isteği yapılmaktadır. Bu veri isteği, sayfadaki ürünlerin tümünün verilerini döndürürken, sayfadaki her bir ürün için de ayrı ayrı ürün detaylarını çeken veri istekleri yapılmaktadır. Bu veri isteklerinin hepsinin tamamlanmasını bekleyen bir spinner gösterilmektedir:

import { useMutation, useQuery } from 'react-query'

function ProductListPage() {
const { data: products, error, isLoading } = useQuery('products', () =>
fetch('https://my-api.com/products').then((res) => res.json())
)

const [mutateProductDetail] = useMutation(async (productId) => {
const res = await fetch(`https://my-api.com/products/${productId}`)
return res.json()
})

useEffect(() => {
if (products) {
products.forEach((product) => mutateProductDetail(product.id))
}
}, [products, mutateProductDetail])

if (isLoading) return 'Yükleniyor...'
if (error) return 'Error Bulundu: ' + error.message

return (
<ul>
{products.map((product) => (
<Product key={product.id} product={product} />
))}
</ul>
)
}

function Product({ product }) {
const { data: productDetail, isLoading } = useQuery(
['productDetail', product.id],
() => mutateProductDetail(product.id)
)

if (isLoading) return 'Yükleniyor...'

return (
<li>
<h2>{product.name}</h2>
<p>{productDetail.description}</p>
</li>
)
}

Burada, useQuery hook'u ile ürünler listesi verisi çekilirken, useMutation hook'u ile de her bir ürün için ayrı ayrı ürün detayı verisi çekilmektedir. useEffect hook'u ile de ürünler listesi verisi çekildikten sonra, ürünler listesi içindeki tüm ürünler için ürün detayı verisi çeken mutate fonksiyonu çalıştırılmaktadır. Bu sayede, tüm ürünlerin veri istekleri yapılırken bir spinner gösterilebilmektedir. Ayrıca, useQuery hook'unun ikinci parametresinde mutate fonksiyonunu çağırdık. Bu sayede, ürün detayı verisi çekilirken mutate fonksiyonu çalıştırılmış olur ve ürün detayı verisi çekilmiş olur.

Bu örnekte, ürünler listesi verisi çekilirken aynı zamanda ürünler listesi içindeki tüm ürünler için ürün detayı verisi de çekilmiş olur. Bu sayede, ürünler listesi sayfasında ürünlerin ayrıntılı bilgilerine erişilebilir.

React Query, veri çekme işlemlerinde önbellekleme ve tarama gibi özellikleri de otomatik olarak sağlar. Örneğin, useQuery hook'unun config objesi içinde önbellekleme ve tarama ayarlarını yapılandırabilirsiniz. Bu sayede, veri isteklerinin önbellekte tutulması ve taranması gibi işlemleri daha etkili bir şekilde yönetebilirsiniz.

React Query, veri çekme işlemlerinde komplike senaryoları yönetmek için kullanılabilir. Örneğin, ürünler listesi sayfasında ürünlerin ayrıntılı bilgilerine erişirken, ürünler listesi verisi ve ürünlerin ayrıntılı bilgileri verisi çekilebilir. Bu sayede, ürünler listesi sayfasında ürünlerin ayrıntılı bilgilere hızlı bir şekilde erişilebilir.

--

--