Table
Tableは、列のソートや行の選択やクリックイベント機能を備えたテーブルのコンポーネントです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Janet | Fisher | 62 | Janiya_Bode43@hotmail.com |
| 1 | Elenor | Wiza | 18 | Jerrod.Kuhic-Legros25@gmail.com |
| 2 | Sheryl | Bins | 23 | Lora_Emard@yahoo.com |
| 3 | Dimitri | Paucek | 30 | Douglas_Schmidt@gmail.com |
| 4 | Doyle | Ullrich | 58 | Herbert_Rolfson63@yahoo.com |
| 5 | Kristie | Bergnaum | 60 | Emory.Predovic@yahoo.com |
| 6 | Sheldon | Aufderhar | 43 | Brandyn91@gmail.com |
| 7 | Jacob | Hettinger | 58 | April21@hotmail.com |
| 8 | Gwen | Johns | 32 | Bradford_Davis41@gmail.com |
| 9 | Natalia | Langworth-Boyle | 31 | Tamia78@hotmail.com |
interface Data {
id: string
age: number
email: string
firstName: string
lastName: string
}
const columnHelper = createColumnHelper<Data>()
const columns = useMemo(
() => [
columnHelper.accessor("id", { cellProps: { numeric: true } }),
columnHelper.accessor("firstName", { lineClamp: 1 }),
columnHelper.accessor("lastName", { lineClamp: 1 }),
columnHelper.accessor("age", { cellProps: { numeric: true } }),
columnHelper.accessor("email", { lineClamp: 1 }),
],
[],
)
const data = useMemo<Data[]>(
() =>
Array.from({ length: 10 }, (_, index) => ({
id: index.toString(),
age: faker.number.int({ max: 65, min: 18 }),
email: faker.internet.email(),
firstName: faker.person.firstName(),
lastName: faker.person.lastName(),
})),
[],
)
return <Table columns={columns} data={data} withScrollArea />
使い方
import { Table } from "@yamada-ui/react"
import { Table } from "@/components/ui"
import { Table } from "@workspaces/ui"
<Table />
Tableは、内部でtanstack-tableとNativeTableを使用しています。バリアントを変更する
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Dixie | Lesch | 18 | Wm17@gmail.com |
| 1 | Dustin | Mitchell | 19 | Sherri84@gmail.com |
| 2 | Ike | Murazik | 57 | Obie25@gmail.com |
| 3 | Pamela | Daniel | 40 | Gordon35@yahoo.com |
| 4 | Bella | Larson | 38 | Roosevelt.Fisher@gmail.com |
| 5 | Ben | Gutkowski-Raynor | 64 | Myrtle28@gmail.com |
| 6 | Hildegard | Kutch | 32 | Travon_Dibbert14@hotmail.com |
| 7 | Rosa | Dare | 60 | Pasquale_Swift@hotmail.com |
| 8 | Alberto | Wilkinson | 56 | Peyton14@yahoo.com |
| 9 | Doreen | Wolf | 59 | Dessie_Walter@gmail.com |
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Dixie | Lesch | 18 | Wm17@gmail.com |
| 1 | Dustin | Mitchell | 19 | Sherri84@gmail.com |
| 2 | Ike | Murazik | 57 | Obie25@gmail.com |
| 3 | Pamela | Daniel | 40 | Gordon35@yahoo.com |
| 4 | Bella | Larson | 38 | Roosevelt.Fisher@gmail.com |
| 5 | Ben | Gutkowski-Raynor | 64 | Myrtle28@gmail.com |
| 6 | Hildegard | Kutch | 32 | Travon_Dibbert14@hotmail.com |
| 7 | Rosa | Dare | 60 | Pasquale_Swift@hotmail.com |
| 8 | Alberto | Wilkinson | 56 | Peyton14@yahoo.com |
| 9 | Doreen | Wolf | 59 | Dessie_Walter@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<VStack>
<For each={["line", "outline"]}>
{(variant, index) => (
<Table
key={index}
variant={variant}
columns={columns}
data={data}
withScrollArea
/>
)}
</For>
</VStack>
)
サイズを変更する
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Hulda | Parker | 54 | Carlton1@yahoo.com |
| 1 | Edyth | Heaney | 41 | Arielle_Olson@gmail.com |
| 2 | Wilfrid | Howe | 34 | Troy2@gmail.com |
| 3 | Juana | Beahan | 44 | Samara73@yahoo.com |
| 4 | Maximillia | Heller | 31 | Larry_Shields@gmail.com |
| 5 | Carole | Schumm | 29 | Lucia19@gmail.com |
| 6 | Jorge | Bauch | 60 | Matt66@hotmail.com |
| 7 | Johanna | Kerluke | 49 | Elise17@gmail.com |
| 8 | Akeem | Mitchell | 58 | Kendra_Hagenes@yahoo.com |
| 9 | Ivory | Rohan | 45 | Lance.Koss72@gmail.com |
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Hulda | Parker | 54 | Carlton1@yahoo.com |
| 1 | Edyth | Heaney | 41 | Arielle_Olson@gmail.com |
| 2 | Wilfrid | Howe | 34 | Troy2@gmail.com |
| 3 | Juana | Beahan | 44 | Samara73@yahoo.com |
| 4 | Maximillia | Heller | 31 | Larry_Shields@gmail.com |
| 5 | Carole | Schumm | 29 | Lucia19@gmail.com |
| 6 | Jorge | Bauch | 60 | Matt66@hotmail.com |
| 7 | Johanna | Kerluke | 49 | Elise17@gmail.com |
| 8 | Akeem | Mitchell | 58 | Kendra_Hagenes@yahoo.com |
| 9 | Ivory | Rohan | 45 | Lance.Koss72@gmail.com |
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Hulda | Parker | 54 | Carlton1@yahoo.com |
| 1 | Edyth | Heaney | 41 | Arielle_Olson@gmail.com |
| 2 | Wilfrid | Howe | 34 | Troy2@gmail.com |
| 3 | Juana | Beahan | 44 | Samara73@yahoo.com |
| 4 | Maximillia | Heller | 31 | Larry_Shields@gmail.com |
| 5 | Carole | Schumm | 29 | Lucia19@gmail.com |
| 6 | Jorge | Bauch | 60 | Matt66@hotmail.com |
| 7 | Johanna | Kerluke | 49 | Elise17@gmail.com |
| 8 | Akeem | Mitchell | 58 | Kendra_Hagenes@yahoo.com |
| 9 | Ivory | Rohan | 45 | Lance.Koss72@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<VStack>
<For each={["sm", "md", "lg"]}>
{(size, index) => (
<Table
key={index}
size={size}
columns={columns}
data={data}
withScrollArea
/>
)}
</For>
</VStack>
)
カラースキームを変更する
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Kate | Hand | 42 | Emmet_Barrows72@hotmail.com |
| 1 | Blanche | Satterfield | 32 | Elsie_Rippin27@gmail.com |
| 2 | Alfonso | Cormier | 51 | Jakob24@hotmail.com |
| 3 | Marvin | Gorczany | 60 | Grace87@yahoo.com |
| 4 | Doug | Schmidt | 62 | Everett60@yahoo.com |
| 5 | Ismael | O'Keefe | 59 | Myrtis.West27@hotmail.com |
| 6 | Norberto | Carroll | 36 | Vivian12@gmail.com |
| 7 | Joaquin | Vandervort | 51 | Filomena86@yahoo.com |
| 8 | Wilton | Kuphal | 20 | Neal1@hotmail.com |
| 9 | Trever | Labadie | 43 | Doyle.Hartmann12@yahoo.com |
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Kate | Hand | 42 | Emmet_Barrows72@hotmail.com |
| 1 | Blanche | Satterfield | 32 | Elsie_Rippin27@gmail.com |
| 2 | Alfonso | Cormier | 51 | Jakob24@hotmail.com |
| 3 | Marvin | Gorczany | 60 | Grace87@yahoo.com |
| 4 | Doug | Schmidt | 62 | Everett60@yahoo.com |
| 5 | Ismael | O'Keefe | 59 | Myrtis.West27@hotmail.com |
| 6 | Norberto | Carroll | 36 | Vivian12@gmail.com |
| 7 | Joaquin | Vandervort | 51 | Filomena86@yahoo.com |
| 8 | Wilton | Kuphal | 20 | Neal1@hotmail.com |
| 9 | Trever | Labadie | 43 | Doyle.Hartmann12@yahoo.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<VStack>
<For each={["green", "orange"]}>
{(colorScheme, index) => (
<Table
key={index}
colorScheme={colorScheme}
variant="outline"
columns={columns}
data={data}
withScrollArea
/>
)}
</For>
</VStack>
)
外枠の区切り線を追加する
外枠の区切り線を追加する場合は、withBorderをtrueにします。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Hilda | Aufderhar | 47 | Fred_Spencer@gmail.com |
| 1 | Amina | Dach | 43 | Manuel_Wehner@hotmail.com |
| 2 | Constance | Funk | 52 | Emelia.Beier53@hotmail.com |
| 3 | Katie | Renner | 39 | Gilberto.Raynor@hotmail.com |
| 4 | Mitchell | Bashirian | 28 | Joany_Heidenreich@yahoo.com |
| 5 | Jarrett | Vandervort | 44 | Alvina50@hotmail.com |
| 6 | Randall | Schumm | 33 | Orlo3@yahoo.com |
| 7 | Florine | Grimes | 48 | Veronica76@hotmail.com |
| 8 | Lenna | Bernhard-Stark | 44 | Ana97@gmail.com |
| 9 | Nina | Kuvalis | 49 | Kate23@yahoo.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} withBorder withScrollArea />
列の区切り線を追加する
列の区切り線を追加する場合は、withColumnBordersをtrueにします。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Brisa | Lind | 21 | Dayne.Shanahan17@gmail.com |
| 1 | Braulio | Nader | 59 | Golda79@gmail.com |
| 2 | Todd | Gottlieb | 30 | Benjamin.Jones42@hotmail.com |
| 3 | Troy | VonRueden-Schulist | 53 | Carla_Shanahan-Jaskolski37@gmail.com |
| 4 | Wilbert | Kassulke | 65 | Aubrey.Mayer@hotmail.com |
| 5 | Sylvan | Schmeler | 61 | Jace18@hotmail.com |
| 6 | Ernestine | Johnston | 58 | Mario_Hansen@hotmail.com |
| 7 | Joshuah | Medhurst | 33 | Rozella.Powlowski67@yahoo.com |
| 8 | Melyssa | Schaden | 62 | Leonard.Bailey@gmail.com |
| 9 | Keegan | Breitenberg | 31 | Carlotta37@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} withColumnBorders withScrollArea />
行がホバーされたときにハイライトする
行がホバーされたときにハイライトする場合は、highlightOnHoverをtrueにします。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Janie | Koepp | 39 | Scotty.Hagenes@yahoo.com |
| 1 | Ellen | Hamill-Senger | 26 | Donnie.Johnston1@gmail.com |
| 2 | Clifton | Cremin | 40 | Sheri_Cartwright@gmail.com |
| 3 | Cielo | Smith-Kub | 48 | Rollin38@yahoo.com |
| 4 | Sheldon | Bartell | 55 | Alfreda_Mitchell@yahoo.com |
| 5 | Janis | Connelly | 20 | Llewellyn_Halvorson89@yahoo.com |
| 6 | Susan | Lubowitz-White | 43 | Lelah66@yahoo.com |
| 7 | Gregg | Mraz | 30 | Lindsay.McGlynn@hotmail.com |
| 8 | Tomas | Kuhic | 29 | Anabelle_Klocko@gmail.com |
| 9 | Kian | Rogahn | 33 | Abner_Skiles86@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} highlightOnHover withScrollArea />
ストライプを使う
ストライプを使う場合は、stripedをtrueにします。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Ivan | Bruen | 27 | Ronny.Block77@gmail.com |
| 1 | Ismael | Bradtke | 55 | Kristina_Kohler73@hotmail.com |
| 2 | Quinn | Kub | 34 | Benjamin54@hotmail.com |
| 3 | Alexandra | Ondricka | 60 | Hailie.Medhurst38@hotmail.com |
| 4 | Cory | Bosco | 29 | Casimer10@gmail.com |
| 5 | Columbus | Huel | 32 | Therese58@hotmail.com |
| 6 | Spencer | Kovacek | 38 | Haley_Will@yahoo.com |
| 7 | Hazle | Maggio | 52 | Providenci.DAmore-Champlin16@gmail.com |
| 8 | Tavares | Bosco | 23 | Evalyn_Bednar11@yahoo.com |
| 9 | Alex | Schultz | 57 | Eugene21@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} striped withScrollArea />
スクロールエリアを使う
スクロールエリアを使う場合は、withScrollAreaをtrueにします。
| id | firstName | lastName | age | phone | role | status | createdAt | updatedAt | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | Jonathan | Sawayn-Cremin | 33 | Ruby.VonRueden@hotmail.com | 982.550.1646 x61646 | user | active | 12/14/2025 | 11/11/2025 |
| 1 | Mamie | Ernser | 38 | Gordon57@gmail.com | 389-438-4953 x0769 | admin | inactive | 9/9/2025 | 6/25/2025 |
| 2 | Scotty | Wiza | 21 | Doris_Gottlieb@gmail.com | 720.911.3679 x52431 | user | active | 6/28/2025 | 11/25/2025 |
| 3 | Ross | Nolan | 48 | Rudy.Hand@hotmail.com | 741-742-0462 | user | active | 11/4/2025 | 7/18/2025 |
| 4 | Robyn | Schmeler | 47 | Roxanne62@yahoo.com | 272.280.0484 x959 | admin | inactive | 3/22/2026 | 7/16/2025 |
| 5 | Valerie | Rodriguez | 24 | Paris.Dare-Kihn67@gmail.com | 1-883-476-5497 x3186 | admin | inactive | 3/26/2026 | 5/21/2025 |
| 6 | Ted | Gleichner | 24 | Felicia.Wisozk-Schuster@yahoo.com | 1-206-868-7017 | admin | inactive | 1/23/2026 | 4/25/2026 |
| 7 | Janet | Hilll | 27 | Tonya79@hotmail.com | (514) 479-3887 x618 | user | active | 4/14/2026 | 10/25/2025 |
| 8 | Bernard | Mertz | 61 | Enrique_Heidenreich31@gmail.com | (609) 972-2371 x10642 | user | active | 12/6/2025 | 12/7/2025 |
| 9 | Constance | O'Reilly | 21 | Hank_Rolfson59@hotmail.com | 305.469.4841 x2916 | user | active | 12/25/2025 | 6/9/2025 |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columnsFull} data={data} withScrollArea />
ヘッダーグループ
| id | user | |||
|---|---|---|---|---|
| name | age | |||
| firstName | lastName | |||
| 0 | Tracey | Bernier | 40 | Toni.Aufderhar@gmail.com |
| 1 | Berneice | Schmitt | 29 | Roman.Turner37@gmail.com |
| 2 | Andreanne | Brekke | 62 | Ira.Brekke@gmail.com |
| 3 | Ole | Miller | 62 | Ernest.Gibson-Fisher95@hotmail.com |
| 4 | Ignacio | Roob | 53 | Jim0@gmail.com |
| 5 | Clark | Lindgren | 24 | Charlie_Prohaska@hotmail.com |
| 6 | Eveline | Grimes | 19 | Pearlie_Morar42@yahoo.com |
| 7 | Christopher | Kshlerin | 30 | Cornelius_Labadie2@hotmail.com |
| 8 | Alonzo | Orn | 65 | Melanie62@hotmail.com |
| 9 | Yvonne | Auer | 47 | Terrance.Wunsch@yahoo.com |
const columns = useMemo(
() => [
columnHelper.accessor("id", {
footer: (info) => info.column.id,
cellProps: { numeric: true },
}),
columnHelper.group({
id: "user",
columns: [
columnHelper.group({
id: "name",
columns: [
columnHelper.accessor("firstName", {
footer: (info) => info.column.id,
lineClamp: 1,
}),
columnHelper.accessor("lastName", {
footer: (info) => info.column.id,
lineClamp: 1,
}),
],
footer: (info) => info.column.id,
header: (info) => info.column.id,
}),
columnHelper.accessor("age", {
footer: (info) => info.column.id,
cellProps: { numeric: true },
}),
columnHelper.accessor("email", {
footer: (info) => info.column.id,
lineClamp: 1,
}),
],
footer: (info) => info.column.id,
header: (info) => info.column.id,
}),
],
[],
)
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
withBorder
withColumnBorders
withScrollArea
/>
)
フッターグループ
| id | user | |||
|---|---|---|---|---|
| name | age | |||
| firstName | lastName | |||
| 0 | Elijah | Volkman | 58 | Kiarra.Morar@hotmail.com |
| 1 | Lavada | Swift-Nader | 23 | Debra_Batz@gmail.com |
| 2 | Mack | Bergnaum | 59 | Jenna_Grant@yahoo.com |
| 3 | Emanuel | Kessler | 28 | Samir84@yahoo.com |
| 4 | Ryley | Grimes | 60 | Philip.Medhurst-Langosh@yahoo.com |
| 5 | Bart | Lesch | 61 | Roberta.Graham85@hotmail.com |
| 6 | Charlotte | Haag | 27 | Dianne_Murazik@yahoo.com |
| 7 | Rossie | Wiegand | 26 | Isidro_Powlowski35@gmail.com |
| 8 | Whitney | Wolff | 18 | Nico.Boehm6@yahoo.com |
| 9 | Gerard | Sipes | 53 | Beth.Ziemann71@gmail.com |
| id | firstName | lastName | age | |
| name | ||||
| user | ||||
const columns = useMemo(
() => [
columnHelper.accessor("id", {
footer: (info) => info.column.id,
cellProps: { numeric: true },
}),
columnHelper.group({
id: "user",
columns: [
columnHelper.group({
id: "name",
columns: [
columnHelper.accessor("firstName", {
footer: (info) => info.column.id,
lineClamp: 1,
}),
columnHelper.accessor("lastName", {
footer: (info) => info.column.id,
lineClamp: 1,
}),
],
footer: (info) => info.column.id,
header: (info) => info.column.id,
}),
columnHelper.accessor("age", {
footer: (info) => info.column.id,
cellProps: { numeric: true },
}),
columnHelper.accessor("email", {
footer: (info) => info.column.id,
lineClamp: 1,
}),
],
footer: (info) => info.column.id,
header: (info) => info.column.id,
}),
],
[],
)
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
withBorder
withColumnBorders
withFooterGroups
withScrollArea
/>
)
キーボードナビゲーションを無効にする
キーボードナビゲーションを無効にする場合は、enableKeyboardNavigationをfalseに設定します。デフォルトは、trueです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Wendy | Schneider | 24 | Hope.Upton82@yahoo.com |
| 1 | Ralph | Herzog | 48 | Angelita.Lindgren61@hotmail.com |
| 2 | Monroe | Rutherford | 45 | Naomi.Mayert@gmail.com |
| 3 | Una | Sanford | 35 | William_Lockman45@gmail.com |
| 4 | Charlotte | Ledner | 63 | Clark_Klein50@hotmail.com |
| 5 | Aaliyah | Rowe | 36 | Shakira_Mitchell26@hotmail.com |
| 6 | Charlene | Leannon | 43 | Carole78@gmail.com |
| 7 | Elsie | Bergnaum | 23 | Jacquelyn_Armstrong@gmail.com |
| 8 | Aylin | Daniel | 36 | Ayden_Thompson@gmail.com |
| 9 | Bud | Stiedemann | 52 | Mitchell_Powlowski@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableKeyboardNavigation={false}
withScrollArea
/>
)
初回のフォーカス可能なセルを設定する
初回のフォーカス可能なセルを設定する場合は、initialFocusableCellにセルの列と行を指定したオブジェクト({ colIndex: number, rowIndex: number })を設定します。デフォルトは、{ colIndex: 0, rowIndex: 0 }です。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Gust | Hickle | 21 | Anthony.McCullough39@hotmail.com |
| 1 | Mona | Crooks | 32 | Mireya.Marvin@yahoo.com |
| 2 | Kattie | Schneider | 55 | Tom.Rogahn93@gmail.com |
| 3 | Patti | Mosciski | 37 | Brooks23@gmail.com |
| 4 | Tracey | McClure | 54 | Justine_Lynch86@gmail.com |
| 5 | Pamela | Harvey | 42 | Priscilla.Rutherford-Bayer23@gmail.com |
| 6 | Anne | Stroman | 35 | Marianne52@yahoo.com |
| 7 | Darius | Olson | 47 | Russell80@hotmail.com |
| 8 | Malachi | Runolfsson | 34 | Maxine.Miller16@hotmail.com |
| 9 | Kane | Volkman | 62 | Gilbert.Schaefer50@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
initialFocusableCell={{ colIndex: 1, rowIndex: 0 }}
withScrollArea
/>
)
行のクリックイベントをハンドルする
行のクリックイベントをハンドルする場合は、onRowClickを使用します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Lucinda | Kuhic | 31 | Luis.Schamberger64@hotmail.com |
| 1 | Randal | Greenholt | 64 | Charles.Swift71@gmail.com |
| 2 | Beverly | Gleason | 42 | Joy.Ferry@hotmail.com |
| 3 | Lavina | Lowe | 34 | Luz_Hayes7@hotmail.com |
| 4 | Emanuel | Spinka | 61 | Yessenia92@hotmail.com |
| 5 | Cathy | Mraz | 41 | Ike_Rath74@hotmail.com |
| 6 | Becky | Beer | 61 | Edith_Cronin@gmail.com |
| 7 | Jo | Howe | 24 | Megane66@yahoo.com |
| 8 | Kristin | Carroll | 21 | Eric_Crist46@hotmail.com |
| 9 | Isabell | Wuckert | 27 | Jennifer18@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
onRowClick={(row) => console.log(row)}
withScrollArea
/>
)
"use client"をファイルの上部に追加する必要があります。行のダブルクリックイベントをハンドルする
行のダブルクリックイベントをハンドルする場合は、onRowDoubleClickを使用します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Moses | Runolfsdottir | 60 | Dominick.Bartoletti19@gmail.com |
| 1 | Rickie | Morar | 28 | Dina70@gmail.com |
| 2 | Joanny | Walsh | 51 | Wyatt75@gmail.com |
| 3 | Thaddeus | Kshlerin | 51 | Stanley.Kirlin@yahoo.com |
| 4 | Delbert | Bradtke | 57 | Albin_Shields@gmail.com |
| 5 | Agustina | Raynor | 40 | Antonia_Emard66@yahoo.com |
| 6 | Annabell | Kling | 20 | Juan_Altenwerth@hotmail.com |
| 7 | Marco | Reilly | 41 | Alize6@gmail.com |
| 8 | Gianni | Haag | 38 | Danielle_Pagac@yahoo.com |
| 9 | Sherman | Morissette | 22 | Wesley_Boyer@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
onRowDoubleClick={(row) => console.log(row)}
withScrollArea
/>
)
"use client"をファイルの上部に追加する必要があります。デフォルトのソートを設定する
デフォルトのソートを設定する場合は、defaultSortingに配列を設定します。配列のオブジェクトには、ソートをする列のidと方向を設定します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 2 | Nestor | Green | 63 | Adalberto.Walsh3@hotmail.com |
| 6 | Ike | Schuster | 60 | Katherine_Batz@yahoo.com |
| 4 | Johnnie | Ritchie | 42 | Ricky25@gmail.com |
| 5 | Casimir | Rohan | 37 | Michaela_Funk@yahoo.com |
| 3 | Luke | Streich | 36 | Jenna_Koch@yahoo.com |
| 0 | Cody | Ortiz | 35 | Rossie27@yahoo.com |
| 8 | Richmond | Bruen | 33 | Estel.Klocko25@hotmail.com |
| 1 | Josh | Stark | 30 | Tami3@yahoo.com |
| 7 | Carlton | Champlin | 27 | Harold.Thompson48@gmail.com |
| 9 | Jameson | Stroman | 19 | Juana51@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
defaultSorting={[{ id: "age", desc: true }]}
withScrollArea
/>
)
ソートを無効にする
ソートを無効にする場合は、enableSortingをfalseに設定します。デフォルトは、trueです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Winifred | Cremin | 63 | Jarod.Williamson22@gmail.com |
| 1 | Simon | Lind | 47 | Rigoberto_Greenholt@gmail.com |
| 2 | Duane | Murphy | 19 | Kevin.Okuneva@hotmail.com |
| 3 | Tyrone | Stokes-Harber | 26 | Darrel15@yahoo.com |
| 4 | Sammie | Schumm | 65 | Kali.Nolan@yahoo.com |
| 5 | Libbie | Pouros | 35 | Tony.Roob0@gmail.com |
| 6 | Cristina | Steuber | 58 | Steve.Moen@gmail.com |
| 7 | Helga | Graham | 25 | Alma.Block@gmail.com |
| 8 | Laila | MacGyver | 54 | Reginald_Kutch@hotmail.com |
| 9 | Tatum | Considine | 37 | Alvis.Mayert79@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table columns={columns} data={data} enableSorting={false} withScrollArea />
)
複数列のソートを無効にする
複数列のソートを無効にする場合は、enableMultiSortをfalseに設定します。デフォルトは、trueです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Travis | Rodriguez-Homenick | 31 | Bettie_Mraz@hotmail.com |
| 1 | Josephine | Flatley | 27 | Brycen_Gerhold@gmail.com |
| 2 | Francisco | Gerhold | 39 | Aubrey_Sipes16@hotmail.com |
| 3 | Vanessa | Bartell | 44 | Jared.OKon44@yahoo.com |
| 4 | Sven | Schaefer | 52 | Adonis_Daugherty95@hotmail.com |
| 5 | Bradley | Wisozk | 42 | Vanessa.Cole@hotmail.com |
| 6 | Raymundo | Nitzsche | 26 | Eva_Kuhlman@hotmail.com |
| 7 | Aurelio | Bosco | 26 | Toy25@hotmail.com |
| 8 | Vicki | Grant | 63 | Esmeralda.Leannon@hotmail.com |
| 9 | Veronica | Toy | 62 | Aida19@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table columns={columns} data={data} enableMultiSort={false} withScrollArea />
)
最大のソート可能な列数を設定する
最大のソート可能な列数を設定する場合は、maxMultiSortColCountに数値を設定します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Lane | Zieme | 59 | Jeannie38@yahoo.com |
| 1 | Jaren | Grimes | 57 | Gladys.Jaskolski57@hotmail.com |
| 2 | Patti | Nolan-Weber | 23 | Tod.Purdy7@gmail.com |
| 3 | Anthony | Pfannerstill | 54 | Lorena.Kerluke@hotmail.com |
| 4 | Teresa | Senger | 62 | Mitchell90@yahoo.com |
| 5 | Ryder | Anderson | 22 | Candace_Weber8@gmail.com |
| 6 | Jerome | Carter | 31 | Leah_Rath53@yahoo.com |
| 7 | Natasha | Schimmel | 47 | Elizabeth_Wiegand@hotmail.com |
| 8 | Berry | Goodwin | 43 | Noah58@gmail.com |
| 9 | Bruce | Steuber | 48 | Cornelius.Nitzsche@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
maxMultiSortColCount={2}
withScrollArea
/>
)
手動のソートを使う
手動のソートを使う場合は、manualSortingをtrueに設定します。デフォルトは、falseです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Leonel | MacGyver | 32 | Benny.Wisozk66@yahoo.com |
| 1 | Arturo | Leffler | 49 | Brenda39@hotmail.com |
| 2 | Chadrick | Haley | 53 | Vanessa_Welch@yahoo.com |
| 3 | Sammy | Grant | 60 | Olga24@hotmail.com |
| 4 | Fern | Lubowitz | 55 | Jamal_Sanford73@yahoo.com |
| 5 | Everett | Breitenberg | 35 | Jeremy.Koepp@yahoo.com |
| 6 | Maxine | Cummings | 19 | Kristin_Lemke73@yahoo.com |
| 7 | Petra | McLaughlin | 42 | Karli32@hotmail.com |
| 8 | Athena | Hauck-Hintz | 27 | Leo.Jacobs@hotmail.com |
| 9 | Judy | Kling | 26 | Okey_Dickens@hotmail.com |
const defaultData = useMemo<TableData[]>(() => createTableData(), [])
const [data, setData] = useState<TableData[]>(defaultData)
return (
<Table
columns={columns}
data={data}
withScrollArea
enableMultiSort={false}
manualSorting
onSortingChange={(sorting) => {
if (sorting.length) {
const { id, desc } = sorting[0]!
setData((prev) =>
prev.toSorted((a, b) => {
if (isNumber(a[id]) && isNumber(b[id])) {
return desc ? a[id] - b[id] : b[id] - a[id]
} else if (isString(a[id]) && isString(b[id])) {
return desc
? a[id].localeCompare(b[id])
: b[id].localeCompare(a[id])
}
return 0
}),
)
} else {
setData(defaultData)
}
console.log(sorting)
}}
/>
)
"use client"をファイルの上部に追加する必要があります。ソートの切り替えを変更する
デフォルトでは、ソートが有効になったとき、昇順から始まります。もし、降順から始めたい場合は、sortDescFirstをtrueに設定するか、特定の列だけ設定したい場合は、columnsの列ごとにsortDescFirstをtrueに設定します。デフォルトは、falseです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | John | Windler | 32 | Vera_Hintz@hotmail.com |
| 1 | Jerrold | Hackett | 20 | Herbert_Rice71@hotmail.com |
| 2 | Susan | Gerlach | 42 | Jesse.Quigley48@yahoo.com |
| 3 | Creola | Turner | 34 | Donald.Bailey10@gmail.com |
| 4 | Eugene | Mills | 63 | Amy.Bahringer46@gmail.com |
| 5 | Graciela | Barrows | 51 | Robert28@hotmail.com |
| 6 | Hadley | MacGyver | 57 | Jalen95@gmail.com |
| 7 | Ernesto | Herzog-Fay | 27 | Margaret_King83@hotmail.com |
| 8 | Ada | Heller | 26 | Evert_Thompson@gmail.com |
| 9 | Yvonne | Gottlieb | 51 | Lauriane.Hickle27@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} sortDescFirst withScrollArea />
ソートを制御する
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Reanna | Donnelly | 52 | Layne18@gmail.com |
| 1 | Jon | Hoppe | 18 | Alycia_Dooley1@hotmail.com |
| 2 | Sarah | Little | 44 | Claudia25@gmail.com |
| 3 | Helene | Borer | 23 | Alejandro.Keeling@gmail.com |
| 4 | Rosa | Kuphal | 54 | Geneva_Lebsack@gmail.com |
| 5 | Erica | Beer | 28 | Bernard_Glover58@yahoo.com |
| 6 | Kellie | Feil | 65 | Tristian46@yahoo.com |
| 7 | Palma | Deckow | 52 | Sarai62@yahoo.com |
| 8 | Fredy | Klein | 51 | Ezekiel49@hotmail.com |
| 9 | Serenity | Moen | 64 | Antonio.Lind@hotmail.com |
const [sorting, setSorting] = useState<SortingState<TableData>>([
{ id: "age", desc: true },
])
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} withScrollArea />
"use client"をファイルの上部に追加する必要があります。ページネーションを有効にする
ページネーションを有効にする場合は、enablePaginationをtrueに設定し、ページネーションをコントロールするコンポーネントをheaderまたはfooterに設定します。デフォルトは、falseです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Tremaine | Adams | 25 | Ayla.Medhurst@yahoo.com |
| 1 | Arthur | Grimes | 56 | Leonard.Mills@hotmail.com |
| 2 | Fatima | Marvin | 50 | Freda74@hotmail.com |
| 3 | Sadie | Gleason | 19 | Janet68@yahoo.com |
| 4 | Hope | Hoppe | 58 | Becky21@gmail.com |
| 5 | Douglas | Conn | 34 | Dominic_Breitenberg43@hotmail.com |
| 6 | Burdette | Schaden | 55 | Mustafa_Hessel44@yahoo.com |
| 7 | Irving | Schuster | 63 | Mabel22@gmail.com |
| 8 | Kelley | Collins | 41 | Maryjane97@hotmail.com |
| 9 | Oswald | Corkery | 51 | Katherine8@gmail.com |
| 10 | Hubert | Olson | 58 | Winston.Bailey15@yahoo.com |
| 11 | Al | Lockman | 64 | Carley_Ondricka@gmail.com |
| 12 | Jakayla | Padberg | 29 | Maryann.Fadel@gmail.com |
| 13 | Kellie | Nicolas | 41 | Marianne.Collins@hotmail.com |
| 14 | Nettie | Okuneva | 26 | Loretta.Murazik@yahoo.com |
| 15 | Sadye | Padberg | 39 | Tyler_Johns10@gmail.com |
| 16 | Edmond | Erdman | 28 | Malinda.Bradtke@hotmail.com |
| 17 | Ava | Lakin | 36 | Bridget_Boyer38@yahoo.com |
| 18 | Cory | Carroll | 56 | Yasmin.Leuschke44@gmail.com |
| 19 | Imani | Smitham | 56 | Colin_Terry49@yahoo.com |
const { t } = useI18n("table")
const data = useMemo<TableData[]>(() => createTableData(40), [])
return (
<VStack>
<Table
columns={columns}
data={data}
enablePagination
footer={(table) => {
const page = table.getState().pagination.pageIndex + 1
const pageSize = table.getState().pagination.pageSize
const total = table.getPageCount()
return (
<Grid templateColumns="1fr 1fr 1fr" w="full">
<Pagination.Root
size={{ base: "sm", sm: "xs" }}
gridColumn="2 / 3"
page={page}
total={total}
onChange={(page) => table.setPageIndex(page - 1)}
/>
<Select.Root
size={{ base: "sm", sm: "xs" }}
aria-label={t("Page size")}
items={[
{ label: "10", value: "10" },
{ label: "20", value: "20" },
{ label: "30", value: "30" },
{ label: "40", value: "40" },
{ label: "50", value: "50" },
]}
value={pageSize.toString()}
rootProps={{ justifySelf: "end", w: "5xs" }}
onChange={(value) => table.setPageSize(Number(value))}
/>
</Grid>
)
}}
withScrollArea
/>
</VStack>
)
"use client"をファイルの上部に追加する必要があります。デフォルトのページインデックスとページサイズを設定する
デフォルトのページインデックスとページサイズを設定する場合は、defaultPaginationにオブジェクトを設定します。オブジェクトには、pageIndexとpageSizeを設定します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 10 | Alexandria | Gerhold | 38 | Jayme.Lowe93@hotmail.com |
| 11 | Mamie | Fahey | 63 | Mildred.Dietrich77@yahoo.com |
| 12 | Denise | Hodkiewicz | 64 | Elise.Gulgowski@gmail.com |
| 13 | Reina | Cartwright | 58 | Hilton.Vandervort@yahoo.com |
| 14 | Emmet | Gleichner | 22 | James12@gmail.com |
| 15 | Patrick | Barton-Schiller | 41 | Selina.Rempel@yahoo.com |
| 16 | Austin | Rodriguez | 29 | Pat_Bahringer62@yahoo.com |
| 17 | Abigayle | Feil | 53 | Maria25@yahoo.com |
| 18 | Colleen | Grant-Hilpert | 24 | Minnie_Schinner28@yahoo.com |
| 19 | Kasey | Haag | 48 | Jerald91@hotmail.com |
const { t } = useI18n("table")
const data = useMemo<TableData[]>(() => createTableData(20), [])
return (
<VStack>
<Table
columns={columns}
data={data}
enablePagination
defaultPagination={{ pageIndex: 1, pageSize: 10 }}
footer={(table) => {
const page = table.getState().pagination.pageIndex + 1
const pageSize = table.getState().pagination.pageSize
const total = table.getPageCount()
return (
<Grid templateColumns="1fr 1fr 1fr" w="full">
<Pagination.Root
size={{ base: "sm", sm: "xs" }}
gridColumn="2 / 3"
page={page}
total={total}
onChange={(page) => table.setPageIndex(page - 1)}
/>
<Select.Root
size={{ base: "sm", sm: "xs" }}
aria-label={t("Page size")}
items={[
{ label: "10", value: "10" },
{ label: "20", value: "20" },
{ label: "30", value: "30" },
{ label: "40", value: "40" },
{ label: "50", value: "50" },
]}
value={pageSize.toString()}
rootProps={{ justifySelf: "end", w: "5xs" }}
onChange={(value) => table.setPageSize(Number(value))}
/>
</Grid>
)
}}
withScrollArea
/>
</VStack>
)
"use client"をファイルの上部に追加する必要があります。手動のページネーションを使う
手動のページネーションを使う場合は、manualPaginationをtrueに設定します。デフォルトは、falseです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Ansley | Stracke | 25 | Jill_Witting@gmail.com |
| 1 | Dallin | Thompson | 31 | Annette.Smitham73@gmail.com |
| 2 | Eddie | Jones-Johns | 61 | Shania_Ortiz25@gmail.com |
| 3 | Chester | Bins | 30 | Dolores64@gmail.com |
| 4 | Rosalyn | Dietrich | 57 | Arthur.Welch49@yahoo.com |
| 5 | Blanche | Fahey | 61 | Lois.Metz79@gmail.com |
| 6 | Gerson | Volkman | 59 | Reanna45@gmail.com |
| 7 | Brenda | White | 55 | Troy.Fritsch70@hotmail.com |
| 8 | Patricia | Heathcote | 58 | Becky49@yahoo.com |
| 9 | Stacey | Schiller | 23 | Rosetta.Senger65@gmail.com |
| 10 | Ronnie | Spinka | 21 | Luis_Leffler4@yahoo.com |
| 11 | Ronald | Schroeder | 56 | Art81@gmail.com |
| 12 | Esperanza | Gusikowski | 49 | Ahmad_Daugherty@gmail.com |
| 13 | Marcos | Hickle | 30 | Arthur13@yahoo.com |
| 14 | Iva | Grady | 61 | Glen.Stehr87@yahoo.com |
| 15 | Flavio | Baumbach | 30 | Sonya58@yahoo.com |
| 16 | Hannah | Kassulke | 19 | Matt_Schmeler-McDermott16@gmail.com |
| 17 | Nellie | Langosh | 33 | Marlon_Schoen17@gmail.com |
| 18 | Erick | Swift | 24 | Connor_Osinski-Effertz50@gmail.com |
| 19 | Lonny | King | 52 | Lydia_Schaefer13@yahoo.com |
const { t } = useI18n("table")
const [pagination, setPagination] = useState<PaginationState>({
pageIndex: 0,
pageSize: 20,
})
const rowCount = 40
const defaultData = useMemo<TableData[]>(() => createTableData(rowCount), [])
const data = useMemo<TableData[]>(
() =>
defaultData.slice(
pagination.pageIndex * pagination.pageSize,
(pagination.pageIndex + 1) * pagination.pageSize,
),
[defaultData, pagination],
)
return (
<VStack>
<Table
columns={columns}
data={data}
enablePagination
manualPagination
pagination={pagination}
rowCount={rowCount}
onPaginationChange={setPagination}
footer={(table) => {
const page = table.getState().pagination.pageIndex + 1
const pageSize = table.getState().pagination.pageSize
const total = table.getPageCount()
return (
<Grid templateColumns="1fr 1fr 1fr" w="full">
<Pagination.Root
size={{ base: "sm", sm: "xs" }}
gridColumn="2 / 3"
page={page}
total={total}
onChange={(page) => table.setPageIndex(page - 1)}
/>
<Select.Root
size={{ base: "sm", sm: "xs" }}
aria-label={t("Page size")}
items={[
{ label: "10", value: "10" },
{ label: "20", value: "20" },
{ label: "30", value: "30" },
{ label: "40", value: "40" },
{ label: "50", value: "50" },
]}
value={pageSize.toString()}
rootProps={{ justifySelf: "end", w: "5xs" }}
onChange={(value) => table.setPageSize(Number(value))}
/>
</Grid>
)
}}
withScrollArea
/>
</VStack>
)
"use client"をファイルの上部に追加する必要があります。ページネーションを制御する
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Rachael | Little | 57 | Bryan.Jerde8@hotmail.com |
| 1 | Tommie | Kreiger | 62 | Alexa4@hotmail.com |
| 2 | Jake | Gottlieb | 51 | Pearline_Thompson73@gmail.com |
| 3 | Elmore | Hills | 32 | Alessia.Stamm3@gmail.com |
| 4 | Krystel | Weissnat | 44 | Philip.Watsica@yahoo.com |
| 5 | Orlando | Torphy | 26 | Christa_Beahan@gmail.com |
| 6 | Tobin | Champlin | 22 | Erna39@yahoo.com |
| 7 | Arden | Funk | 45 | Angela_Schroeder@hotmail.com |
| 8 | Marco | Cremin | 25 | Victoria99@yahoo.com |
| 9 | Alfonso | Kirlin | 52 | Allie18@gmail.com |
| 10 | Armando | Cassin | 45 | Dominic52@yahoo.com |
| 11 | Katie | Maggio | 43 | Vera_Schneider@yahoo.com |
| 12 | Beatrice | Langworth | 47 | Sergio.Ratke99@hotmail.com |
| 13 | Odell | Tillman | 47 | Wilbur40@gmail.com |
| 14 | Mark | D'Amore | 62 | Nicolas50@yahoo.com |
| 15 | Milton | O'Connell | 59 | Osvaldo.Prosacco@gmail.com |
| 16 | Bella | Lang | 28 | Savion_Boehm@hotmail.com |
| 17 | Beryl | Zulauf-Erdman | 27 | Roberta25@gmail.com |
| 18 | Pearl | Rutherford-Kub | 25 | Joanne68@gmail.com |
| 19 | Deshaun | Kunde | 44 | Elian93@gmail.com |
const [pagination, setPagination] = useState<PaginationState>({
pageIndex: 0,
pageSize: 20,
})
const { t } = useI18n("table")
const data = useMemo<TableData[]>(() => createTableData(40), [])
return (
<VStack>
<Table
columns={columns}
data={data}
enablePagination
pagination={pagination}
onPaginationChange={setPagination}
footer={(table) => {
const page = table.getState().pagination.pageIndex + 1
const pageSize = table.getState().pagination.pageSize
const total = table.getPageCount()
return (
<Grid templateColumns="1fr 1fr 1fr" w="full">
<Pagination.Root
size={{ base: "sm", sm: "xs" }}
gridColumn="2 / 3"
page={page}
total={total}
onChange={(page) => table.setPageIndex(page - 1)}
/>
<Select.Root
size={{ base: "sm", sm: "xs" }}
aria-label={t("Page size")}
items={[
{ label: "10", value: "10" },
{ label: "20", value: "20" },
{ label: "30", value: "30" },
{ label: "40", value: "40" },
{ label: "50", value: "50" },
]}
value={pageSize.toString()}
rootProps={{ justifySelf: "end", w: "5xs" }}
onChange={(value) => table.setPageSize(Number(value))}
/>
</Grid>
)
}}
withScrollArea
/>
</VStack>
)
"use client"をファイルの上部に追加する必要があります。行の選択を有効にする
行の選択を有効にする場合は、enableRowSelectionをtrueに設定します。デフォルトは、falseです。
| id | firstName | lastName | age | ||
|---|---|---|---|---|---|
| 0 | Morgan | Dach | 64 | Ramon70@gmail.com | |
| 1 | Kristine | Goyette-Pacocha | 43 | Clark12@hotmail.com | |
| 2 | Andrea | Bauch | 47 | Lorenzo_Leffler@gmail.com | |
| 3 | Enid | Ebert | 35 | Priscilla.Wiza48@gmail.com | |
| 4 | Era | Murazik | 26 | Bernice.Kunde54@gmail.com | |
| 5 | Saul | Mertz | 29 | Lorraine71@hotmail.com | |
| 6 | Lena | Olson | 40 | Clay_Lakin33@gmail.com | |
| 7 | Jo | Thompson | 35 | Krystal.Jacobson@gmail.com | |
| 8 | Christina | Wunsch | 65 | Jeanie.Bogisich@gmail.com | |
| 9 | Micheal | Abshire | 55 | Jermaine.Mueller19@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} enableRowSelection withScrollArea />
デフォルトの選択された行を設定する
デフォルトの選択された行を設定する場合は、defaultRowSelectionにdataのインデックスをキーとしたオブジェクトを設定します。
| id | firstName | lastName | age | ||
|---|---|---|---|---|---|
| 0 | Jamarcus | Crist | 33 | Ida38@hotmail.com | |
| 1 | Warren | Huels | 21 | Ronny_Carroll42@hotmail.com | |
| 2 | Bernice | Koss-Emard | 29 | Lula_Kuhlman90@yahoo.com | |
| 3 | Tamara | Muller | 35 | Tremayne_Kub@hotmail.com | |
| 4 | Jacquelyn | Hauck | 31 | Theodore_Hackett@yahoo.com | |
| 5 | Annabelle | Simonis | 55 | Sabrina.Crooks97@hotmail.com | |
| 6 | Harmony | Gutmann | 19 | Blanca.Rau@hotmail.com | |
| 7 | Derick | Bradtke-Goyette | 63 | Kendra.Goodwin@gmail.com | |
| 8 | Rosalia | Orn | 59 | Cecilia.Boehm6@gmail.com | |
| 9 | Michael | Carroll | 45 | Darrin.Pouros@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableRowSelection
defaultRowSelection={{ 0: true }}
withScrollArea
/>
)
行のクリックで選択を有効にする
行のクリックで選択を有効にする場合は、selectOnClickRowをtrueに設定します。デフォルトは、falseです。
| id | firstName | lastName | age | ||
|---|---|---|---|---|---|
| 0 | Abdul | Jerde | 64 | Meghan_Cremin@hotmail.com | |
| 1 | Mertie | Beahan | 38 | Homer.Sporer@yahoo.com | |
| 2 | Chase | Davis-Hilll | 23 | Herminia40@hotmail.com | |
| 3 | Vivianne | Boyle | 45 | Hudson4@hotmail.com | |
| 4 | Sonja | Brown | 39 | Raquel.Terry@gmail.com | |
| 5 | Gregoria | Pouros | 64 | Johan_Stamm-Cassin@gmail.com | |
| 6 | Todd | Kohler | 63 | Eldridge.Lang@gmail.com | |
| 7 | Dannie | Kiehn | 24 | Johanna.Aufderhar@gmail.com | |
| 8 | Torrance | McGlynn | 36 | Gwendolyn54@yahoo.com | |
| 9 | Joshua | Lynch | 46 | Vivian63@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableRowSelection
selectOnClickRow
withScrollArea
/>
)
チェックボックスを非表示にする
チェックボックスを非表示にする場合は、withCheckboxをfalseに設定します。デフォルトは、trueです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Kirk | Langosh | 29 | Gerda.Simonis@gmail.com |
| 1 | Anna | Graham | 65 | Randall.Tromp38@gmail.com |
| 2 | Kira | Haley | 45 | Leonard.Lowe78@yahoo.com |
| 3 | Ladarius | Marks-Kozey | 36 | Billie_Funk@gmail.com |
| 4 | Clare | Mills | 42 | Jim69@hotmail.com |
| 5 | Dante | Champlin | 65 | Muriel.Klein@gmail.com |
| 6 | Faith | King | 46 | Dianna19@yahoo.com |
| 7 | Annette | Adams | 27 | Augustine_Stehr9@hotmail.com |
| 8 | Giovani | Kihn | 30 | Kylie.Durgan@yahoo.com |
| 9 | Beverly | Schaden | 56 | Monica11@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableRowSelection
selectOnClickRow
withCheckbox={false}
withScrollArea
/>
)
行を無効にする
行を無効にする場合は、enableRowSelectionに条件の関数を設定します。
| id | firstName | lastName | age | ||
|---|---|---|---|---|---|
| 0 | Ray | Larkin | 28 | Donald.Nicolas@hotmail.com | |
| 1 | Rogelio | Bernhard | 55 | Jeannette_Purdy45@hotmail.com | |
| 2 | Betty | Wintheiser | 40 | Judith24@hotmail.com | |
| 3 | Johanna | Marquardt-Steuber | 54 | Susana_Schneider39@hotmail.com | |
| 4 | Glen | Mills | 52 | James.Larson47@hotmail.com | |
| 5 | Zander | Dach | 26 | Shane98@gmail.com | |
| 6 | Kellie | Lind | 30 | Sarah.Bartell@gmail.com | |
| 7 | Charlene | Wilkinson | 51 | Virginie22@yahoo.com | |
| 8 | Levi | Vandervort | 59 | Lafayette.Sauer22@hotmail.com | |
| 9 | Princess | Walker | 28 | Oliver.Mann@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableRowSelection={(row) => row.id !== "1"}
withScrollArea
/>
)
"use client"をファイルの上部に追加する必要があります。行の選択を制御する
| id | firstName | lastName | age | ||
|---|---|---|---|---|---|
| 0 | Leticia | Russel | 41 | Solon.Lueilwitz@hotmail.com | |
| 1 | Vivianne | Bechtelar | 19 | Aliya82@hotmail.com | |
| 2 | Ettie | Leannon | 26 | Luther14@yahoo.com | |
| 3 | Libbie | Tillman | 27 | Shanelle_Waelchi@yahoo.com | |
| 4 | Muriel | Carroll | 60 | Tavares88@gmail.com | |
| 5 | Chad | Jakubowski | 62 | May.Osinski30@hotmail.com | |
| 6 | Tessie | Fadel | 55 | Ruthie_Watsica@hotmail.com | |
| 7 | Tracey | Lindgren | 43 | Tom17@hotmail.com | |
| 8 | Johanna | Heaney | 49 | Art_Schroeder21@yahoo.com | |
| 9 | Jacey | Cartwright | 32 | Sheri_Kertzmann@yahoo.com |
const [rowSelection, setRowSelection] = useState<RowSelectionState>({})
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableRowSelection
rowSelection={rowSelection}
onRowSelectionChange={setRowSelection}
withScrollArea
/>
)
"use client"をファイルの上部に追加する必要があります。フィルターを使う
フィルターを使う場合は、フィルターをコントロールするコンポーネントをheaderまたはfooterに設定します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Brendon | Watsica | 26 | Cory.Considine@yahoo.com |
| 1 | Veronica | VonRueden | 41 | Claudia88@hotmail.com |
| 2 | Stephen | Franey | 23 | Allison.Weissnat@yahoo.com |
| 3 | Samantha | Wisoky | 23 | Devan7@hotmail.com |
| 4 | Chaim | Thompson | 53 | Devin.Treutel11@gmail.com |
| 5 | Shanon | Botsford | 36 | Donna_Padberg0@gmail.com |
| 6 | Anjali | Steuber | 65 | Megane84@hotmail.com |
| 7 | Della | Romaguera | 42 | Grayson.Schultz-Johnson46@gmail.com |
| 8 | Michael | Price | 63 | Lorna_Altenwerth57@gmail.com |
| 9 | William | Maggio | 30 | Ora5@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<VStack>
<Table
columns={columns}
data={data}
header={(table) => {
const value =
(table.getColumn("email")?.getFilterValue() as string | undefined) ??
""
return (
<InputGroup.Root>
<InputGroup.Element>
<SearchIcon />
</InputGroup.Element>
<Input
placeholder="Filter emails"
value={value}
onChange={(ev) =>
table.getColumn("email")?.setFilterValue(ev.target.value)
}
/>
</InputGroup.Root>
)
}}
withScrollArea
/>
</VStack>
)
"use client"をファイルの上部に追加する必要があります。デフォルトのフィルターを設定する
デフォルトのフィルターを設定する場合は、defaultColumnFiltersに配列を設定します。配列のオブジェクトには、フィルターする列のidと値を設定します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Roy | Huels | 25 | Ryley_Fay@gmail.com |
| 4 | Hilda | Watsica | 21 | Natasha14@gmail.com |
| 7 | Regina | Franecki | 50 | Betsy_Gutkowski@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<VStack>
<Table
columns={columns}
data={data}
defaultColumnFilters={[{ id: "email", value: "gmail" }]}
header={(table) => {
const value =
(table.getColumn("email")?.getFilterValue() as string | undefined) ??
""
return (
<InputGroup.Root>
<InputGroup.Element>
<SearchIcon />
</InputGroup.Element>
<Input
placeholder="Filter emails"
value={value}
onChange={(ev) =>
table.getColumn("email")?.setFilterValue(ev.target.value)
}
/>
</InputGroup.Root>
)
}}
withScrollArea
/>
</VStack>
)
"use client"をファイルの上部に追加する必要があります。フィルターを制御する
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Justyn | Ward | 19 | Cielo7@hotmail.com |
| 1 | Alonzo | Hirthe | 49 | Jerome32@gmail.com |
| 2 | Josephine | Kris | 32 | Earl_Spinka6@hotmail.com |
| 3 | Sergio | Lindgren | 21 | Liam50@yahoo.com |
| 4 | Roxanne | Franey | 26 | Mario.Moen2@gmail.com |
| 5 | Clifford | Boyle | 24 | Genevieve_Shanahan64@gmail.com |
| 6 | Billy | Tillman | 30 | Omar86@gmail.com |
| 7 | Maximus | Corwin | 50 | Norberto.Emmerich79@gmail.com |
| 8 | Filiberto | Reichert | 54 | Bryan.Hoeger96@gmail.com |
| 9 | Rachael | Dicki | 63 | Hudson_Hilll@gmail.com |
const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([
{ id: "email", value: "" },
])
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<VStack>
<Table
columns={columns}
data={data}
columnFilters={columnFilters}
onColumnFiltersChange={setColumnFilters}
header={(table) => {
const value =
(table.getColumn("email")?.getFilterValue() as string | undefined) ??
""
return (
<InputGroup.Root>
<InputGroup.Element>
<SearchIcon />
</InputGroup.Element>
<Input
placeholder="Filter emails"
value={value}
onChange={(ev) =>
table.getColumn("email")?.setFilterValue(ev.target.value)
}
/>
</InputGroup.Root>
)
}}
withScrollArea
/>
</VStack>
)
"use client"をファイルの上部に追加する必要があります。列のサイズ変更を有効にする
列のサイズ変更を有効にする場合は、enableColumnResizingをtrueに設定します。デフォルトは、falseです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Tatum | Friesen | 57 | Bonnie_Stracke27@yahoo.com |
| 1 | Tyrese | Swift | 20 | Orpha.Cremin@yahoo.com |
| 2 | Daryl | Wisoky | 62 | Lucia.Morissette65@hotmail.com |
| 3 | Stephen | Fisher | 24 | Rickey57@gmail.com |
| 4 | Amina | Kling | 55 | Mamie86@gmail.com |
| 5 | Dina | Hettinger | 61 | Dolores.Johnson@gmail.com |
| 6 | Stewart | Daugherty | 42 | Louise_Kessler@gmail.com |
| 7 | Jordon | Marks | 54 | Buster.Steuber95@yahoo.com |
| 8 | Jimmy | Konopelski | 52 | Lora63@gmail.com |
| 9 | Eula | Ward | 65 | Preston_Block95@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableColumnResizing
withBorder
withColumnBorders
/>
)
列のサイズ変更の方法を変更する
デフォルトでは、列のサイズ変更のタイミングは、ドラッグしている間に変更されます。ドラッグが終わったときに変更する場合は、columnResizeModeに"onEnd"を設定します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Sterling | Bins | 18 | Giovani.Rau@gmail.com |
| 1 | Brandt | Ernser | 20 | Lincoln78@hotmail.com |
| 2 | Marianne | Jenkins | 53 | Keanu.McClure@yahoo.com |
| 3 | Angelo | Fisher | 31 | Anne58@hotmail.com |
| 4 | Elbert | Fritsch | 34 | Hector3@hotmail.com |
| 5 | Spencer | O'Reilly | 55 | Lester.Ferry11@hotmail.com |
| 6 | Neva | Labadie | 34 | Perry.Balistreri22@yahoo.com |
| 7 | Patrick | Skiles | 64 | Aubrey.Cummings@hotmail.com |
| 8 | Brock | Spencer | 41 | Harold.Champlin@hotmail.com |
| 9 | Jeanette | Jacobson | 39 | Marge.Olson@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableColumnResizing
columnResizeMode="onEnd"
withBorder
withColumnBorders
/>
)
Props
アクセシビリティ
Tableは、アクセシビリティに関してWAI-ARIA - Table Patternに従います。
tablePropsにaria-labelを設定すると、スクリーンリーダーによって読み上げられます。
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
tableProps={{ "aria-label": "User list" }}
/>
)
キーボード操作
| キー | 説明 | 状態 |
|---|---|---|
ArrowLeft | フォーカスを左のセルに1つ移動します。行の一番左のセルにフォーカスがある場合、フォーカスは移動しません。 | - |
ArrowRight | フォーカスを右のセルに1つ移動します。行の一番右のセルにフォーカスがある場合、フォーカスは移動しません。 | - |
ArrowUp | フォーカスを上のセルに1つ移動します。列の一番上のセルにフォーカスがある場合、フォーカスは移動しません。 | - |
ArrowDown | フォーカスを下のセルに1つ移動します。列の一番下のセルにフォーカスがある場合、フォーカスは移動しません。 | - |
Home | フォーカスのある行の最初のセルにフォーカスを移動します。 | - |
End | フォーカスのある行の最後のセルにフォーカスを移動します。 | - |
PageUp | 前のページに移動します。 | enablePagination={true} |
PageDown | 次のページに移動します。 | enablePagination={true} |
ARIAロールと属性
| 要素 | ロールと属性 | 使い方 |
|---|---|---|
table.ui-native-table__root | role="grid" | グリッドであることを示します。 |
aria-rowcount | テーブルの行数を示します。 | |
aria-colcount | テーブルの列数を示します。 | |
aria-multiselectable | enableRowSelectionが設定されている場合は"true"を設定します。 | |
thead.ui-native-table__thead | role="rowgroup" | 行グループであることを示します。 |
tr.ui-native-table__tr | role="row" | 行であることを示します。 |
aria-rowindex | 行がテーブルの何行目であるかを示します。 | |
aria-disabled | enableRowSelectionを関数で設定し、falseの行には"true"を設定します。 | |
aria-selected | 行が選択されている場合は"true"を設定し、未選択の場合は"false"を設定します。 | |
th.ui-native-table__th | role="columnheader" | カラムヘッダーであることを示します。 |
aria-rowindex | 行がテーブルの何行目であるかを示します。 | |
aria-colindex | 列がテーブルの何列目であるかを示します。 | |
aria-sort | 列が昇順の場合は"ascending"を設定し、降順の場合は"descending"を設定、指定がない場合は"none"を設定します。 | |
tbody.ui-native-table__tbody | role="rowgroup" | 行グループであることを示します。 |
td.ui-native-table__td | role="gridcell" | グリッドセルであることを示します。 |
aria-colindex | 列がテーブルの何列目であるかを示します。 | |
aria-rowindex | 行がテーブルの何行目であるかを示します。 | |
tfoot.ui-native-table__tfoot | role="rowgroup" | 行グループであることを示します。 |
label.ui-checkbox__root > input | aria-label | ヘッダーの場合は"すべての行を選択する"、それ以外の行の場合は"行を選択する"を設定します。 |
th.ui-native-table__th > button | aria-label | 列が昇順の場合は"昇順でソートする"を設定し、降順の場合は"降順でソートする"を設定、指定がない場合は"ソートを解除する"を設定します。 |
類似のコンポーネント
NativeTable
NativeTableは、データを効率的に整理して表示するコンポーネントです。
Stat
Statは、数値やデータをボックス内に表示するために使用されます。
AreaChart
AreaChartは、複数のデータを比較するためのエリアチャートを描画するコンポーネントです。
Badge
Badgeは、アイテムのステータスを強調表示して、すぐに認識できるようにするコンポーネントです。
BarChart
BarChartは、複数のデータを比較するための棒グラフを描画するコンポーネントです。
Card
Cardは、関連する情報をグループ化して表示するコンポーネントです。デフォルトでは、article要素をレンダリングします。
ComposedChart
ComposedChartは、複数のデータを比較するための複合チャートを描画するコンポーネントです。
DataList
DataListは、データ項目のリストを表示するために使用されます。