TanStackIntermediate
Loading, Error ও Empty State
useQuery-এর status/state থেকে তিনটি UI অবস্থা বের করা — বাংলায়।
6টি অংশবাংলা ভাষায়
প্রতিটি data-fetching UI-র তিনটি অবশ্যক অবস্থা: loading, error, empty। TanStack Query এই state গুলোর ব্যবস্থা করে — শুধু render করতে হয়।
src/components/products/product-list.tsxtsx
tsx
"use client";
import { useProducts } from "@/lib/hooks/use-products";
import { ProductTable } from "./product-table";
import { Skeleton } from "@/components/ui/skeleton";
export function ProductList({ params }: { params: ProductQueryParams }) {
const { data, isPending, isError, error, refetch } = useProducts(params);
// 1) Loading
if (isPending) {
return <ProductTableSkeleton />;
}
// 2) Error
if (isError) {
return (
<div className="rounded-xl border p-6 text-center">
<p className="font-medium">ডেটা লোড করা যায়নি</p>
<p className="mt-1 text-sm text-muted-foreground">{error.message}</p>
<Button onClick={() => refetch()} className="mt-3">
আবার চেষ্টা করুন
</Button>
</div>
);
}
// 3) Empty
if (data.items.length === 0) {
return <EmptyState message="কোনো product পাওয়া যায়নি" />;
}
// 4) Success
return <ProductTable data={data.items} />;
}কোন status কখন
| State | কখন সত্য |
|---|---|
isPending | প্রথমবার ডেটা নেই, fetch চলছে |
isFetching | যেকোনো fetch চললে (background সহ) |
isError | query শেষবার ভুল হয়েছে |
isSuccess | data আছে |
isRefetching | ডেটা আছে + আবার fetch হচ্ছে |
Reusable EmptyStatetsx
tsx
export function EmptyState({
message,
action,
}: {
message: string;
action?: React.ReactNode;
}) {
return (
<div className="rounded-xl border py-16 text-center">
<p className="text-muted-foreground">{message}</p>
{action && <div className="mt-4">{action}</div>}
</div>
);
}v4 slug মনে রাখুন
TanStack Query v4/ v5-এ isLoading আসলে isPending && isFetching — অর্থাৎ ডেটা পূর্বেই কার থাকলে isLoading false। সাধারণত isPending আর isFetching দিয়েই কাজ করুন; data === undefined চেকও নির্ভরযোগ্য।
শেষ প্যারায় নিজে practice করুন — কোড কপি করে নিজের এডিটরে চালিয়ে দেখুন।