10 / 12
Actions ve async güncellemeler
Async transition'lar, form action'ı, useActionState, useFormStatus ve useOptimistic ile bekleme durumları.
Action Nedir
Bir butona basıldığında sunucuya istek atıp sonucu göstermek için eskiden üç state yazılırdı: isPending, error, data. React 19 bunu Action kavramıyla toplar: startTransition içinde çalışan, async olabilen bir fonksiyon.12
import { useTransition } from "react";
function AddToCartButton({ productId }: { productId: string }) {
const [isPending, startTransition] = useTransition();
return (
<button
disabled={isPending}
onClick={() => {
startTransition(async () => {
await addToCart(productId);
});
}}
>
{isPending ? "Ekleniyor..." : "Sepete ekle"}
</button>
);
}React, Action bitene kadar isPending'i true tutar, arayüzü kilitlemez ve Action içinde fırlatılan hatayı en yakın Error Boundary'ye iletir.1
Warning
await'ten sonra yapılan state güncellemeleri transition sayılmaz. Bunları tekrar startTransition ile sarın. Bu bir JavaScript sınırlaması; ileride AsyncContext ile kalkacak.1
useTransition'ın performans tarafı (yavaş bir listeyi bloklamadan filtrelemek) React'te render performansı dersinde.
Form Action'ı
<form>'un action prop'una bir fonksiyon verdiğinizde React onu form gönderilince FormData ile çağırır. onSubmit'ten farkı: bir transition içinde çalışır, preventDefault gerekmez ve başarılı olunca kontrolsüz (uncontrolled) alanları sıfırlar.3
<form action={async (formData) => {
await subscribe(String(formData.get("email")));
}}>
<input name="email" type="email" required />
<SubmitButton />
</form>Butonun formun gönderildiğini bilmesi için prop geçirmenize gerek yok. useFormStatus, içinde çağrıldığı üst formun durumunu okur:4
import { useFormStatus } from "react-dom";
function SubmitButton() {
const { pending } = useFormStatus();
return <button disabled={pending}>{pending ? "Gönderiliyor..." : "Abone ol"}</button>;
}useFormStatus aynı component'teki <form>'u değil, ebeveyndeki formu görür; bu yüzden buton ayrı bir component olmalıdır.4
useActionState: Action'ın Sonucu
Action'ın bir sonucu varsa (hata mesajı, uygulanan indirim) useActionState kullanın. Bir önceki state'i ve gönderilen veriyi alıp yeni state döndüren async bir reducer gibi çalışır.5
import { useActionState } from "react";
type CouponState = { error: string | null; discount: number };
async function applyCoupon(_prev: CouponState, formData: FormData): Promise<CouponState> {
const result = await checkCoupon(String(formData.get("code")));
if (!result.ok) return { error: "Kupon geçersiz.", discount: 0 };
return { error: null, discount: result.discount };
}
export function CouponForm() {
const [state, formAction, isPending] = useActionState(applyCoupon, {
error: null,
discount: 0,
});
return (
<form action={formAction}>
<input name="code" aria-label="Kupon kodu" />
<button disabled={isPending}>Uygula</button>
{state.error && <p role="alert">{state.error}</p>}
{state.discount > 0 && <p>%{state.discount} indirim uygulandı.</p>}
</form>
);
}Aynı Action birden fazla kez tetiklenirse React çağrıları sırayla çalıştırır; her çağrı bir öncekinin sonucunu alır.5
useOptimistic: Cevabı Beklemeden Göstermek
Kullanıcı favori butonuna bastığında sunucuyu beklemeden kalbi doldurmak istersiniz. useOptimistic, Action sürerken geçici bir değer gösterir. Action bitince değer kendiliğinden gerçek kaynağa döner; istek başarısız olduysa iyimser değer kaybolur.6
import { useOptimistic, useTransition } from "react";
function FavoriteButton({ isFavorite, action }: FavoriteButtonProps) {
const [optimisticFavorite, setOptimisticFavorite] = useOptimistic(isFavorite);
const [, startTransition] = useTransition();
return (
<button
aria-pressed={optimisticFavorite}
onClick={() => {
startTransition(async () => {
setOptimisticFavorite(!optimisticFavorite);
await action(!optimisticFavorite);
});
}}
>
{optimisticFavorite ? "Favorilerde" : "Favorilere ekle"}
</button>
);
}setOptimistic... yalnızca bir Action içinde çağrılır; dışında çağrılırsa React uyarır.6 Server state'i TanStack Query ile yönetiyorsanız iyimser güncellemenin kütüphane tarafı TanStack Query rehberinde.
action Prop'u ile Component Tasarımı
Yukarıdaki FavoriteButton, prop'unu onClick değil action diye adlandırıyor. React dokümanı bu kalıbı önerir: tasarım sisteminizdeki buton, sekme ve select gibi component'ler action prop'u alır, kendi içinde startTransition'ı çağırır ve bekleme durumunu kendisi gösterir. Ürün kodu yalnızca await eder.7
Ricky Hanlon React Conf 2025'teki "Async React" konuşmasının demosunda bu fikri sonuna kadar götürür: router transition'ları, veri katmanı Suspense'i, tasarım component'leri action prop'larını ve iyimser güncellemeleri varsayılan olarak kullanır. Sonuç: ağ hızlıyken hiç yükleme durumu görünmez, yavaşken otomatik olarak görünür.89
Bu Ders ve Formlar Rehberi
Bu derste React'in kendi araçlarını gördünüz. Alan bazlı doğrulama, Zod şeması, maskeleme ve çok adımlı formlar Formlar rehberinde; Action'ın sunucuda çalışan hâli (Server Functions) Next.js rehberinin Server Actions dersinde.
Kendin Dene
AddToCartButton'ınaddToCart'ına 2 saniyelik gecikme ekleyin ve butona hızlıca üç kez basın.CouponForm'dacheckCoupon'ı"SALE10"dışındaki her kodu reddedecek şekilde yazın; hata ve başarı mesajlarını deneyin.FavoriteButton'ınaction'ını her seferinde hata fırlatacak şekilde değiştirin. Kalp ne yapıyor?Bir Action içinde
await'ten sonrasetStateçağırın; ardından onustartTransitionile sarın ve farkı gözlemleyin.
Detaylı Öğrenmek İçin
Resmi doküman:
useTransitionreferansı; Action'lar,actionprop'u açmak, istenmeyen yükleme göstergelerini önlemek ve sorun giderme.1Video: Ricky Hanlon'ın "Async React" konuşmasının iki bölümü (React Conf 2025).810
Repo: Konuşmanın demo uygulaması; ağ hızını değiştirip farkı kendiniz görebilirsiniz.9
Resmi doküman:
useActionStateveuseOptimisticreferansları; sepet örneği üzerinden bekleme, hata ve iyimser durumu adım adım gösterir.56
Kaynaklar
Async Action'lar, `isPending`, Error Boundary ile hata ve `await` sonrası güncelleme sınırlaması.
Actions, `useActionState`, `useOptimistic` ve form action'larının duyurusu.
`action` prop'u, `FormData`, transition içinde çalışma ve başarılı gönderimden sonra alanların sıfırlanması.
Üst formun bekleme durumunu okumak ve ayrı component şartı.
Async reducer, `isPending`, sıralı çalıştırma ve hata davranışı.
Action süresince geçici değer, reducer'lı kullanım ve Action dışında çağırma uyarısı.
Component'in `action` prop'u alıp transition'ı kendisi başlatması.
1. gün yayını. Transition, Suspense ve optimistic state'i birlikte kullanan bir uygulama.
Konuşmanın son hâli; router, veri katmanı ve `action` prop'lu tasarım component'leri, 150 ms eşiği.
2. gün yayını. Konuşmanın devamı.
Last updated: October 21, 2026
