حالتهای خالی
راهنمای طراحی حالتهای خالی — از صفر نتیجه تا حالت اولیه و مسیر گمشده
معرفی
حالتهای خالی زمانی ظاهر میشوند که محتوایی برای نمایش وجود ندارد. یک حالت خالی خوب سه کار انجام میدهد: وضعیت را توضیح میدهد، علت را بیان میکند، و یک اقدام واضح پیشنهاد میدهد.
جدول با صفر نتیجه
| نام اینفلوئنسر | پلتفرم | نرخ تعامل |
|---|---|---|
نتیجهای یافت نشد فیلترهای خود را تغییر دهید | ||
حالت اولیه — هنوز دادهای اضافه نشده
اینفلوئنسری اضافه نشده
اولین اینفلوئنسر را به لیست پایش خود اضافه کنید
یک پیادهسازی کامل و کپیبردار از این الگو بهعنوان بلاک شروع کار با پارتو موجود است.
انواع حالت خالی
سه نوع اصلی وجود دارد:
| نوع | توضیح | مثال |
|---|---|---|
| صفر نتیجه | جستجو یا فیلتر نتیجهای نداشت | جستجوی اینفلوئنسر — نتیجه نیافت |
| حالت اولیه | کاربر هنوز دادهای اضافه نکرده | لیست اینفلوئنسرها — هنوز خالی است |
| مسیر گمشده | آدرس یا منبع وجود ندارد | پروفایل اینفلوئنسر حذفشده |
کامپوننت Empty
برای حالتهای خالی کامپوننت از کامپوننت Empty استفاده کنید:
import { , , , , } from '@partodata/ui'
;<>
<>اینفلوئنسری اضافه نشده</>
<>اولین اینفلوئنسر را به لیست پایش خود اضافه کنید</>
<>
< ="primary">افزودن اینفلوئنسر</>
</>
</>صفر نتیجه
جدول
وقتی جستجو یا فیلتر نتیجهای ندارد، یک ردیف واحد با پیام نمایش دهید:
import { Table, TableHeader, TableRow, TableHead, TableBody, TableCell } from '@partodata/ui'
import { Search } from 'lucide-react'
;<Table>
<TableHeader>
<TableRow>
<TableHead>نام اینفلوئنسر</TableHead>
<TableHead>پلتفرم</TableHead>
<TableHead>نرخ تعامل</TableHead>
</TableRow>
</TableHeader>
<TableBody>
<TableRow className="hover:bg-transparent">
<TableCell colSpan={3} className="text-center py-10">
<div className="flex flex-col items-center gap-2">
<Search className="h-8 w-8 text-muted-foreground/40" />
<p className="text-sm text-muted-foreground">نتیجهای یافت نشد</p>
<p className="text-xs text-muted-foreground">فیلترها را تغییر دهید یا جستجوی جدیدی انجام دهید</p>
</div>
</TableCell>
</TableRow>
</TableBody>
</Table>DataGrid با Empty component
برای DataTable از prop داخلی emptyState استفاده کنید:
import { , , , , , } from '@partodata/ui'
import type { } from '@partodata/ui'
type = { : string; : string }
declare const : <>[]
declare function (): void
;<
={}
={[]}
={
<>
<>نتیجهای یافت نشد</>
<>فیلترها را تغییر دهید</>
<>
< ="outline" ={}>
پاک کردن فیلترها
</>
</>
</>
}
/>حالت اولیه
ارائهای (با onboarding)
وقتی کاربر برای اولین بار با ویژگیای روبرو میشود:
<div className="flex flex-col items-center justify-center min-h-[300px] rounded-lg border border-dashed p-8">
<Users className="h-12 w-12 text-muted-foreground/40 mb-4" />
<h3 className="text-base font-semibold mb-2">اینفلوئنسری اضافه نشده</h3>
<p className="text-sm text-muted-foreground text-center mb-6 max-w-xs">
اینفلوئنسرهای مورد نظر را به لیست پایش اضافه کنید تا آمار و تحلیلهای آنها را ببینید
</p>
<Button variant="primary">افزودن اینفلوئنسر</Button>
</div>اطلاعاتی (بدون onboarding)
وقتی ویژگی ساده است و نیازی به راهنمایی ندارد:
<Table>
<TableBody>
<TableRow className="hover:bg-transparent">
<TableCell colSpan={columnCount} className="text-center text-foreground-lighter py-8">
هیچ دادهای وجود ندارد
</TableCell>
</TableRow>
</TableBody>
</Table>مسیر گمشده
وقتی کاربر به URL نادرست یا منبع حذفشده رسیده:
import { Alert, AlertTitle, AlertDescription } from '@partodata/ui'
import { AlertCircle } from 'lucide-react'
;<div className="flex items-center justify-center min-h-[300px]">
<Alert variant="destructive" className="max-w-md">
<AlertCircle className="h-4 w-4" />
<AlertTitle>یافت نشد</AlertTitle>
<AlertDescription>
این پروفایل وجود ندارد یا حذف شده است.
<a href="/influencers" className="block mt-2 text-brand hover:text-brand-600">
بازگشت به لیست اینفلوئنسرها
</a>
</AlertDescription>
</Alert>
</div>بهترین روشها
- همیشه یک اقدام واضح پیشنهاد دهید — «پاک کردن فیلترها» یا «افزودن اولین آیتم»
- حالت خالی باید شکل کلی محتوای واقعی را حفظ کند (header جدول باقی بماند)
- Skeleton قبل از empty state نمایش داده میشود — چیدمان نباید در انتقال تغییر کند
- پیام خالی را مثبت بنویسید: «اینفلوئنسری اضافه نشده» نه «هیچ اینفلوئنسری وجود ندارد»
دامهای رایج
- نمایش صفحه سفید بدون هیچ پیامی
- حذف header جدول در حالت خالی — ناگهانی به نظر میرسد
- استفاده از
ErrorStateبه جای empty state برای نتیجه صفر — این خطا نیست - نوشتن پیام منفی («هیچ نتیجهای نیست») به جای راهنما («فیلترها را تغییر دهید»)
صفحات مرتبط
- الگوهای خطا — وقتی بارگذاری با خطا مواجه شد
- الگوهای بارگذاری — Skeleton قبل از empty state
- Empty — کامپوننت آماده برای حالت خالی
- DataTable — prop
emptyStateداخلی