حالت خطا (ErrorState)
نمایش وضعیت خطا با پیام و دکمه تلاش مجدد
معرفی
کامپوننت ErrorState برای نمایش وضعیت خطا در هنگام بارگذاری داده استفاده میشود.
در صفحه: state قالب
در صفحههای اپلیکیشن ErrorState را خودتان نمینویسید: درخواستی که شکست خورد state={pageState(…)} قالب صفحه است (ListPage، DetailPage، DashboardPage…) یا
state همان DetailSection و DashboardChart، و قالب ErrorState را با متن DS و «تلاش مجدد» جای محتوا میگذارد.
صفحهای که فرو ریخت (error.tsx) UtilityPage kind="500" است. الگوهای خطا را
ببینید.
چه زمانی استفاده کنیم:
- جایی که قالبی حالت را نمیکشد (یک
Sheet، یک پنل، محتوای یکCustomPage): خطای بارگذاری داده با امکان تلاش مجدد - وقتی بخشی از چنین جزئی (نه کل صفحه) دچار خطا شده است
چه زمانی استفاده نکنیم:
- برای خطاهای validation فرم — از
FormMessageاستفاده کنید - برای اعلانهای خطای toast — از
Sonnerاستفاده کنید - برای پیامهای warning — از
Calloutاستفاده کنید
اتصال به سرور ممکن نشد
زمین بازی
با تغییر تنظیمات زیر، پیشنمایش زنده را مشاهده کنید.
دادهها بارگذاری نشد
دوباره تلاش کنید.
import { ErrorState } from '@partodata/ui'
<ErrorState title="دادهها بارگذاری نشد" message="دوباره تلاش کنید." />استفاده
import { ErrorState } from '@partodata/ui'
;<ErrorState onRetry={() => refetch()} />با پیام سفارشی
<ErrorState message="اتصال به سرور ممکن نشد" retryLabel="تلاش دوباره" onRetry={() => refetch()} />با عنوان
title یک عنوان واقعی (<h3>) بالای پیام میسازد، با وزن یگانهٔ عنوانها (600)؛ در اندازهٔ پیشفرض نقش عنوان کارت است (14 / 600). پیام متن خواندنی است و از نسخهٔ 4.0 در اندازهٔ متن بدنه (14) نمایش داده میشود، نه 12. بدون title، چیدمان همان حالت فقطپیام است.
<ErrorState title="بارگذاری گزارش ناموفق بود" message="اتصال به سرور ممکن نشد" onRetry={() => refetch()} />سطح عنوان بهطور پیشفرض h3 است. با titleAs آن را با ساختار عنوانهای صفحه هماهنگ کنید: h2 برای خطای کل صفحه که زیر h1 صفحه مینشیند، و p داخل کارتی که عنوان خودش را دارد. ظاهر عنوان با titleAs تغییر نمیکند.
<ErrorState title="بارگذاری صفحه ناموفق بود" titleAs="h2" size="lg" onRetry={() => reset()} />محتوای اضافه (children)
هر چه بهعنوان فرزند بدهید، پس از پیام و دکمهٔ تلاش مجدد نمایش داده میشود؛ مثلاً یک اقدام دوم یا یک خط توضیح. فرزندان جای پیام را نمیگیرند: متن اصلی را با message بدهید (بدون آن، پیام پیشفرض نمایش داده میشود).
<ErrorState message="این بخش در حال حاضر در دسترس نیست." onRetry={() => refetch()}>
<Button variant="outline" onClick={() => router.push('/')}>
بازگشت به صفحهٔ اصلی
</Button>
</ErrorState>پیام را با فرزندان نسازید
اگر پیام سفارشی و دکمهٔ تلاش مجدد را بهصورت فرزند بدهید و message را ندهید، دو پیام نمایش داده میشود: پیام پیشفرض
«خطا در بارگذاری دادهها» و بعد پیام شما. در حالت توسعه یک هشدار در کنسول چاپ میشود. متن را با message و تابع تلاش
مجدد را با onRetry بدهید و فرزندان را فقط برای محتوای اضافه نگه دارید.
تا 3٫x
تا پیش از 4.0 فرزندان ErrorState بدون هیچ خطایی دور ریخته میشدند، و title همان ویژگی HTML بود که فقط یک راهنمای
شناور (tooltip) میساخت. هر دو اکنون دیده میشوند. description و action ویژگی این جزء نیستند: متن را با message
و اقدام اضافه را بهصورت فرزند بدهید.
اندازهها
خطا
خطا در بارگذاری
<ErrorState size="xs" onRetry={() => {}} />
<ErrorState size="sm" onRetry={() => {}} />
<ErrorState size="md" onRetry={() => {}} />
<ErrorState size="lg" onRetry={() => {}} />
<ErrorState size="xl" onRetry={() => {}} />| اندازه | عنوان (600) | پیام | دکمهٔ تلاش مجدد |
|---|---|---|---|
xs | 13 | 13 | 26 |
sm (پیشفرض) | 14 | 14 | 30 |
md | 16 | 14 | 30 |
lg | 18 | 14 | 38 |
xl | 20 | 16 | 42 |
عنوان هیچگاه از پیام کوچکتر نیست: در xs و sm هماندازهٔ پیام است و وزن 600 آن را جدا میکند، و از md یک پله بزرگتر است. آیکون دکمهٔ تلاش مجدد آیکون شروعِ Button است و اندازه و فاصلهاش را از پلهٔ همان دکمه میگیرد.
تا 3٫x پیام در lg و xl بزرگتر بود (16 و 18 پیکسل؛ ErrorBoundary هم پیشفرضش lg است). هیچ ویژگیای آن را برنمیگرداند؛ اگر جایی لازم است، روی ریشه (یا روی ErrorBoundary) کلاس بدهید: className="[&_[data-slot=error-state-message]]:text-base" برای 16 پیکسل.
بدون دکمه تلاش مجدد
<ErrorState message="خطایی رخ داد" />راهنمای استفاده
بکنید
- همیشه
onRetryرا ارائه دهید تا کاربر بتواند بدون refresh صفحه تلاش مجدد کند - پیام خطا را واضح و کاربرپسند بنویسید (نه پیام فنی سرور) - ازsizeمناسب استفاده کنید —smبرای کارتها،mdبرای بخشها،lgبرای صفحه کامل
نکنید
- پیامهای خطای فنی (stack trace، کد خطا) را مستقیماً نمایش ندهید - از ErrorState برای خطاهای validation فرم استفاده
نکنید — از
FormMessageاستفاده کنید - بدون دکمه تلاش مجدد، کاربر را در وضعیت خطا رها نکنید
دسترسیپذیری
- از
role="alert"برای اعلام خطا به screen readers استفاده میشود - دکمه تلاش مجدد با کیبورد قابل دسترسی است
- آیکون خطا دارای
aria-hiddenاست تا screen reader فقط متن را بخواند
جدول ویژگیها
کامپوننتهای مرتبط
- ErrorBoundary — وقتی میخواهید خطاهای runtime React را catch کنید و خودکار ErrorState نمایش دهید
- Callout — وقتی پیام warning یا اطلاعاتی inline نیاز دارید (نه خطای بارگذاری)
- Sonner — وقتی خطا گذرا است و نیاز به اقدام فوری ندارد