Tablev1.2.1
جدول داده با سرستونهای راستچین، مناسب داشبوردها و فهرستهای سازمانی؛ انتخاب سطر، مرتبسازی، حالت راهراه و بارگذاری بدون هیچ وابستگی بیرونی روی همین پنج عنصر استاندارد HTML ساخته شدهاند.
این کامپوننت فعلاً برای ۱ فریمورک از ۴ فریمورک آماده است.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
نصب
با CLI اختصاصی digdesign کامپوننت را از رجیستری دیگ نصب کنید؛ وابستگیها و فایلها خودکار اضافه میشوند.
npx digdesign@latest add https://docs.digdesign.ir/r/table.jsonpnpm dlx digdesign@latest add https://docs.digdesign.ir/r/table.jsonyarn dlx digdesign@latest add https://docs.digdesign.ir/r/table.jsonbunx --bun digdesign@latest add https://docs.digdesign.ir/r/table.jsonاین کامپوننت هنوز برای Vue پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک در دست کار است.
این کامپوننت هنوز برای Svelte پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک در دست کار است.
این کامپوننت هنوز برای Angular پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک در دست کار است.
استفاده
import {
Table,
TableBody,
TableCell,
TableHead,
TableHeader,
TableRow,
} from "@/components/ui/table"این کامپوننت هنوز برای Vue پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک در دست کار است.
این کامپوننت هنوز برای Svelte پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک در دست کار است.
این کامپوننت هنوز برای Angular پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک در دست کار است.
ترکیب اجزا
ابزارهای جدول (جستوجو، فیلتر، تبها) بیرونِ قاب و ۳۲ پیکسل بالای جدول مینشینند؛ فقط خودِ جدول با variant="card" قاب میگیرد و صفحهبندی هم بیرونِ قاب، زیرِ آن.
جدول از اجزای Table، TableHeader، TableBody، TableFooter، TableRow، TableHead، TableCell و TableCaption تشکیل میشود؛ همان ساختار HTML استاندارد با استایل راستبهچپ.
انتخاب و مرتبسازی هم به همین روش ترکیبی اضافه شدهاند: TableRow با پراپ value قابلانتخاب میشود، TableCheckboxCell/TableSelectAllCheckbox چکباکس متصل به همان انتخاب را رندر میکنند، و TableHead با پراپ sortKey قابلمرتبسازی میشود. هیچکدام به کتابخانهٔ خارجی وابسته نیستند، فقط Context داخلیِ خود Table.
دسترسپذیری
- از عناصر معنایی table استفاده میکند؛ صفحهخوانها ساختار سطر و ستون را کامل درک میکنند.
- TableCaption توضیح جدول را برای همهٔ کاربران فراهم میکند.
- سطر قابلانتخاب aria-selected و ستون قابلمرتبسازی aria-sort مناسب خودش را میگیرد؛ چکباکسهای انتخاب aria-label فارسی دارند.
- برای عناصر کنشپذیر داخل سلول (دکمه، لینک) روی onClick از event.stopPropagation() استفاده کنید تا با تاگلشدن انتخاب سطر تداخل نکند.
- سطر قابلانتخاب با کیبورد هم کار میکند؛ Tab آن را فوکوس میکند و Enter/Space همان انتخاب را تاگل میکند، بدون نیاز به موس یا لمس.
مرجع API
Table
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| color | "default" | "primary" | "success" | "warning" | "destructive" | "info" | "default" | رنگ پسزمینه و نوارِ لبهٔ سطرِ انتخابشده؛ default خاکستریآبیِ muted با نوارِ primary. |
| variant | "plain" | "card" | "plain" | card جدول را در قابِ گرد با حاشیه میگذارد. |
| layout | "auto" | "fixed" | "auto" | fixed عرضِ ستونها را از سرستون میگیرد؛ با مرتبسازی و فیلتر ستونها پرش نمیکنند. به هر TableHead عرض بدهید. |
| size | "default" | "compact" | "default" | تراکم فاصلهٔ عمودی TableHead و TableCell. |
| selectionMode | "none" | "single" | "multiple" | "none" | حالت انتخاب سطر. |
| selectedKeys / defaultSelectedKeys | Set<string> | — | کلیدهای انتخابشده (کنترلشده/غیرکنترلشده). |
| onSelectionChange | (keys: Set<string>) => void | — | با هر بار تغییر انتخاب صدا زده میشود. |
| disallowEmptySelection | boolean | false | اگر true باشد، همیشه حداقل یک سطر انتخابشده باقی میماند. |
| sortDescriptor / defaultSortDescriptor | { column: string; direction: "ascending" | "descending" } | — | ستون و جهت مرتبسازی فعال (کنترلشده/غیرکنترلشده). |
| onSortChange | (descriptor: SortDescriptor) => void | — | با کلیک روی یک TableHead دارای sortKey صدا زده میشود. |
| ...props | React.ComponentProps<"table"> | — | همهٔ ویژگیهای تگ table پشتیبانی میشود. |
TableHeader
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| sticky | boolean | false | سرستون را هنگام اسکرول عمودی بالای جدول ثابت نگه میدارد. |
TableBody
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| striped | boolean | false | سطرهای فرد را با پسزمینهٔ خاکستری راهراه میکند. |
TableRow
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| value | string | — | کلید یکتای سطر؛ فقط با دادن این پراپ سطر قابلانتخاب میشود. |
| disabled | boolean | false | سطر را از انتخاب و کلیک خارج میکند (بدون مخفیکردن آن). |
TableHead / TableCell
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| align | "start" | "center" | "end" | — | ترازبندی افقی محتوای سلول/سرستون. |
| sortKey | string | — | فقط TableHead؛ ستون را قابلمرتبسازی میکند. |
| pin | "start" | "end" | — | ستون را هنگام اسکرول افقی به لبهٔ شروع/پایان جدول میچسباند؛ روی TableHead و TableCell همان ستون با هم بدهید. |
TableCheckboxCell / TableSelectAllCheckbox
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| TableCheckboxCell | Omit<React.ComponentProps<"td">, "children" | "align"> | — | چکباکس انتخاب همان سطر؛ باید داخل یک TableRow دارای value قرار بگیرد. |
| TableSelectAllCheckbox | Omit<React.ComponentProps<"th">, "children" | "align"> | — | چکباکس «انتخاب همه»؛ در selectionMode="multiple" استفاده میشود. |
TableEmpty / TableLoadingRow
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| colSpan | number | — | برابر تعداد ستونهای جدول. |
| children | React.ReactNode | "در حال بارگذاری…" (فقط TableLoadingRow) | متن یا محتوای دلخواه داخل سطر. |
...props
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| ...props | React.ComponentProps<…> | — | هر جزء تمام ویژگیهای عنصر HTML متناظر خود را میپذیرد. |
TableCellStack
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| title | React.ReactNode | — | خطِ اول، متنِ اصلی. |
| description | React.ReactNode | — | خطِ دوم، کوچک و کمرنگ (ایمیل، تاریخ)؛ ۶ پیکسل زیرِ خطِ اول. |
| media | React.ReactNode | — | آواتار یا لوگو کنارِ دو خط؛ آواتار همیشه آیکون (AvatarGenderIcon). |
| descriptionDir | "ltr" | "rtl" | — | جهتِ خطِ دوم، مثلاً ltr برای ایمیل. |
این کامپوننت هنوز برای Vue پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک در دست کار است.
این کامپوننت هنوز برای Svelte پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک در دست کار است.
این کامپوننت هنوز برای Angular پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک در دست کار است.
نمونهها
جستوجو، فیلتر و صفحهبندی
جستوجو و دکمهٔ فیلتر بالای کارت، پنل فیلتر که باز و بسته میشود، فیلترهای اعمالشده بهصورت چیپ حذفشدنی با شمار نتیجه، و صفحهبندی با انتخاب تعداد ردیف. شمار نتیجه با aria-live اعلام میشود.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
ردیفهای راهراه
پراپ striped روی TableBody، پسزمینهٔ ردیفهای فرد را با یک رنگ خنثای توپر جدا میکند، نه با opacity، برای اینکه رنگ زیرین صفحه از پشتش دیده نشود.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
تراکم فشرده
size="compact" روی Table، فاصلهٔ عمودی TableHead و TableCell را کم میکند؛ برای جدولهای پرداده در فضای محدود (مثل پنل کناری) مناسبتر است.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
سرستون ثابت
sticky روی TableHeader، هنگام اسکرول عمودی داخل یک ظرف با ارتفاع محدود، سرستون را بالای جدول نگه میدارد.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
ستون چسبان هنگام اسکرول افقی
pin="start" روی TableHead و TableCell همان ستون، آن را هنگام اسکرول افقی چسبان نگه میدارد تا کاربر مرجع سطر (اینجا مشتری) را در حین دیدن ستونهای دیگر گم نکند؛ خط جداکننده و اسکرولبارِ محو (بدون JS) هم نشان میدهد جدول عریضتر از دیدش است.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
پنهانکردن ستونهای کماهمیت در عرض کم
برای جدول با ستونهای زیاد، اسکرول افقی همیشه بهترین راه نیست؛ گاهی بهتر است ستونهای کماهمیتتر زیر یک بریکپوینت اصلاً رندر نشوند. چون TableHead/TableCell همان th/td استاندارد را میگیرند، کلاسهای نمایشِ Tailwind مثل hidden md:table-cell مستقیم روی آنها کار میکند؛ کوچککردن پنجرهٔ مرورگر را امتحان کنید.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
رنگ سطر انتخابشده
رنگ محور مستقلی از حالتهای دیگر است؛ فقط پسزمینهٔ سطر/سلولِ انتخابشده را تعیین میکند، از توکنهای ملایمِ همان رنگ (نه opacity روی رنگ اصلی) تا در هر دو تم خوانا بماند.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
انتخاب تکی
با selectionMode="single" کلیک روی هر سطر (فقط با دادن value) آن را انتخاب و انتخاب قبلی را برمیدارد؛ برای این حالت نیازی به چکباکس نیست.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
انتخاب چندگانه
با selectionMode="multiple"، TableSelectAllCheckbox در سرستون و TableCheckboxCell در هر سطر، چکباکسهای بههممتصل میسازند؛ حالت انتخاب کنترلشده است، پس شمار انتخابشدهها بیرون از جدول هم قابلنمایش است.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
همیشه یک انتخاب باقی بماند
disallowEmptySelection مانع خالیشدن کامل انتخاب میشود؛ کاربردی برای فیلترهای تکی مثل «نمایش بر اساس» که همیشه باید یک مقدار فعال داشته باشند.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
ردیفهای غیرفعال
پراپ disabled روی TableRow، سطر را از انتخاب و کلیک خارج میکند و کمرنگش میکند؛ خودِ داده همچنان دیده میشود، فقط قابلتعامل نیست.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
مرتبسازی ستونها
sortKey روی TableHead، ستون را قابلکلیک میکند و آیکون جهت مرتبسازی را نشان میدهد؛ Table فقط ستون/جهت فعال را نگه میدارد (sortDescriptor)، مرتبسازی واقعیِ آرایه با شماست، مثل مثال زیر.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
سلولهای سفارشی
هر سلول میتواند هر عنصری بگیرد، آواتار، نشان رنگی یا منوی کنش. برای اینکه دکمهٔ کنش با تاگلشدن انتخاب سطر تداخل نکند، روی onClick آن stopPropagation بزنید.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
حالت خالی
TableEmpty یک سطر تمامعرض (با colSpan برابر تعداد ستونها) برای وقتیکه فهرست دادهای ندارد رندر میکند.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
حالت بارگذاری
TableLoadingRow یک نشانگر چرخان بههمراه متن دلخواه نشان میدهد؛ جایگزین مناسب TableBody تا زمانیکه داده از سرور برسد.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
جدول صفحهبندیشده
Table هیچ منطق صفحهبندی ندارد؛ کامپوننت Pagination موجود دیگ را زیر جدول بگذارید و state صفحهٔ فعلی را خودتان نگه دارید.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
خالی (Empty)
این دو حالت یکی نیستند و پیامشان هم نباید یکی باشد. «هنوز موردی ثبت نشده» با راهنمای ساخت، در برابر «نتیجهای پیدا نشد» با راهنمای برداشتن فیلتر. پیام را در یک سلول با colSpan بگذارید تا وسط جدول بنشیند.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
در حال دریافت (Loading)
جدول خالی نشان ندهید و اسپینر وسط صفحه هم نگذارید. سرستونها را نگه دارید و بهجای سطرها جای خالیِ همساختار بگذارید؛ اینطور چیدمان موقع رسیدن داده نمیپرد.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
متن بلند (Overflow)
اسکرول افقی آخرین راهحل است، نه اولین. ستونها را با table-fixed و عرض درصدی جمع کنید و اجازه دهید متن بشکند. سلولهای جدول بهطور پیشفرض whitespace-nowrap دارند، پس برای شکستن باید whitespace-normal بدهید.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
کدام نمونه برای کدام موقعیت
| نمونه | کجا به کار میآید |
|---|---|
| جستوجو، فیلتر و صفحهبندی | فهرست درخواستها، سفارشها یا کاربران در پنل مدیریت |
| ردیفهای راهراه | پراپ striped روی TableBody، پسزمینهٔ ردیفهای فرد را با یک رنگ خنثای توپر جدا میکند، نه با opacity، برای اینکه رنگ زیرین صفحه از پشتش دیده نشود. |
| تراکم فشرده | size="compact" روی Table، فاصلهٔ عمودی TableHead و TableCell را کم میکند؛ برای جدولهای پرداده در فضای محدود (مثل پنل کناری) مناسبتر است. |
| سرستون ثابت | sticky روی TableHeader، هنگام اسکرول عمودی داخل یک ظرف با ارتفاع محدود، سرستون را بالای جدول نگه میدارد. |
| ستون چسبان هنگام اسکرول افقی | جدولهای پرستون در عرض کم (موبایل) |
| پنهانکردن ستونهای کماهمیت در عرض کم | جدولهای پرستون روی موبایل |
| رنگ سطر انتخابشده | رنگ محور مستقلی از حالتهای دیگر است؛ فقط پسزمینهٔ سطر/سلولِ انتخابشده را تعیین میکند، از توکنهای ملایمِ همان رنگ (نه opacity روی رنگ اصلی) تا در هر دو تم خوانا بماند. |
| انتخاب تکی | با selectionMode="single" کلیک روی هر سطر (فقط با دادن value) آن را انتخاب و انتخاب قبلی را برمیدارد؛ برای این حالت نیازی به چکباکس نیست. |
| انتخاب چندگانه | با selectionMode="multiple"، TableSelectAllCheckbox در سرستون و TableCheckboxCell در هر سطر، چکباکسهای بههممتصل میسازند؛ حالت انتخاب کنترلشده است، پس شمار انتخابشدهها بیرون از جدول هم قابلنمایش است. |
| همیشه یک انتخاب باقی بماند | disallowEmptySelection مانع خالیشدن کامل انتخاب میشود؛ کاربردی برای فیلترهای تکی مثل «نمایش بر اساس» که همیشه باید یک مقدار فعال داشته باشند. |
| ردیفهای غیرفعال | پراپ disabled روی TableRow، سطر را از انتخاب و کلیک خارج میکند و کمرنگش میکند؛ خودِ داده همچنان دیده میشود، فقط قابلتعامل نیست. |
| مرتبسازی ستونها | sortKey روی TableHead، ستون را قابلکلیک میکند و آیکون جهت مرتبسازی را نشان میدهد؛ Table فقط ستون/جهت فعال را نگه میدارد (sortDescriptor)، مرتبسازی واقعیِ آرایه با شماست، مثل مثال زیر. |
| سلولهای سفارشی | هر سلول میتواند هر عنصری بگیرد، آواتار، نشان رنگی یا منوی کنش |
| حالت خالی | TableEmpty یک سطر تمامعرض (با colSpan برابر تعداد ستونها) برای وقتیکه فهرست دادهای ندارد رندر میکند. |
| حالت بارگذاری | TableLoadingRow یک نشانگر چرخان بههمراه متن دلخواه نشان میدهد؛ جایگزین مناسب TableBody تا زمانیکه داده از سرور برسد. |
| جدول صفحهبندیشده | Table هیچ منطق صفحهبندی ندارد؛ کامپوننت Pagination موجود دیگ را زیر جدول بگذارید و state صفحهٔ فعلی را خودتان نگه دارید. |
| خالی (Empty) | جدولی که هنوز داده ندارد، در برابر فیلتری که نتیجه نداده |
| در حال دریافت (Loading) | جدولی که دادهاش با تاخیر میآید |
| متن بلند (Overflow) | جدولی با نامها و توضیحهای فارسیِ طولانی |
دستورالعمل استفاده
ستونهای عددی همیشه با یک قاعدهٔ ثابت همترازند
انجام بده
روی TableHead و TableCell ستون مبلغ، یکدست className="text-end" بگذارید تا عددها زیر هم و قابل مقایسه بمانند.
انجام نده
اگر ترازبندی ستون عددی سطر به سطر فرق کند، چشم نمیتواند مبالغ را سریع با هم مقایسه کند.
سرستونها اسم کوتاه و هموزن باشند
انجام بده
هر TableHead یک اسم کوتاه برای همان ستون است؛ طول و لحن سرستونها با هم یکسان میماند.
انجام نده
قاطیکردن سرستون اسمی با یک جملهٔ کامل، هم عرض ستون را بههم میزند و هم خواندن جدول را کند میکند.
ردیف فقط وقتی قابلکلیک بهنظر برسد که واقعاً هست
انجام بده
برای سطرهای قابلانتخاب یا با onRowAction از cursor-pointer پیشفرض خود Table استفاده کنید (فقط با دادن value ایجاد میشود)؛ برای سطرهای صرفاً نمایشی هیچ value ندهید.
انجام نده
دادن onClick به یک سطر بدون هیچ نشانهٔ بصری، کاربر را وادار میکند تصادفی همهجا کلیک کند تا بفهمد چه چیزی قابلکلیک است.