جدول Tanstack – یادگیری سریع

جدول واکنشهای اساسی
نمونه ای از یک جدول واکنش ایجاد کنید.
const BasicTable = () => {
......
...
const table = useReactTable({ data, columns })
return (
<div></div>
)
}
data
داده هایی است که جدول در آن وجود دارد. ستون ها باید بر اساس آنچه در جدول قرار دارد تعریف شود. در زیر نحوه تعریف ستون ها در زیر آمده است.
const columns = [
{
header: "ID",
accessorKey: "id",
footer: "ID",
},
{
header: "First Name",
accessorKey: "first_name",
footer: "First Name",
},
{
header: "Last Name",
accessorKey: "last_name",
footer: "Last Name",
},
......
...
]
کاری که هر خاصیت انجام می دهد:
-
header
: این عنوان ستون را که در بالای جدول ظاهر می شود ، تعریف می کند. این همان چیزی است که کاربران به عنوان نام ستون می بینند. -
accessorKey
: این کلید مورد استفاده برای استخراج داده ها از شیء هر ردیف است. این جدول را می گوید که کدام ویژگی از مجموعه داده شما باید در این ستون نمایش داده شود. بنابراین ،accessorKey
باید با نام دقیق ویژگی در اشیاء داده خود مطابقت داشته باشد. -
footer
: شبیه بهheader
، اما متنی را که در پایین ستون به عنوان یک پاورقی ظاهر می شود ، تعریف می کند.
جدول ارائه در JSX:
<table>
<thead>
{table.getHeaderGroups().map((headerGroup) => (
<tr key={headerGroup.id}>
{headerGroup.headers.map((header) => (
<th key={header.id}>
{flexRender(header.column.columnDef.header, header.getContext())}
</th>
))}
</tr>
))}
</thead>
<tbody>
...
</tbody>
<tfoot></tfoot>
</table>
چرا وجود دارد headerGroups
؟ به طور معمول ، وقتی ستون های ساده را تعریف می کنید ، فقط یک ردیف هدر وجود دارد. با این حال ، اگر شما ستونهای گروهی در زیر ستون والدین ، جدول React چندین ردیف هدر ایجاد می کند.
چه می کند header.getContext()
اینجا انجام دهید؟ header.getContext()
یک شیء را ایجاد می کند که حاوی اطلاعات مفیدی در مورد ستون و جدول باشد. سپس این شیء زمینه به آن منتقل می شود flexRender()
، اجازه می دهد تا به درستی هدر را ارائه دهد.
چرا است header.getContext()
لازم است؟
- در
react-table
باheader.column.columnDef.header
می تواند:
1. **A string** (e.g., `"Name"` → just displayed as-is).
2. **A function** (e.g., `({ column }) => {`[`column.id`](http://column.id)`} Column` → needs context to work).
-
اگر
header
است عمل، به یک استدلال نیاز دارد (getContext()
این استدلال را ارائه می دهد). -
flexRender()
این عملکرد را می گیرد و آن را صدا می کند با زمینه لازمبشر
ردیف ها و سلول ها
<table>
<thead>
...
</thead>
<tbody>
{table.getRowModel().rows.map((row) => (
<tr key={row.id}>
{row.getVisibleCells().map((cell) => (
<td key={cell.id}>
{flexRender(cell.column.columnDef.cell, cell.getContext())}
</td>
))}
</tr>
))}
</tbody>
<tfoot>
</tfoot>
</table>
اینگونه است که می توانید داده ها را ارائه دهید. اما داده ها فقط هنگامی ارائه می شوند که GetCorerOwModel در جدول نمونه تنظیم شود:
// import { getCoreRowModel } from "@tanstack/react-table"
const table = useReactTable({
data,
columns,
getCoreRowModel: getCoreRowModel(),
});
پا
<tfoot>
{table.getFooterGroups().map((footerGroup) => (
<tr key={footerGroup.id}>
{footerGroup.headers.map((header) => (
<th key={header.id}>
{flexRender(header.column.columnDef.footer, header.getContext())}
</th>
))}
</tr>
))}
</tfoot>
ارائه سلول سفارشی
const columns = [
......
...
{
header: "Date of Birth",
accessorKey: "dob",
footer: "Date of Birth",
cell: (info) =>
DateTime.fromISO(info.getValue()).toLocaleString(DateTime.DATE_MED),
},
]
در اصل ، اینگونه است که می توانید سلول ها را سفارشی کنید.
پارامتر عملکرد شیء است که می توانید تمام اطلاعات مربوط به سلول خاص را داشته باشید.
عملکرد دسترسی – AccessOrfn
accessorKey
یک خاصیت با ارزش استاتیک است. اما به جای ارزش استاتیک ، ما می توانیم با ارزش پویا با آن داشته باشیم accessorFn
const columns = [
{
header: "ID",
accessorKey: "id",
footer: "ID",
},
{
header: "Name",
accessorFn: (row) => `${row.first_name} ${row.last_name}`, // accessor function
footer: "Name",
},
// {
// header: "First Name",
// accessorKey: "first_name",
// footer: "First Name",
// },
// {
// header: "Last Name",
// accessorKey: "last_name",
// footer: "Last Name",
// },
]
گروه های هدر با ستون های کودک
const columns = [
{
header: "ID",
accessorKey: "id",
footer: "ID",
},
{
header: "Name",
columns: [
{
header: "First",
accessorKey: "first_name",
footer: "First Name",
},
{
header: "Last",
accessorKey: "last_name",
footer: "Last Name",
},
],
},
......
...
];
در اینجا ، این 2 لایه گروه هدر ایجاد می کند. این مانند گروه اول قرار می گیرد ، جیب را ایجاد می کند ID
وت Name
بشر گروه دوم نیز قرار است ID
و بعد First
وت Last
بشر به این ترتیب به هدف ما خدمت نمی کند. بنابراین ، آنها را از این طریق ارائه دهید:
<thead>
{table.getHeaderGroups().map((headerGroup) => (
<tr key={headerGroup.id}>
{headerGroup.headers.map((header) => (
<th key={header.id}>
{header.isPlaceholder
? null
: flexRender(header.column.columnDef.header, header.getContext())}
</th>
))}
</tr>
))}
</thead>;
/*
Parent HeaderGroup > -- Name
Child_ HeaderGroup > ID First Last
*/
Name
هدر دارای ستون های کودک است. این ستون های کودک با هدرهایی که ستون کودک ندارند ادغام می شوند.
بنابراین ، در گروه هدر اول ، متغیرها وجود خواهند داشت. متغیرهای موجود در کد دارای مقادیر تهی خواهند بود.
صفحه بندی
برای داشتن صفحه بندی ، اولین شرایطی که باید تنظیم کنید getPaginationRowModel
در useReactTable
هدف هوک
const table = useReactTable({
data,
columns,
getCoreRowModel: getCoreRowModel(),
getPaginationRowModel: getPaginationRowModel(),
});
اکنون ، دکمه های صفحه بندی را درست بعد از عناصر جدول اضافه کنید:
این رویدادهای دکمه ای کاملاً توضیحی هستند.
به این ترتیب یک درگیری ایجاد می کند. درگیری در شرایطی است که هیچ داده ای وجود ندارد ، باز هم سعی می کند داده های بعدی را بدست آورد و بدیهی است که هیچ داده ای یا خالی نشان نمی دهد. بنابراین ، غیرفعال کردن دکمه ها در چنین مواردی راه حل است.
این روشها نیز بسیار توضیحی هستند.
مرتب سازی
اول از همه مجموعه getSortedRowModel
بشر
اکنون ، حالت مرتب سازی را تنظیم کنید (state
دارایی پس از getSortedRowModel
).
سپس ، بعد از هر مقدار هدر ، علامت صعودی و نزولی را تنظیم کنید.
سپس ، اضافه کنید onClick={header.column.getToggleSortingHandler()}
در هدر برای تغییر مرتب سازی.
const [sorting, setSorting] = useState([]);
const table = useReactTable({
data,
columns,
getCoreRowModel: getCoreRowModel(),
getPaginationRowModel: getPaginationRowModel(),
getSortedRowModel: getSortedRowModel(),
state: {
sorting: sorting,
},
onSortingChange: setSorting,
});
return (
<div>
<table>
<thead>
{table.getHeaderGroups().map((headerGroup) => (
<tr key={headerGroup.id}>
{headerGroup.headers.map((header) => (
<th
key={header.id}
onClick={header.column.getToggleSortingHandler()}
>
{header.isPlaceholder ? null : (
<div>
{flexRender(
header.column.columnDef.header,
header.getContext()
)}
{
{ asc: "↑", desc: "↓" }[
header.column.getIsSorted() ?? null
]
}
</div>
)}
</th>
))}
</tr>
))}
</thead>
</table>
</div>
);
جدول Tanstack از “ASC” و “DESC” به طور پیش فرض برای مرتب سازی استفاده می کند. بنابراین ، مکانیسم مرتب سازی در اینجا بسیار مستقیم است.
تصفیه
تنظیم کردن getFilteredRowModel()
با
const table = useReactTable({
......
...,
getFilteredRowModel: getFilteredRowModel(),
});
در اینجا ، ما باید حالت فیلتر را نیز تنظیم کنیم.
const [filtering, setFiltering] = useState('')
const table = useReactTable({
......
...,
state: {
...,
globalFilter: filtering
},
onGlobalFiltering: setFiltering
});
این تنظیمات GlobalFilter یک مکانیسم جستجو برای جدول داده ها ایجاد می کند.
اکنون ، یک ورودی جستجو را درست قبل از جدول اضافه کنید:
<>
<input
type="text"
value={filtering}
onChange={(e) => setFiltering(e.target.value)}
/>
<table></table>
</>