Table
Tableは、列のソートや行の選択やクリックイベント機能を備えたテーブルのコンポーネントです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Candice | Hoeger | 41 | Scott_Gottlieb@gmail.com |
| 1 | Edward | Mueller | 56 | Mike.Crooks@yahoo.com |
| 2 | Molly | Ebert-Collier | 48 | River_Hodkiewicz78@yahoo.com |
| 3 | Charles | Schaefer | 29 | Christian.Ondricka@gmail.com |
| 4 | Kelton | Kihn | 49 | Charlotte63@gmail.com |
| 5 | Alyce | Bruen | 60 | Soledad.Heathcote@hotmail.com |
| 6 | Clare | Kozey | 58 | Quinten_Christiansen78@gmail.com |
| 7 | Fernando | Breitenberg | 58 | Nat.Cummings@yahoo.com |
| 8 | Jerad | Pouros | 56 | Joann56@yahoo.com |
| 9 | Jonathan | Towne | 57 | Rachael_Willms31@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 | Charlotte | Veum | 50 | May_Rath69@yahoo.com |
| 1 | Rose | Nitzsche | 28 | Pete_Farrell-Fay@yahoo.com |
| 2 | Conrad | Rowe | 38 | Patrick_Reichel-Runte54@yahoo.com |
| 3 | Margarita | Bashirian | 52 | Marlene.Osinski3@hotmail.com |
| 4 | Nakia | Homenick | 44 | Meaghan_Legros@gmail.com |
| 5 | Vallie | Torphy-Crist | 64 | Tremayne50@gmail.com |
| 6 | Donny | Mertz | 25 | Aglae.Kautzer@yahoo.com |
| 7 | Leonie | Breitenberg | 49 | Wilhelmine49@gmail.com |
| 8 | Rolando | Bernier | 55 | Lucille_Nienow@yahoo.com |
| 9 | Camilla | Morar | 34 | Eugene.Reinger41@hotmail.com |
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Charlotte | Veum | 50 | May_Rath69@yahoo.com |
| 1 | Rose | Nitzsche | 28 | Pete_Farrell-Fay@yahoo.com |
| 2 | Conrad | Rowe | 38 | Patrick_Reichel-Runte54@yahoo.com |
| 3 | Margarita | Bashirian | 52 | Marlene.Osinski3@hotmail.com |
| 4 | Nakia | Homenick | 44 | Meaghan_Legros@gmail.com |
| 5 | Vallie | Torphy-Crist | 64 | Tremayne50@gmail.com |
| 6 | Donny | Mertz | 25 | Aglae.Kautzer@yahoo.com |
| 7 | Leonie | Breitenberg | 49 | Wilhelmine49@gmail.com |
| 8 | Rolando | Bernier | 55 | Lucille_Nienow@yahoo.com |
| 9 | Camilla | Morar | 34 | Eugene.Reinger41@hotmail.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 | Margret | McLaughlin | 65 | Cyrus46@gmail.com |
| 1 | Melody | MacGyver | 55 | Gerard_Rodriguez@hotmail.com |
| 2 | Walter | Medhurst | 53 | Joanie.Dickens79@hotmail.com |
| 3 | Elta | Haley | 18 | Sophia88@yahoo.com |
| 4 | Joanny | Bernier | 60 | Assunta_Satterfield21@yahoo.com |
| 5 | Johnpaul | Mosciski | 20 | Guillermo.Paucek@hotmail.com |
| 6 | Clark | Fisher | 64 | Demarcus.Kertzmann@hotmail.com |
| 7 | Tyrel | Swift | 58 | Olen.Stoltenberg57@hotmail.com |
| 8 | Jadon | Hane | 25 | Dane.Cruickshank@yahoo.com |
| 9 | Cleta | Trantow | 33 | Hugh_Goyette@yahoo.com |
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Margret | McLaughlin | 65 | Cyrus46@gmail.com |
| 1 | Melody | MacGyver | 55 | Gerard_Rodriguez@hotmail.com |
| 2 | Walter | Medhurst | 53 | Joanie.Dickens79@hotmail.com |
| 3 | Elta | Haley | 18 | Sophia88@yahoo.com |
| 4 | Joanny | Bernier | 60 | Assunta_Satterfield21@yahoo.com |
| 5 | Johnpaul | Mosciski | 20 | Guillermo.Paucek@hotmail.com |
| 6 | Clark | Fisher | 64 | Demarcus.Kertzmann@hotmail.com |
| 7 | Tyrel | Swift | 58 | Olen.Stoltenberg57@hotmail.com |
| 8 | Jadon | Hane | 25 | Dane.Cruickshank@yahoo.com |
| 9 | Cleta | Trantow | 33 | Hugh_Goyette@yahoo.com |
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Margret | McLaughlin | 65 | Cyrus46@gmail.com |
| 1 | Melody | MacGyver | 55 | Gerard_Rodriguez@hotmail.com |
| 2 | Walter | Medhurst | 53 | Joanie.Dickens79@hotmail.com |
| 3 | Elta | Haley | 18 | Sophia88@yahoo.com |
| 4 | Joanny | Bernier | 60 | Assunta_Satterfield21@yahoo.com |
| 5 | Johnpaul | Mosciski | 20 | Guillermo.Paucek@hotmail.com |
| 6 | Clark | Fisher | 64 | Demarcus.Kertzmann@hotmail.com |
| 7 | Tyrel | Swift | 58 | Olen.Stoltenberg57@hotmail.com |
| 8 | Jadon | Hane | 25 | Dane.Cruickshank@yahoo.com |
| 9 | Cleta | Trantow | 33 | Hugh_Goyette@yahoo.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 | Eldora | Gerhold | 57 | Adaline_Cartwright-Mills15@yahoo.com |
| 1 | Adelia | Bruen | 51 | Bob_Predovic@yahoo.com |
| 2 | Gina | Kiehn | 37 | Conrad_Jerde-Hermann78@yahoo.com |
| 3 | Raul | Bogan | 44 | Lula80@hotmail.com |
| 4 | Marcella | Quigley | 50 | Danny_Oberbrunner@hotmail.com |
| 5 | Leslie | King | 35 | Nikolas_Kertzmann@yahoo.com |
| 6 | Roberto | Lind | 58 | Fannie.Waelchi19@hotmail.com |
| 7 | Rudolph | Mraz | 58 | Lori_Goodwin@yahoo.com |
| 8 | Christiana | Hintz | 33 | Garry_Corkery@yahoo.com |
| 9 | Candace | MacGyver | 52 | Mohammad_Bogisich@yahoo.com |
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Eldora | Gerhold | 57 | Adaline_Cartwright-Mills15@yahoo.com |
| 1 | Adelia | Bruen | 51 | Bob_Predovic@yahoo.com |
| 2 | Gina | Kiehn | 37 | Conrad_Jerde-Hermann78@yahoo.com |
| 3 | Raul | Bogan | 44 | Lula80@hotmail.com |
| 4 | Marcella | Quigley | 50 | Danny_Oberbrunner@hotmail.com |
| 5 | Leslie | King | 35 | Nikolas_Kertzmann@yahoo.com |
| 6 | Roberto | Lind | 58 | Fannie.Waelchi19@hotmail.com |
| 7 | Rudolph | Mraz | 58 | Lori_Goodwin@yahoo.com |
| 8 | Christiana | Hintz | 33 | Garry_Corkery@yahoo.com |
| 9 | Candace | MacGyver | 52 | Mohammad_Bogisich@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 | Carley | Hodkiewicz | 35 | Kelley.Thiel@gmail.com |
| 1 | Luke | Bartell | 28 | Ian25@yahoo.com |
| 2 | Jaquelin | Ondricka | 43 | Yazmin_Kertzmann@hotmail.com |
| 3 | Cade | Rolfson | 44 | Nathaniel.Cartwright76@yahoo.com |
| 4 | Rosalie | Ruecker | 31 | Edith59@hotmail.com |
| 5 | April | Cole | 45 | Clovis.Muller@hotmail.com |
| 6 | Rhoda | O'Hara | 19 | Lillie46@yahoo.com |
| 7 | Tiffany | Kirlin | 21 | Tim.Larkin@hotmail.com |
| 8 | Mike | Keeling | 19 | Delbert2@yahoo.com |
| 9 | Fredrick | Emmerich | 63 | Phyllis.Schowalter0@yahoo.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} withBorder withScrollArea />
列の区切り線を追加する
列の区切り線を追加する場合は、withColumnBordersをtrueにします。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Pascale | Donnelly | 35 | Sherri7@gmail.com |
| 1 | Jorge | Lindgren | 62 | Randall.Littel@yahoo.com |
| 2 | Carol | Langworth | 63 | Maud_Murphy@hotmail.com |
| 3 | Dominic | Tremblay | 37 | Eileen.Kris-Witting@yahoo.com |
| 4 | Homer | Runte | 35 | Matthew.Cole@yahoo.com |
| 5 | Gabe | Fisher | 49 | Frank90@yahoo.com |
| 6 | Matthew | Rowe | 36 | Jay.Treutel@yahoo.com |
| 7 | Chandler | Friesen | 45 | Kristina39@gmail.com |
| 8 | Lacey | Parisian | 28 | Lysanne84@hotmail.com |
| 9 | Colby | O'Keefe | 56 | Zachary_Bartoletti-McDermott62@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} withColumnBorders withScrollArea />
行がホバーされたときにハイライトする
行がホバーされたときにハイライトする場合は、highlightOnHoverをtrueにします。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Frederick | Feeney-Buckridge | 63 | Sophie_Hilpert62@yahoo.com |
| 1 | Cyrus | Schuppe | 62 | Gene_Mann39@yahoo.com |
| 2 | Kara | O'Conner | 38 | Eldon92@yahoo.com |
| 3 | Elena | Spencer | 31 | Louis_Armstrong4@hotmail.com |
| 4 | Homer | Simonis | 55 | Jeannette.Denesik@yahoo.com |
| 5 | Adele | Leuschke | 50 | Shana_Veum26@hotmail.com |
| 6 | Savanah | Ruecker | 62 | Michale.Emard79@hotmail.com |
| 7 | Toni | Hoeger | 21 | Tonya_Bruen53@gmail.com |
| 8 | Roma | Feest | 58 | Andres_Mitchell66@hotmail.com |
| 9 | Ira | Bayer | 33 | Oma.Stokes40@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} highlightOnHover withScrollArea />
ストライプを使う
ストライプを使う場合は、stripedをtrueにします。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Sandra | Stroman | 37 | Scot.Fadel@yahoo.com |
| 1 | Tommy | Rosenbaum | 64 | Santino44@gmail.com |
| 2 | Mariana | Willms-Macejkovic | 57 | Kathryn_Schroeder87@hotmail.com |
| 3 | Elmore | Brekke | 45 | Columbus_Lynch@gmail.com |
| 4 | Delmer | Bednar | 37 | Yasmin47@yahoo.com |
| 5 | Deshawn | Upton | 38 | Rodney_Adams@hotmail.com |
| 6 | Andrea | Hodkiewicz | 20 | Marlene74@gmail.com |
| 7 | Birdie | Ebert | 44 | Viola.OKon86@yahoo.com |
| 8 | Delia | Hermann | 51 | Carole.Daugherty49@yahoo.com |
| 9 | Thomas | Ullrich | 46 | Todd_Stokes23@yahoo.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 | Kelli | Glover | 46 | Juana3@yahoo.com | (936) 801-3968 x9155 | admin | inactive | 5/30/2026 | 9/24/2025 |
| 1 | Laurine | Romaguera | 54 | Judith_Schroeder@yahoo.com | 338-505-8501 x213 | admin | inactive | 1/28/2026 | 12/18/2025 |
| 2 | Emmet | Robel | 32 | Jarred.Kozey@hotmail.com | 1-405-993-9153 x863 | user | active | 3/7/2026 | 9/18/2025 |
| 3 | Emily | Daniel | 21 | Felton80@yahoo.com | (481) 365-7942 x306 | admin | active | 10/8/2025 | 4/30/2026 |
| 4 | Manuel | Feil | 40 | Hanna.Mosciski@yahoo.com | 966-376-1460 x9661 | admin | inactive | 4/16/2026 | 1/20/2026 |
| 5 | Alan | Dietrich | 51 | Patsy18@hotmail.com | 204-294-3544 | admin | inactive | 5/20/2026 | 11/30/2025 |
| 6 | Raul | Kovacek-Murray | 50 | Lorenzo40@hotmail.com | (515) 866-9945 | user | inactive | 4/24/2026 | 10/25/2025 |
| 7 | Frederick | Berge | 61 | Trent_Rogahn@gmail.com | 1-330-853-0224 | user | active | 10/30/2025 | 10/26/2025 |
| 8 | Janis | Sanford | 46 | Lavina10@hotmail.com | (499) 631-5097 x096 | admin | active | 6/21/2025 | 3/22/2026 |
| 9 | Abner | Beahan | 59 | Wayne25@gmail.com | 999-596-7591 | user | active | 5/19/2026 | 7/21/2025 |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columnsFull} data={data} withScrollArea />
ヘッダーグループ
| id | user | |||
|---|---|---|---|---|
| name | age | |||
| firstName | lastName | |||
| 0 | Hilma | Gerlach | 39 | Leda_Bradtke@yahoo.com |
| 1 | Timmy | Schuppe | 26 | Allene_Hettinger@yahoo.com |
| 2 | Marion | Krajcik-Rempel | 58 | Alva39@hotmail.com |
| 3 | Wallace | Collier | 49 | Malcolm.Oberbrunner89@hotmail.com |
| 4 | Monica | Crona | 28 | Garrison41@yahoo.com |
| 5 | Daisha | Grant | 38 | Nick46@gmail.com |
| 6 | Lyric | Funk | 28 | Johanna_Green@hotmail.com |
| 7 | Reginald | Treutel | 40 | Rhonda.Corkery@hotmail.com |
| 8 | Jeannie | Koch | 30 | Sabryna_Schneider@hotmail.com |
| 9 | Nettie | Osinski | 61 | Aubrey.Fay18@gmail.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 | Carlie | Jenkins | 39 | Pedro_Dicki-Bergstrom8@yahoo.com |
| 1 | Zetta | Daugherty | 57 | Inez_Halvorson97@hotmail.com |
| 2 | Damian | Parker | 29 | Jacynthe66@yahoo.com |
| 3 | Nick | Hammes | 26 | Jerrod_Mitchell-Altenwerth@gmail.com |
| 4 | Hazel | Walsh | 52 | Roel.Hettinger@hotmail.com |
| 5 | Juan | Huel | 30 | Leona77@yahoo.com |
| 6 | Lori | Raynor | 40 | Terrance_Collier@gmail.com |
| 7 | Toni | Vandervort | 32 | Sydney62@gmail.com |
| 8 | Lorine | Runte | 50 | Jamie.Blick67@hotmail.com |
| 9 | Roberta | Reichert-Wiegand | 64 | June6@hotmail.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 | Etha | Yost | 21 | Mireya.Lang41@yahoo.com |
| 1 | Corey | Hermann | 33 | Jo_Collins68@yahoo.com |
| 2 | Christopher | Watsica | 33 | Vernie2@yahoo.com |
| 3 | Christy | Walsh | 64 | Stacy_Schroeder@hotmail.com |
| 4 | Ivy | Prohaska | 57 | Pearl26@yahoo.com |
| 5 | Rhianna | Kuhlman-Bauch | 24 | Jerry_Stehr@hotmail.com |
| 6 | Soledad | Powlowski | 22 | Idell.Hegmann@hotmail.com |
| 7 | Marguerite | Wilkinson | 19 | Elvira.Hyatt@gmail.com |
| 8 | Greg | Wiegand | 36 | Frederique32@gmail.com |
| 9 | Armando | Fadel | 22 | Gus_Schroeder2@hotmail.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 | Brielle | Mitchell | 55 | Madaline11@yahoo.com |
| 1 | Junius | Nader | 25 | Lola.Weimann20@yahoo.com |
| 2 | Stacey | Pfeffer | 24 | Ferne_Hammes24@gmail.com |
| 3 | Whitney | Upton | 40 | Breanna.Reichert@yahoo.com |
| 4 | Johnathan | Wehner | 64 | Johnson_Wyman99@hotmail.com |
| 5 | Presley | Denesik | 36 | Leon.Mills@hotmail.com |
| 6 | Vera | Wuckert | 50 | Shawn41@hotmail.com |
| 7 | Regina | Sawayn | 48 | Maximillia_Gibson70@hotmail.com |
| 8 | Yasmeen | Collier | 56 | Neha94@yahoo.com |
| 9 | Dewey | Schmitt | 37 | Virginia.Gerhold@yahoo.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
initialFocusableCell={{ colIndex: 1, rowIndex: 0 }}
withScrollArea
/>
)
行のクリックイベントをハンドルする
行のクリックイベントをハンドルする場合は、onRowClickを使用します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Daryl | Herman-Roberts | 51 | Tina_Mayer@yahoo.com |
| 1 | Dolly | Kshlerin | 62 | Vince_Russel@hotmail.com |
| 2 | Freeman | Harris | 32 | Sonia_Vandervort58@gmail.com |
| 3 | Chaim | McLaughlin | 59 | Hugo.Sawayn85@yahoo.com |
| 4 | Mervin | Huel | 62 | Margaret_Beahan-Blanda@yahoo.com |
| 5 | Kendra | Jones | 32 | Devante_Hansen24@hotmail.com |
| 6 | Wallace | Hansen | 50 | Okey55@gmail.com |
| 7 | Ethyl | Hudson | 51 | Kari.Swift63@hotmail.com |
| 8 | Gary | Anderson | 64 | Sim_Satterfield23@yahoo.com |
| 9 | Maggie | Mraz | 25 | Kenya.Reinger@yahoo.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 | Kevin | Ratke | 46 | Meagan35@yahoo.com |
| 1 | Marvin | Marquardt | 27 | Roselyn97@hotmail.com |
| 2 | Carla | Lynch | 36 | Valentin25@gmail.com |
| 3 | Reginald | Nikolaus | 36 | Alexie18@hotmail.com |
| 4 | Sidney | O'Reilly | 20 | Devante.Heidenreich57@yahoo.com |
| 5 | Janie | Dibbert | 47 | Mack.Ortiz23@hotmail.com |
| 6 | Rick | Beer | 61 | Wayne.Goyette@yahoo.com |
| 7 | Kristen | Paucek | 36 | Amara34@hotmail.com |
| 8 | Guy | Boyer | 50 | Dashawn.Fadel59@gmail.com |
| 9 | Debbie | Hills | 40 | Dan_Franecki9@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 | |
|---|---|---|---|---|
| 8 | Spencer | Reichel | 59 | Willis.Russel81@yahoo.com |
| 2 | Roberto | Streich | 54 | Lillian_Mueller@hotmail.com |
| 3 | Glen | Hand | 49 | Tasha.Kling@yahoo.com |
| 9 | Stacy | Wilderman | 41 | Berneice_Schaefer@hotmail.com |
| 7 | Trystan | Larson | 38 | Yasmeen_Beer11@hotmail.com |
| 1 | Taylor | Shields | 34 | Jenna_Heaney@yahoo.com |
| 4 | Haylee | Hamill | 32 | Glen88@gmail.com |
| 0 | Isaias | Wiegand | 30 | Carlton28@yahoo.com |
| 6 | Dayton | Pouros | 27 | Justice.Ziemann@hotmail.com |
| 5 | Rudy | Schaefer | 21 | Essie.Halvorson@gmail.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 | Nathaniel | Gottlieb | 65 | Ansley_OReilly76@yahoo.com |
| 1 | Christie | Cummerata | 54 | Wilbur52@yahoo.com |
| 2 | Tommy | Collier | 29 | Brenna_Bode30@yahoo.com |
| 3 | Alan | Thiel | 43 | Zaria_Kessler@yahoo.com |
| 4 | Lois | Simonis-Hammes | 54 | Colin_Fisher34@gmail.com |
| 5 | Baylee | Dare | 50 | Remington70@gmail.com |
| 6 | Karen | Greenholt | 25 | Fritz.Cassin31@hotmail.com |
| 7 | Santina | Schinner | 39 | Alan45@gmail.com |
| 8 | Ocie | Sauer-Nikolaus | 54 | Pauline_Grady@yahoo.com |
| 9 | Francisco | Moore-Balistreri | 47 | Ollie_Lemke@yahoo.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table columns={columns} data={data} enableSorting={false} withScrollArea />
)
複数列のソートを無効にする
複数列のソートを無効にする場合は、enableMultiSortをfalseに設定します。デフォルトは、trueです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Candace | Carroll | 24 | Joann58@gmail.com |
| 1 | Lorene | Ratke | 57 | Camila5@gmail.com |
| 2 | Carlton | Bailey | 28 | Stacy.Brakus@yahoo.com |
| 3 | Susie | Mayert | 43 | Fae19@gmail.com |
| 4 | Oscar | Runte-Koepp | 60 | Melody.Ziemann38@yahoo.com |
| 5 | Frida | Senger | 34 | Myrtle_Walter-Tromp@gmail.com |
| 6 | Mandy | Medhurst | 48 | Lazaro_Halvorson81@gmail.com |
| 7 | Katie | Gerhold | 18 | Nicholas_Hagenes@yahoo.com |
| 8 | Vesta | Jones | 29 | Rory.Watsica@yahoo.com |
| 9 | Megane | Hand | 31 | Marcia58@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table columns={columns} data={data} enableMultiSort={false} withScrollArea />
)
最大のソート可能な列数を設定する
最大のソート可能な列数を設定する場合は、maxMultiSortColCountに数値を設定します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Eileen | Lesch | 53 | Darlene24@gmail.com |
| 1 | Arthur | Green | 37 | Paul_Romaguera@hotmail.com |
| 2 | Penny | Crona | 28 | Nathan.Reichert58@hotmail.com |
| 3 | Felipe | Aufderhar | 43 | Waldo.Hamill@yahoo.com |
| 4 | Carol | Cronin | 35 | Barbara.Kuphal@yahoo.com |
| 5 | Jose | O'Hara | 50 | Zack_Torphy61@yahoo.com |
| 6 | Valerie | O'Conner | 57 | Felicia_Feeney@hotmail.com |
| 7 | Celestine | Predovic | 37 | Lindsay.Kemmer64@hotmail.com |
| 8 | Jamar | Ortiz | 40 | Americo.Ratke58@yahoo.com |
| 9 | Elenor | Bode | 30 | Dariana_Carter@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
maxMultiSortColCount={2}
withScrollArea
/>
)
手動のソートを使う
手動のソートを使う場合は、manualSortingをtrueに設定します。デフォルトは、falseです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Jorge | Kuphal | 49 | Geraldine.Zboncak9@hotmail.com |
| 1 | Tina | Dibbert | 21 | Roderick85@hotmail.com |
| 2 | Darien | Ratke | 63 | Doris46@hotmail.com |
| 3 | Jacky | Howell | 62 | Earl.Fadel10@yahoo.com |
| 4 | Jesse | Hahn | 40 | Marcia.Gorczany@yahoo.com |
| 5 | Anthony | Bartoletti | 59 | Carmen_Beer@hotmail.com |
| 6 | Alison | Lang | 55 | Baby_Haley37@gmail.com |
| 7 | Clovis | Nikolaus-Kiehn | 26 | Shari_Conn37@hotmail.com |
| 8 | Edmund | Friesen-Feest | 27 | Rachael_Wiza@gmail.com |
| 9 | Pete | Runolfsson | 47 | Jakayla_Satterfield@gmail.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 | Lambert | Moore | 24 | Austin.Greenfelder@yahoo.com |
| 1 | Autumn | Hintz | 43 | Clifford6@gmail.com |
| 2 | Iris | Jakubowski | 30 | Kasandra33@hotmail.com |
| 3 | Brittany | Kovacek | 21 | Estrella_Dickinson@yahoo.com |
| 4 | Thelma | Shields-Gutkowski | 27 | Orville_Lind@gmail.com |
| 5 | Joann | Olson | 35 | Anderson57@yahoo.com |
| 6 | Travis | Skiles | 26 | Alonzo_Wunsch22@hotmail.com |
| 7 | Stanley | Senger | 44 | Tammy.Rath82@hotmail.com |
| 8 | Ike | Abbott | 63 | Kira67@gmail.com |
| 9 | Braden | Pouros | 20 | Elvis.Sawayn-Wolf@yahoo.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} sortDescFirst withScrollArea />
ソートを制御する
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Dorcas | Morissette | 59 | Jarret27@gmail.com |
| 1 | Pat | Wilderman | 37 | Ann.Connelly25@hotmail.com |
| 2 | Evalyn | Bayer | 25 | Tom79@hotmail.com |
| 3 | Sabryna | Gerhold | 35 | Krista94@hotmail.com |
| 4 | Javier | Donnelly | 58 | Flavie45@yahoo.com |
| 5 | Regan | Maggio | 44 | Phillip.White@gmail.com |
| 6 | Ivy | Auer | 42 | Walter_Fadel-Little@hotmail.com |
| 7 | Dillon | Hamill | 57 | Wilmer79@yahoo.com |
| 8 | Boyd | Fahey | 48 | Alexis_Connelly63@yahoo.com |
| 9 | Deanna | DuBuque | 33 | Rozella_Feeney@gmail.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 | Lauryn | Paucek | 53 | Paris_Bergnaum88@gmail.com |
| 1 | Reymundo | Buckridge | 36 | Christa.Kerluke0@yahoo.com |
| 2 | Nicolas | Dare | 48 | Mallie68@gmail.com |
| 3 | Marjory | Dickens-Considine | 32 | Stuart8@yahoo.com |
| 4 | Rosario | Dibbert | 34 | Kelvin_Bosco80@gmail.com |
| 5 | Jovani | Hauck | 48 | Bethany20@hotmail.com |
| 6 | Shelly | Smith | 42 | Seamus.Goodwin@gmail.com |
| 7 | Felipe | Wintheiser-Zemlak | 46 | Ramiro_Monahan@gmail.com |
| 8 | Dan | Beier | 40 | Justus_Schaefer77@gmail.com |
| 9 | Elaine | Ondricka | 30 | Andres96@gmail.com |
| 10 | Nayeli | Reichel | 49 | Cora.Beahan@hotmail.com |
| 11 | Carmen | Rosenbaum | 59 | Murphy_Torp4@yahoo.com |
| 12 | Jermaine | Hahn | 44 | Victor.Bernier65@yahoo.com |
| 13 | Derrick | Kautzer | 36 | Augusta.Volkman@hotmail.com |
| 14 | Darren | Aufderhar | 47 | Jalen_Beatty@yahoo.com |
| 15 | Conrad | Collier | 32 | Evert42@hotmail.com |
| 16 | Clementine | Boyer | 44 | Josue38@hotmail.com |
| 17 | Beth | Maggio | 47 | Mindy.Kovacek@yahoo.com |
| 18 | Salvatore | Ankunding | 59 | Mose.Haley16@yahoo.com |
| 19 | Brett | Schmidt | 57 | Rusty.Gleichner3@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 | Tara | Pouros | 31 | Brett.Bashirian@yahoo.com |
| 11 | Rachel | Miller | 34 | Dejon_Emard@yahoo.com |
| 12 | Paula | Stroman | 29 | Everett.Reilly@hotmail.com |
| 13 | Albert | Torphy | 44 | Tabitha_Rau@yahoo.com |
| 14 | Jessyca | Lindgren | 29 | Lavonne_Nicolas59@gmail.com |
| 15 | Marty | O'Conner | 34 | Blake78@gmail.com |
| 16 | Kaley | Purdy | 20 | Lilian.Prosacco@hotmail.com |
| 17 | Jeanne | Kohler | 30 | Edgar_Harber29@yahoo.com |
| 18 | Christie | Heaney | 60 | Odell_Yost@hotmail.com |
| 19 | Meghan | Moen | 59 | Libby76@yahoo.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 | Berry | Haley | 63 | Ellie.Koch-West@hotmail.com |
| 1 | Lorenz | Lindgren | 63 | Lauren.Breitenberg@yahoo.com |
| 2 | Alan | Wisoky | 61 | Anita_Conn@gmail.com |
| 3 | Royal | Kemmer | 24 | Lawrence.Erdman@gmail.com |
| 4 | Darien | Dach | 28 | Jedidiah.Block@gmail.com |
| 5 | Ari | Harris | 27 | Milton61@yahoo.com |
| 6 | Wilbert | Kessler | 51 | Karla.Gerlach93@yahoo.com |
| 7 | Remington | Dickinson | 46 | Harold.Monahan@hotmail.com |
| 8 | Mitchell | Macejkovic | 35 | Lonny.Dibbert@hotmail.com |
| 9 | Lorenz | Daniel | 60 | Brooks_Runolfsdottir16@yahoo.com |
| 10 | Katelynn | Bauch | 21 | Rocky15@yahoo.com |
| 11 | Howard | Zboncak | 35 | Jeannie.Hilll@hotmail.com |
| 12 | Wade | Moen | 45 | Reuben4@yahoo.com |
| 13 | Maximilian | Cruickshank | 37 | Aliya_Johnston@gmail.com |
| 14 | Lawrence | Block | 35 | Gilberto44@yahoo.com |
| 15 | Kristine | Glover | 27 | Jessyca9@yahoo.com |
| 16 | Leone | Kuhic | 38 | Dave9@yahoo.com |
| 17 | Allan | Pfannerstill | 24 | Stacey16@yahoo.com |
| 18 | Oran | Wintheiser | 19 | Vicki_Blanda@hotmail.com |
| 19 | Cortez | King | 46 | Melinda.Dach@gmail.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 | Arjun | Miller | 31 | Emerald.Grimes68@hotmail.com |
| 1 | Deondre | Stiedemann | 21 | Lance_Koch@gmail.com |
| 2 | Randall | Keeling | 30 | Shari_Mitchell62@gmail.com |
| 3 | Bailey | Ratke | 23 | Ed_Beer@gmail.com |
| 4 | Leigh | Kuhn | 39 | Cristobal7@hotmail.com |
| 5 | Alexzander | Labadie | 28 | Lorraine_Ruecker@hotmail.com |
| 6 | Fernando | Kris | 59 | Yvette_Waelchi@hotmail.com |
| 7 | Deon | Bruen | 50 | Lamar53@gmail.com |
| 8 | Margarete | Hudson | 63 | Maggie.OConnell65@hotmail.com |
| 9 | Anne | Carter | 41 | Quentin.Franecki@hotmail.com |
| 10 | Tara | Heaney | 52 | David.Gleason2@hotmail.com |
| 11 | Kyler | Lockman | 31 | Rosalie74@yahoo.com |
| 12 | Candace | Swift | 28 | Cheryl55@yahoo.com |
| 13 | Amy | Veum | 29 | April47@gmail.com |
| 14 | Max | Ernser | 37 | Lena.Schmitt97@yahoo.com |
| 15 | Hiram | Baumbach | 26 | Ansel_Kuhlman61@gmail.com |
| 16 | Violet | Wehner | 51 | Ken56@yahoo.com |
| 17 | Ian | Treutel | 30 | Jeanette72@hotmail.com |
| 18 | Marsha | Fisher | 25 | Jadon7@yahoo.com |
| 19 | Velma | Goyette | 32 | Zachery.Runte24@yahoo.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 | Teagan | Fritsch | 41 | Tami.Schowalter@yahoo.com | |
| 1 | Astrid | Schmidt | 27 | Damaris.Rowe86@gmail.com | |
| 2 | Skye | Doyle | 39 | Libbie_Torphy4@yahoo.com | |
| 3 | Shaniya | Emard | 31 | Noemy14@yahoo.com | |
| 4 | Boyd | Casper | 65 | Sally.OConnell@yahoo.com | |
| 5 | Amelia | Kiehn | 39 | Mallie.Fritsch@hotmail.com | |
| 6 | Margaret | Collins | 46 | Giovanni77@hotmail.com | |
| 7 | Ernie | Batz | 43 | Delores80@yahoo.com | |
| 8 | Clara | Gutkowski | 62 | Alena87@gmail.com | |
| 9 | William | Labadie | 45 | Friedrich.Ward13@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} enableRowSelection withScrollArea />
デフォルトの選択された行を設定する
デフォルトの選択された行を設定する場合は、defaultRowSelectionにdataのインデックスをキーとしたオブジェクトを設定します。
| id | firstName | lastName | age | ||
|---|---|---|---|---|---|
| 0 | Louise | Dare | 54 | Sheri82@hotmail.com | |
| 1 | Loretta | Ratke | 49 | Haven_Buckridge@gmail.com | |
| 2 | Steve | Kerluke | 55 | Mathew.Jacobi91@hotmail.com | |
| 3 | Selmer | Erdman | 32 | Reece.Lynch@gmail.com | |
| 4 | Minerva | Kihn | 30 | Dave.Mosciski87@yahoo.com | |
| 5 | Matthew | Cruickshank-Green | 24 | Howard61@yahoo.com | |
| 6 | Paolo | Konopelski | 44 | Andres4@hotmail.com | |
| 7 | Eloisa | Roob | 49 | Stephen_Walsh@gmail.com | |
| 8 | April | Schinner | 27 | Kiera25@yahoo.com | |
| 9 | Arely | Beer | 21 | Mindy.Wolf-Stamm@gmail.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 | Alejandra | Kling-O'Conner | 59 | Yessenia37@gmail.com | |
| 1 | Agustina | Lockman | 57 | Cecilia_Fadel71@gmail.com | |
| 2 | Leta | Towne | 39 | Edmond_Blanda@gmail.com | |
| 3 | Vera | Predovic | 27 | Heidi12@yahoo.com | |
| 4 | Keyon | Emard | 23 | Ellen13@gmail.com | |
| 5 | Gracie | Carter | 32 | Lora.McGlynn66@gmail.com | |
| 6 | Joanna | Fadel | 25 | Destiney70@yahoo.com | |
| 7 | Kenyon | Ritchie | 20 | Greyson.Cassin60@yahoo.com | |
| 8 | Ernie | Strosin | 31 | Suzanne81@gmail.com | |
| 9 | Trevor | Muller | 50 | Sophie_Cartwright@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableRowSelection
selectOnClickRow
withScrollArea
/>
)
チェックボックスを非表示にする
チェックボックスを非表示にする場合は、withCheckboxをfalseに設定します。デフォルトは、trueです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Shawn | Mueller | 45 | Natalie_Feil57@hotmail.com |
| 1 | Osborne | Considine | 50 | Addie25@hotmail.com |
| 2 | Rufus | Farrell | 45 | Arvilla_Bednar@gmail.com |
| 3 | Breanne | Mann | 65 | Tami0@yahoo.com |
| 4 | Kurt | Kutch-Erdman | 44 | Ronnie_Mills99@yahoo.com |
| 5 | Christopher | Walter | 51 | Irving.Sauer24@hotmail.com |
| 6 | Dennis | Hickle | 34 | Toby.Botsford95@gmail.com |
| 7 | Will | Welch-Rice | 50 | Julian_Leannon@yahoo.com |
| 8 | Herta | Jenkins | 35 | Marlin_Klein@yahoo.com |
| 9 | Leda | Jerde | 47 | Sally_Schumm@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableRowSelection
selectOnClickRow
withCheckbox={false}
withScrollArea
/>
)
行を無効にする
行を無効にする場合は、enableRowSelectionに条件の関数を設定します。
| id | firstName | lastName | age | ||
|---|---|---|---|---|---|
| 0 | Kayla | Smitham | 47 | Linda.Dare@yahoo.com | |
| 1 | Zechariah | Schoen | 30 | Roberta58@gmail.com | |
| 2 | Kira | D'Amore | 50 | Melvin1@gmail.com | |
| 3 | Toni | Bednar | 19 | Theresa13@gmail.com | |
| 4 | Rosalia | Legros | 59 | Rachel55@hotmail.com | |
| 5 | Shirley | Grimes | 19 | Alexandro_Ortiz34@gmail.com | |
| 6 | Christopher | Wilkinson | 40 | Ebony.Block64@gmail.com | |
| 7 | Glenn | O'Conner | 60 | Gabriel69@yahoo.com | |
| 8 | Tillman | Klocko | 64 | Mae_Raynor44@yahoo.com | |
| 9 | Penny | Goodwin | 47 | Sadie42@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 | Theresa | Kozey | 60 | Luke.Bashirian@gmail.com | |
| 1 | Florence | Considine | 64 | Billy_Steuber@yahoo.com | |
| 2 | Mossie | Braun | 62 | Kelton45@yahoo.com | |
| 3 | Roderick | Bergstrom-Skiles | 60 | Lula71@yahoo.com | |
| 4 | Myrtle | Rodriguez | 49 | Tressie.Ondricka80@gmail.com | |
| 5 | Jim | Hamill | 42 | Meghan37@yahoo.com | |
| 6 | Amelia | Krajcik | 64 | Lewis_Cronin51@hotmail.com | |
| 7 | Cindy | Sporer | 23 | Patrick_Williamson89@hotmail.com | |
| 8 | Rubye | Metz | 25 | Yvonne_Yundt48@gmail.com | |
| 9 | Xander | Ward | 30 | Gus_Harris7@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 | Sylvester | Jacobson | 62 | Jordi_Greenfelder43@gmail.com |
| 1 | Dallas | Kozey | 50 | Mathew_Franey25@hotmail.com |
| 2 | Phoebe | Wilderman | 23 | Shelley.Lind92@yahoo.com |
| 3 | Brittany | Bergnaum | 20 | Kristine_Brown@gmail.com |
| 4 | Letitia | Trantow | 19 | Reese.Parker2@gmail.com |
| 5 | Euna | Wilkinson | 65 | Clare65@yahoo.com |
| 6 | Melany | Jast | 63 | Nicole.Nikolaus10@gmail.com |
| 7 | Peggie | Krajcik | 27 | Luna37@hotmail.com |
| 8 | Angelo | Heller | 65 | Arlene66@gmail.com |
| 9 | Stephen | Treutel | 34 | Edwina3@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 | |
|---|---|---|---|---|
| 1 | Barbara | Mante | 65 | Grady.Daniel31@gmail.com |
| 4 | Tommie | Gorczany | 44 | Roy_Larkin@gmail.com |
| 5 | Bradford | Bradtke | 25 | Kate_Schuppe@gmail.com |
| 6 | Larissa | Mueller | 18 | Theron.Hilpert42@gmail.com |
| 7 | Lucas | Ankunding | 63 | Lionel.Reichert44@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 | Tim | Heidenreich | 40 | Madeline92@yahoo.com |
| 1 | Harvey | Goldner | 42 | Douglas3@hotmail.com |
| 2 | Sherry | Nolan | 61 | Nya71@yahoo.com |
| 3 | Bryant | Barrows | 60 | Freida_Herzog-Toy@gmail.com |
| 4 | Norbert | Glover | 30 | Melvina_Flatley@hotmail.com |
| 5 | Madisen | Wiza | 42 | Makayla82@yahoo.com |
| 6 | Dora | King | 20 | Shelly.Graham-Stehr@hotmail.com |
| 7 | Mindy | Stoltenberg | 53 | Maurice_Lemke96@gmail.com |
| 8 | Emelie | Johnson-Bergnaum | 29 | Myron_Weber@yahoo.com |
| 9 | Ferne | Veum | 23 | Elliot23@hotmail.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 | Baby | Yundt | 18 | Terri51@gmail.com |
| 1 | Keith | Bradtke | 35 | Addie.Veum@yahoo.com |
| 2 | Princess | Baumbach-Bogisich | 54 | Marley26@gmail.com |
| 3 | Santino | Lesch | 34 | Gail_Rice99@hotmail.com |
| 4 | Lamar | Glover | 53 | Loretta.Abbott@hotmail.com |
| 5 | Clark | Graham | 38 | Jammie_Cormier39@hotmail.com |
| 6 | Sheryl | Becker | 34 | Irwin.Reichel@hotmail.com |
| 7 | Nathan | Corwin | 54 | Mariana.Howe17@gmail.com |
| 8 | Steve | Lang | 53 | Samantha44@hotmail.com |
| 9 | Daisy | Wiegand | 43 | Jammie9@yahoo.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableColumnResizing
withBorder
withColumnBorders
/>
)
列のサイズ変更の方法を変更する
デフォルトでは、列のサイズ変更のタイミングは、ドラッグしている間に変更されます。ドラッグが終わったときに変更する場合は、columnResizeModeに"onEnd"を設定します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Monique | Schaden | 59 | Makenzie_Mohr25@yahoo.com |
| 1 | Pattie | Carroll | 39 | Eugenia_Windler@gmail.com |
| 2 | Elian | Waelchi | 45 | Maeve_Monahan54@hotmail.com |
| 3 | Ashley | Pfeffer | 18 | Steve30@yahoo.com |
| 4 | Javier | Hessel | 64 | Orville.Erdman-Raynor53@yahoo.com |
| 5 | Glenn | Greenholt | 59 | Shania_Feest79@yahoo.com |
| 6 | Billie | Considine | 34 | Damian_Vandervort62@yahoo.com |
| 7 | Amaya | Runolfsdottir | 36 | Golda6@gmail.com |
| 8 | Douglas | Lakin | 56 | Mac_Kunde49@gmail.com |
| 9 | Esmeralda | Gleichner | 26 | Lenora.Hauck-Klein@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は、データ項目のリストを表示するために使用されます。