Table
Tableは、列のソートや行の選択やクリックイベント機能を備えたテーブルのコンポーネントです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Ila | Schaden | 22 | Carole_Conroy@yahoo.com |
| 1 | Antwon | Upton | 20 | Viola56@gmail.com |
| 2 | Kari | Ebert | 18 | Todd95@gmail.com |
| 3 | Juana | Kiehn | 35 | Austin65@gmail.com |
| 4 | Jamie | Senger | 25 | Montana.Kunde@gmail.com |
| 5 | Leah | Mraz | 59 | Lionel_Ebert27@gmail.com |
| 6 | Kiara | Mayert | 60 | Melyna.Schultz77@yahoo.com |
| 7 | Cloyd | Fritsch | 62 | Asha9@gmail.com |
| 8 | Joshua | Schaden | 56 | Mertie22@yahoo.com |
| 9 | Kathleen | Lakin | 58 | Armando_Ratke72@gmail.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 | Alicia | Gutmann | 24 | Suzanne.Brekke59@hotmail.com |
| 1 | Allan | McLaughlin | 35 | Corine.Emard@yahoo.com |
| 2 | Robyn | Price | 32 | Emma_Feeney@gmail.com |
| 3 | Rolando | Bradtke | 46 | Teagan.Larson99@gmail.com |
| 4 | Alayna | Lockman | 58 | Kyleigh.Mann@hotmail.com |
| 5 | Elijah | Zboncak | 30 | Melinda95@gmail.com |
| 6 | Jean | Prohaska | 40 | Phyllis.Herzog@hotmail.com |
| 7 | Rico | Schaden | 55 | Liliane35@yahoo.com |
| 8 | Lemuel | Von-Grant | 59 | Eileen90@hotmail.com |
| 9 | Kelley | Bode | 59 | Ryan_Dooley@gmail.com |
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Alicia | Gutmann | 24 | Suzanne.Brekke59@hotmail.com |
| 1 | Allan | McLaughlin | 35 | Corine.Emard@yahoo.com |
| 2 | Robyn | Price | 32 | Emma_Feeney@gmail.com |
| 3 | Rolando | Bradtke | 46 | Teagan.Larson99@gmail.com |
| 4 | Alayna | Lockman | 58 | Kyleigh.Mann@hotmail.com |
| 5 | Elijah | Zboncak | 30 | Melinda95@gmail.com |
| 6 | Jean | Prohaska | 40 | Phyllis.Herzog@hotmail.com |
| 7 | Rico | Schaden | 55 | Liliane35@yahoo.com |
| 8 | Lemuel | Von-Grant | 59 | Eileen90@hotmail.com |
| 9 | Kelley | Bode | 59 | Ryan_Dooley@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 | Irvin | Daugherty | 19 | Trycia_Dooley-Corwin32@yahoo.com |
| 1 | Vicky | Funk | 22 | Armando_Baumbach@hotmail.com |
| 2 | Leon | Torp | 64 | Lily_Kautzer@hotmail.com |
| 3 | Ruth | McDermott | 62 | Misty_Collier94@yahoo.com |
| 4 | Lauryn | Fritsch | 58 | Tommie.Sipes@gmail.com |
| 5 | Leola | Jacobson | 61 | Lizzie_Lesch51@hotmail.com |
| 6 | Alton | Harris | 35 | Mertie.Stiedemann@gmail.com |
| 7 | Nadine | Moore | 58 | Thurman.Lesch@yahoo.com |
| 8 | Julia | Connelly | 55 | Edmond69@gmail.com |
| 9 | Marilie | Lesch | 27 | Tricia.Gottlieb@hotmail.com |
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Irvin | Daugherty | 19 | Trycia_Dooley-Corwin32@yahoo.com |
| 1 | Vicky | Funk | 22 | Armando_Baumbach@hotmail.com |
| 2 | Leon | Torp | 64 | Lily_Kautzer@hotmail.com |
| 3 | Ruth | McDermott | 62 | Misty_Collier94@yahoo.com |
| 4 | Lauryn | Fritsch | 58 | Tommie.Sipes@gmail.com |
| 5 | Leola | Jacobson | 61 | Lizzie_Lesch51@hotmail.com |
| 6 | Alton | Harris | 35 | Mertie.Stiedemann@gmail.com |
| 7 | Nadine | Moore | 58 | Thurman.Lesch@yahoo.com |
| 8 | Julia | Connelly | 55 | Edmond69@gmail.com |
| 9 | Marilie | Lesch | 27 | Tricia.Gottlieb@hotmail.com |
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Irvin | Daugherty | 19 | Trycia_Dooley-Corwin32@yahoo.com |
| 1 | Vicky | Funk | 22 | Armando_Baumbach@hotmail.com |
| 2 | Leon | Torp | 64 | Lily_Kautzer@hotmail.com |
| 3 | Ruth | McDermott | 62 | Misty_Collier94@yahoo.com |
| 4 | Lauryn | Fritsch | 58 | Tommie.Sipes@gmail.com |
| 5 | Leola | Jacobson | 61 | Lizzie_Lesch51@hotmail.com |
| 6 | Alton | Harris | 35 | Mertie.Stiedemann@gmail.com |
| 7 | Nadine | Moore | 58 | Thurman.Lesch@yahoo.com |
| 8 | Julia | Connelly | 55 | Edmond69@gmail.com |
| 9 | Marilie | Lesch | 27 | Tricia.Gottlieb@hotmail.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 | Darren | Kautzer | 44 | Adrianna_Moore6@yahoo.com |
| 1 | Rocky | Halvorson | 62 | Christy_Kerluke0@yahoo.com |
| 2 | Carroll | Luettgen | 22 | Lucienne.Parker@gmail.com |
| 3 | Lindsay | Jones | 35 | Dalton45@gmail.com |
| 4 | Kendrick | Kohler | 35 | Faye27@yahoo.com |
| 5 | Benny | Moore-Schulist | 47 | Ebony_Beatty19@yahoo.com |
| 6 | Andre | Zboncak | 24 | Lowell_Hansen41@gmail.com |
| 7 | Ophelia | Rutherford | 26 | Rick.Senger56@yahoo.com |
| 8 | Luz | Pollich | 65 | Madie50@yahoo.com |
| 9 | Joey | Hermann | 53 | Jacinthe18@yahoo.com |
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Darren | Kautzer | 44 | Adrianna_Moore6@yahoo.com |
| 1 | Rocky | Halvorson | 62 | Christy_Kerluke0@yahoo.com |
| 2 | Carroll | Luettgen | 22 | Lucienne.Parker@gmail.com |
| 3 | Lindsay | Jones | 35 | Dalton45@gmail.com |
| 4 | Kendrick | Kohler | 35 | Faye27@yahoo.com |
| 5 | Benny | Moore-Schulist | 47 | Ebony_Beatty19@yahoo.com |
| 6 | Andre | Zboncak | 24 | Lowell_Hansen41@gmail.com |
| 7 | Ophelia | Rutherford | 26 | Rick.Senger56@yahoo.com |
| 8 | Luz | Pollich | 65 | Madie50@yahoo.com |
| 9 | Joey | Hermann | 53 | Jacinthe18@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 | Jodi | Harber | 55 | Pink_Herman97@yahoo.com |
| 1 | Alana | Dicki | 37 | Guillermo.Fay93@hotmail.com |
| 2 | Wanda | Schuster | 63 | Roman_Dickens@yahoo.com |
| 3 | Sofia | Hessel | 38 | Isaac85@yahoo.com |
| 4 | Deonte | Corkery | 31 | Josie.Koepp@gmail.com |
| 5 | Gail | Bruen | 23 | Ethyl_Jenkins@yahoo.com |
| 6 | Evie | Tromp | 27 | Jeramie37@gmail.com |
| 7 | Pat | Upton | 22 | Diana_Fisher@yahoo.com |
| 8 | Matt | Murphy | 31 | Dock92@hotmail.com |
| 9 | Dessie | Schaefer | 59 | Leola88@yahoo.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} withBorder withScrollArea />
列の区切り線を追加する
列の区切り線を追加する場合は、withColumnBordersをtrueにします。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Heather | Kassulke | 57 | Floyd.Ernser92@hotmail.com |
| 1 | Stephen | Halvorson-Kshlerin | 23 | Jacquelyn66@gmail.com |
| 2 | Esperanza | Muller | 38 | Mortimer.Ullrich45@gmail.com |
| 3 | Abdiel | Mosciski | 22 | Desiree_Schulist37@gmail.com |
| 4 | Elsie | Kuvalis | 21 | Linda_Baumbach@gmail.com |
| 5 | Essie | Cormier | 59 | Declan79@gmail.com |
| 6 | Krystal | Kihn-Walter | 34 | Marcellus_Dooley@gmail.com |
| 7 | Polly | Kulas | 50 | Lois_Bogan@gmail.com |
| 8 | Rosetta | Keeling | 50 | Lorine_Hand11@gmail.com |
| 9 | Monica | McClure | 37 | Camren_Gleichner50@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} withColumnBorders withScrollArea />
行がホバーされたときにハイライトする
行がホバーされたときにハイライトする場合は、highlightOnHoverをtrueにします。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Rogelio | Bailey | 62 | Samuel.Ullrich8@hotmail.com |
| 1 | Lucius | Keebler | 32 | Henri.Altenwerth@yahoo.com |
| 2 | Lincoln | Flatley | 42 | Raymond.Zulauf66@gmail.com |
| 3 | Carlton | Rolfson | 18 | Jensen.Miller89@hotmail.com |
| 4 | Ellis | Hammes | 35 | Rita_Crona@gmail.com |
| 5 | Irving | Kulas | 39 | Clark82@hotmail.com |
| 6 | Natasha | Reichel | 65 | Juana.Kertzmann20@gmail.com |
| 7 | Benny | O'Reilly | 42 | Porter_Schroeder95@hotmail.com |
| 8 | Jarrell | Balistreri | 20 | Nash_Senger20@gmail.com |
| 9 | Delphia | Larkin | 60 | Melissa49@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} highlightOnHover withScrollArea />
ストライプを使う
ストライプを使う場合は、stripedをtrueにします。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Tod | Johnston-Schroeder | 38 | Augusta.Nikolaus64@hotmail.com |
| 1 | Lenore | Klein | 33 | Sheila_Quigley@gmail.com |
| 2 | Bennett | Dare | 50 | Valerie.Rutherford13@hotmail.com |
| 3 | Juana | Marvin | 21 | Lynne_Conroy@gmail.com |
| 4 | Leo | Cummings-Jacobs | 51 | Nick_Glover8@hotmail.com |
| 5 | Harriet | Kuhlman | 21 | Donato.Bernier@gmail.com |
| 6 | Jakob | Blanda | 37 | Joan_Kutch87@yahoo.com |
| 7 | Rebekah | McGlynn | 39 | Shaun2@yahoo.com |
| 8 | Elliott | Bahringer | 30 | Duncan.Collins44@hotmail.com |
| 9 | Adeline | Stamm | 23 | Noel.Lebsack22@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 | Fay | Bogisich-Kassulke | 25 | Corine37@yahoo.com | 349-740-2957 x969 | admin | active | 11/8/2025 | 5/6/2026 |
| 1 | Emily | Spencer-Gutmann | 44 | Mathew.Trantow@yahoo.com | 1-809-622-1412 | admin | active | 10/27/2025 | 12/16/2025 |
| 2 | Lucienne | Hudson | 59 | Antoinette.Murphy88@yahoo.com | 435.930.4416 | admin | active | 5/22/2026 | 6/10/2026 |
| 3 | Lucy | Barrows | 39 | Jordi.Abbott@hotmail.com | (717) 772-6194 | admin | inactive | 3/26/2026 | 7/27/2026 |
| 4 | Merlin | Crona | 31 | Adolphus6@gmail.com | 898-330-1251 | admin | inactive | 1/11/2026 | 1/5/2026 |
| 5 | Molly | Bauch | 50 | Monica31@hotmail.com | (537) 527-8814 x3127 | admin | active | 12/16/2025 | 5/25/2026 |
| 6 | Amy | Hoppe | 46 | Loy84@gmail.com | 718.207.7656 x420 | admin | active | 9/15/2025 | 11/25/2025 |
| 7 | Velda | McLaughlin | 23 | Germaine39@hotmail.com | 686-553-4558 x24044 | user | active | 12/28/2025 | 9/2/2025 |
| 8 | Carlo | Witting | 63 | Jermain90@gmail.com | 1-938-456-2097 x45022 | user | active | 3/1/2026 | 12/4/2025 |
| 9 | Raul | Turner | 27 | Ruthie.Fisher@hotmail.com | (289) 710-8556 x9930 | user | active | 3/14/2026 | 1/7/2026 |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columnsFull} data={data} withScrollArea />
ヘッダーグループ
| id | user | |||
|---|---|---|---|---|
| name | age | |||
| firstName | lastName | |||
| 0 | Neal | Aufderhar | 49 | Timmothy.Mayer@gmail.com |
| 1 | Friedrich | Orn | 19 | Rogelio_OHara65@gmail.com |
| 2 | Dwight | Gutmann | 20 | Edwin47@hotmail.com |
| 3 | Fabiola | Fisher | 26 | Rachel.Littel@gmail.com |
| 4 | Larue | Hackett | 41 | Wm.Vandervort@yahoo.com |
| 5 | Magnus | Rowe | 62 | Sam79@yahoo.com |
| 6 | Frederick | Lowe | 60 | Lucy.Volkman@gmail.com |
| 7 | Trisha | Gutkowski | 50 | Kailyn_Stoltenberg8@hotmail.com |
| 8 | Agustin | Stanton | 47 | Maurice.Emard96@yahoo.com |
| 9 | Jedidiah | Wunsch | 36 | Kraig.Schamberger@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 | Hattie | Waelchi | 27 | Malcolm35@yahoo.com |
| 1 | Doreen | Armstrong | 35 | Mabel.Wyman@yahoo.com |
| 2 | Layne | McDermott | 22 | Dortha23@hotmail.com |
| 3 | Timothy | Anderson | 18 | Johnathan.Watsica59@hotmail.com |
| 4 | Chesley | Grimes | 36 | Johnny18@hotmail.com |
| 5 | Darin | Hickle | 28 | Carol.Kuhic@yahoo.com |
| 6 | Wilburn | Brown | 18 | Irwin63@hotmail.com |
| 7 | Jerrod | Carter | 27 | Evelyn_Hauck@yahoo.com |
| 8 | Tiffany | Roberts | 57 | Jermaine57@yahoo.com |
| 9 | Margret | Jacobson | 58 | Gianni.Willms-Reichert@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 | Tyrell | Hudson | 22 | Gregg_Prosacco@gmail.com |
| 1 | Natasha | Rohan | 61 | Ike_Schinner@gmail.com |
| 2 | Kristy | Murazik | 63 | Kelli27@hotmail.com |
| 3 | Roland | Simonis | 49 | Cecilia.Konopelski29@yahoo.com |
| 4 | Mollie | Durgan | 59 | Percy_King@yahoo.com |
| 5 | Eldon | O'Conner | 61 | Savannah20@yahoo.com |
| 6 | Brianne | Funk-Sipes | 33 | Liana_Rath-Rogahn33@hotmail.com |
| 7 | Joan | Schumm | 26 | Justine_Spencer@hotmail.com |
| 8 | Vernon | Lynch | 32 | Candice36@hotmail.com |
| 9 | Millie | Huel | 61 | Georgette56@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 | Myrtle | Hammes | 47 | Priscilla.Schinner11@gmail.com |
| 1 | Julius | Huel | 21 | Norman.Crona@yahoo.com |
| 2 | Catalina | Johns | 47 | Penny.Connelly85@yahoo.com |
| 3 | Agnes | Larkin | 46 | Norman.Doyle@gmail.com |
| 4 | Gregoria | Schaefer | 49 | Bryce37@gmail.com |
| 5 | Darin | Reinger | 28 | Tyler.Wiza88@yahoo.com |
| 6 | Harmon | Hickle | 50 | Marty31@hotmail.com |
| 7 | Jessica | Batz | 49 | Chris.Reinger@yahoo.com |
| 8 | Cameron | Farrell | 55 | Christy.Goldner98@gmail.com |
| 9 | Jude | Cormier | 43 | Daija.Thompson51@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 | Clarabelle | Conroy | 28 | Mireya_Sporer55@yahoo.com |
| 1 | Jedidiah | Trantow-Wolf | 27 | Daisy.Rempel@yahoo.com |
| 2 | Bruce | Gleichner | 59 | Sherry_Treutel88@hotmail.com |
| 3 | Becky | Hansen | 62 | Jeremy.Streich@yahoo.com |
| 4 | Edith | Steuber | 18 | Beverly14@gmail.com |
| 5 | Byron | Gottlieb | 54 | Darrell47@yahoo.com |
| 6 | Irene | Hand | 20 | Cora.Hoppe29@yahoo.com |
| 7 | Meredith | Ziemann | 63 | Shari.Moen5@gmail.com |
| 8 | Kianna | Nikolaus | 56 | Spencer33@hotmail.com |
| 9 | Hallie | Heathcote | 34 | Murphy_Skiles36@gmail.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 | Howard | Cronin | 53 | Jeanette_Ebert@hotmail.com |
| 1 | Emmanuelle | Thiel | 28 | Milton76@yahoo.com |
| 2 | Roxanne | Treutel | 54 | Rhea81@hotmail.com |
| 3 | Eddie | Heller | 37 | Abby_Klein@yahoo.com |
| 4 | Georgianna | Hickle | 55 | Raul.Schroeder@yahoo.com |
| 5 | Denise | Murazik | 41 | Vincent.Reynolds@gmail.com |
| 6 | Alejandro | Vandervort | 41 | Candice_Hilpert@hotmail.com |
| 7 | Virginia | Treutel | 33 | Leland.Johnston-Bashirian@hotmail.com |
| 8 | Savannah | Collier | 36 | Vernon.Borer-Kovacek46@hotmail.com |
| 9 | Michaela | Kunze | 57 | Julius.Senger@gmail.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 | |
|---|---|---|---|---|
| 0 | Jane | Walsh | 61 | Heath_Koss6@yahoo.com |
| 8 | Reymundo | Littel | 56 | Jed44@gmail.com |
| 6 | Eloise | Ruecker | 52 | Bettie92@gmail.com |
| 1 | Bobbie | Kreiger | 39 | Yasmin.Bahringer@gmail.com |
| 2 | Ben | Towne | 39 | Dewey.Padberg98@gmail.com |
| 7 | Elbert | Cormier | 32 | Pablo.Waters@yahoo.com |
| 3 | Darnell | Mraz-Blanda | 24 | Michele_Green@gmail.com |
| 4 | Arvel | Halvorson | 21 | Clinton.Borer94@yahoo.com |
| 5 | Taurean | Kohler | 19 | Sammy27@gmail.com |
| 9 | Yolanda | Hirthe | 19 | Merle.Crist@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 | Clark | Leuschke | 62 | Lynda.Purdy47@hotmail.com |
| 1 | Corbin | Murphy | 41 | Anne41@yahoo.com |
| 2 | Dallas | Towne | 28 | Anne99@gmail.com |
| 3 | Augusta | Williamson | 48 | Keira_Padberg@hotmail.com |
| 4 | Carmella | Ritchie | 63 | Nellie99@yahoo.com |
| 5 | Lafayette | Doyle | 42 | Kelley11@yahoo.com |
| 6 | Brycen | Metz | 44 | Rodrick57@gmail.com |
| 7 | Crawford | Denesik | 25 | Dawn_Batz1@gmail.com |
| 8 | Laverne | Borer | 21 | David89@gmail.com |
| 9 | Kiley | Hand | 19 | Ellis_Stiedemann@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table columns={columns} data={data} enableSorting={false} withScrollArea />
)
複数列のソートを無効にする
複数列のソートを無効にする場合は、enableMultiSortをfalseに設定します。デフォルトは、trueです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Rylee | Parker | 45 | Alison86@hotmail.com |
| 1 | Mable | Schneider | 32 | Elliot_Kulas25@hotmail.com |
| 2 | Sherri | Batz | 47 | Irwin55@yahoo.com |
| 3 | Traci | Kshlerin | 18 | Ned40@hotmail.com |
| 4 | Sierra | Murphy | 27 | Alexa87@hotmail.com |
| 5 | Diane | Roob | 34 | Jeffrey43@gmail.com |
| 6 | Keith | Upton | 18 | Ramona74@hotmail.com |
| 7 | Demarcus | Sawayn | 52 | Adele94@gmail.com |
| 8 | Anne | Hayes | 35 | Mona34@hotmail.com |
| 9 | Moriah | Casper | 20 | Joaquin.Batz97@yahoo.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table columns={columns} data={data} enableMultiSort={false} withScrollArea />
)
最大のソート可能な列数を設定する
最大のソート可能な列数を設定する場合は、maxMultiSortColCountに数値を設定します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Lawrence | Mertz | 26 | Cristina21@gmail.com |
| 1 | Noel | Thiel | 29 | Domingo.Powlowski36@gmail.com |
| 2 | Delores | Stoltenberg | 61 | Rita_Reynolds@gmail.com |
| 3 | Samuel | Orn | 27 | Ryan64@yahoo.com |
| 4 | Doyle | Schaefer | 43 | Kaleb89@gmail.com |
| 5 | Paolo | Cummerata | 39 | Orlo21@hotmail.com |
| 6 | Mabel | Runte | 57 | Jerrod_Collier@gmail.com |
| 7 | Trevor | Lemke | 28 | Dave_Christiansen39@hotmail.com |
| 8 | Holly | Strosin | 47 | Kiana96@gmail.com |
| 9 | Samantha | Conn | 27 | Eli_McGlynn1@yahoo.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
maxMultiSortColCount={2}
withScrollArea
/>
)
手動のソートを使う
手動のソートを使う場合は、manualSortingをtrueに設定します。デフォルトは、falseです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Coty | Abbott | 51 | Missouri_Parker98@hotmail.com |
| 1 | Rebecca | Waelchi | 19 | Lesley.Rogahn50@hotmail.com |
| 2 | Frankie | Harris | 60 | Inez_Stiedemann@hotmail.com |
| 3 | Lester | Botsford | 65 | Katherine23@yahoo.com |
| 4 | Nelson | Becker | 31 | Alison21@hotmail.com |
| 5 | Dale | Windler | 63 | Katie.McLaughlin@gmail.com |
| 6 | Furman | Koepp | 64 | Magali11@gmail.com |
| 7 | Dameon | Toy | 52 | Pete.Vandervort@hotmail.com |
| 8 | Nora | Ankunding | 22 | Isabelle_Beatty15@yahoo.com |
| 9 | Cristobal | Lindgren | 44 | Ulices53@yahoo.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 | Marguerite | Waelchi | 62 | Juanita.McGlynn67@hotmail.com |
| 1 | Leon | Thompson | 37 | Nora_Little32@hotmail.com |
| 2 | Dahlia | Baumbach | 50 | Jonathon_Kulas14@gmail.com |
| 3 | Leroy | Lueilwitz | 65 | Gene_Corwin65@yahoo.com |
| 4 | Deanna | Daugherty | 59 | Gideon_Ritchie14@yahoo.com |
| 5 | Virginia | Abshire | 35 | Hubert_Krajcik6@hotmail.com |
| 6 | Sonia | Kutch | 45 | Teresa86@hotmail.com |
| 7 | Janelle | Nicolas | 59 | Rachelle.Johns@yahoo.com |
| 8 | Willis | Franecki | 35 | Cathy16@hotmail.com |
| 9 | Todd | Daugherty | 31 | Eric76@yahoo.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} sortDescFirst withScrollArea />
ソートを制御する
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Breana | Kutch | 48 | Kenyon_Schroeder12@gmail.com |
| 1 | Simone | Kerluke | 35 | Adell28@gmail.com |
| 2 | Carrie | Langosh | 39 | Bryant_Schoen4@hotmail.com |
| 3 | Marcus | Bode | 30 | Andrew.Gorczany@hotmail.com |
| 4 | Ross | Schmitt | 46 | Kirstin_Hirthe@gmail.com |
| 5 | Allison | Quitzon | 62 | Nathanael95@hotmail.com |
| 6 | Kari | Bernhard | 46 | Mae25@gmail.com |
| 7 | Benny | Kunze | 30 | Kamren.Lueilwitz29@hotmail.com |
| 8 | Nicolas | Dietrich | 52 | Karley_Runolfsson@yahoo.com |
| 9 | Lisa | McCullough | 54 | Joseph.Bechtelar@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 | Harvey | Yundt | 40 | Concepcion.Baumbach@gmail.com |
| 1 | Breanne | Bergnaum | 33 | Troy.Murazik@hotmail.com |
| 2 | Gary | Johns | 47 | Annette.Runolfsson7@gmail.com |
| 3 | Jolie | Towne | 28 | Rashawn_Ledner@yahoo.com |
| 4 | Loretta | Hyatt | 62 | Alvin.Hackett68@hotmail.com |
| 5 | Jim | Hauck | 52 | Bryant.Hauck@hotmail.com |
| 6 | Burnice | Mayert-Medhurst | 25 | Kenton_Rosenbaum@hotmail.com |
| 7 | Howard | Reichel | 20 | Adelbert.Kilback84@yahoo.com |
| 8 | Ann | Pouros-Okuneva | 28 | Arnold.Muller@gmail.com |
| 9 | Jess | Huel | 42 | Duane92@gmail.com |
| 10 | Roger | Leuschke | 55 | Giles.Bahringer20@yahoo.com |
| 11 | Santino | Bartell | 23 | Rickey.Haag92@yahoo.com |
| 12 | Hailey | Hintz | 48 | Leonard.Ryan@yahoo.com |
| 13 | Ruthie | Schmeler | 20 | George34@hotmail.com |
| 14 | Wilbert | Bins | 26 | Ella69@gmail.com |
| 15 | Mason | Kunze | 21 | Kristopher3@yahoo.com |
| 16 | Prince | Lang-Trantow | 28 | Claudia98@yahoo.com |
| 17 | Lucienne | Keebler | 53 | Ellen99@gmail.com |
| 18 | Salvatore | Haag | 49 | Arden_Zemlak@yahoo.com |
| 19 | Ignacio | Keeling | 56 | Jovanny_Hand@gmail.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 | Opal | Bogisich | 40 | Micah.Schamberger@hotmail.com |
| 11 | Hassan | Toy | 36 | Cleveland97@yahoo.com |
| 12 | Alison | Little | 31 | Lessie.Turcotte@hotmail.com |
| 13 | Annie | Padberg | 55 | Sara3@gmail.com |
| 14 | Berniece | Strosin-Schultz | 36 | Belinda60@yahoo.com |
| 15 | Janice | Murphy | 59 | Frederique12@gmail.com |
| 16 | Audreanne | Torp | 48 | Leonard_Maggio18@hotmail.com |
| 17 | Alvera | Runolfsson | 45 | Lamar_Walker12@yahoo.com |
| 18 | Dominick | Boyer | 58 | Jairo10@hotmail.com |
| 19 | Jamaal | Bruen | 56 | Chasity_Corwin16@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 | Stefan | Rolfson | 55 | Bell.Little@yahoo.com |
| 1 | Sarai | Roberts | 43 | Mackenzie.Kub10@yahoo.com |
| 2 | Elijah | Hettinger | 21 | Kenny.Effertz97@yahoo.com |
| 3 | Jarvis | Moore | 47 | Thurman_Upton91@gmail.com |
| 4 | Reilly | Kuhlman | 23 | Annamarie_Konopelski@gmail.com |
| 5 | Dianne | Rogahn | 49 | Kellie10@hotmail.com |
| 6 | Lucille | Balistreri | 63 | Rosemarie19@gmail.com |
| 7 | Gonzalo | Lynch | 64 | Oliver.OConnell-Kozey@yahoo.com |
| 8 | Martin | Will | 33 | Cesar_Lind45@yahoo.com |
| 9 | Kiarra | Goodwin | 49 | America_Deckow@yahoo.com |
| 10 | Hubert | Vandervort | 35 | Karolann11@hotmail.com |
| 11 | Harold | Abernathy | 22 | Candido.Konopelski@gmail.com |
| 12 | Deja | Torp | 18 | Estefania_Hilpert40@hotmail.com |
| 13 | Roderick | Rutherford | 36 | Rasheed86@hotmail.com |
| 14 | Teri | Nitzsche | 22 | Hannah_Miller25@gmail.com |
| 15 | April | Vandervort | 44 | Eleanora.OHara33@hotmail.com |
| 16 | Sabrina | Herzog | 36 | Stewart48@hotmail.com |
| 17 | Alice | O'Hara | 48 | Leah75@hotmail.com |
| 18 | Cesar | Turcotte | 39 | Daren_Toy@hotmail.com |
| 19 | Maxine | Fahey | 32 | Harmony.Champlin13@hotmail.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 | Paolo | Langworth | 34 | Wendy_Bechtelar25@yahoo.com |
| 1 | Alejandrin | Lemke | 20 | Bennett.Beier@gmail.com |
| 2 | Samuel | Smitham | 45 | Tommie_Waelchi8@yahoo.com |
| 3 | Joanne | Bode | 29 | Willis_Leannon@hotmail.com |
| 4 | Jailyn | Koelpin | 54 | Iris29@yahoo.com |
| 5 | Carey | Pfannerstill | 33 | Bryon.Smith37@yahoo.com |
| 6 | Pierre | Glover | 21 | Darrin36@hotmail.com |
| 7 | Mike | Fritsch | 51 | Kristian_Hermiston67@hotmail.com |
| 8 | Cyril | Barrows | 31 | Charlene_Kautzer@gmail.com |
| 9 | Shelly | Greenholt | 53 | Edgar_Koss32@yahoo.com |
| 10 | Buck | Blick | 64 | Marjorie_Feil@gmail.com |
| 11 | Shyann | Sanford | 58 | Joey.Nitzsche40@yahoo.com |
| 12 | Ron | Beer | 41 | Matilde31@yahoo.com |
| 13 | Vivian | Ledner | 49 | Claude.Morar53@hotmail.com |
| 14 | Ima | Heathcote | 28 | Darrin_Olson71@gmail.com |
| 15 | Terrell | Waters | 37 | Brisa46@hotmail.com |
| 16 | Angie | Koepp | 28 | Shakira_Farrell@yahoo.com |
| 17 | Pete | O'Reilly | 23 | Annabel_Marvin15@hotmail.com |
| 18 | Janice | Bartoletti | 40 | Nina.Muller@yahoo.com |
| 19 | Lana | Flatley | 44 | Quentin_Gutmann55@hotmail.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 | Clarence | Kautzer | 48 | Pansy.Von@hotmail.com | |
| 1 | Queenie | Roob | 57 | Lynn_Towne@yahoo.com | |
| 2 | Hester | West | 32 | Preston83@hotmail.com | |
| 3 | Erik | Parker | 31 | Fausto_Jast40@hotmail.com | |
| 4 | Princess | Terry | 35 | Gino_Rogahn56@yahoo.com | |
| 5 | Olive | Klocko | 51 | Rodney12@hotmail.com | |
| 6 | Shaun | Cruickshank | 47 | Zackery86@gmail.com | |
| 7 | Antonia | Hilll | 54 | Xander.Schuppe@yahoo.com | |
| 8 | Sterling | Shields | 41 | Josephine.Grimes71@gmail.com | |
| 9 | Candida | Thiel | 38 | Manuel.Hane@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} enableRowSelection withScrollArea />
デフォルトの選択された行を設定する
デフォルトの選択された行を設定する場合は、defaultRowSelectionにdataのインデックスをキーとしたオブジェクトを設定します。
| id | firstName | lastName | age | ||
|---|---|---|---|---|---|
| 0 | Monique | Wintheiser | 37 | Audreanne10@yahoo.com | |
| 1 | Abel | Barton | 38 | Clint_Pagac98@yahoo.com | |
| 2 | Liliane | Will | 43 | Kellie56@yahoo.com | |
| 3 | Chet | Runolfsdottir | 52 | Everett_Wolf43@hotmail.com | |
| 4 | Martha | Friesen | 31 | Emelie.Rolfson@yahoo.com | |
| 5 | Emelia | Blick | 43 | Kathleen23@gmail.com | |
| 6 | Bernardo | Toy | 30 | Shirley_Johnson@hotmail.com | |
| 7 | Geneva | O'Hara | 43 | Grady.Gorczany93@hotmail.com | |
| 8 | Josefina | Conroy | 58 | Deshawn.Wilkinson69@yahoo.com | |
| 9 | Elnora | Medhurst | 23 | Bruce.Beatty89@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 | Janice | Shanahan | 40 | Edith_Schultz50@gmail.com | |
| 1 | Belinda | Schuppe | 37 | Eleanor.Breitenberg1@hotmail.com | |
| 2 | Jerrod | Gulgowski | 28 | Shelly.Muller7@yahoo.com | |
| 3 | Nelson | Gleichner | 19 | Rodney.Kertzmann74@hotmail.com | |
| 4 | Clay | Kihn | 64 | Yesenia_Larkin60@yahoo.com | |
| 5 | Trevor | Conroy | 30 | Marco43@gmail.com | |
| 6 | Alfred | Littel | 46 | Gilbert.Friesen72@hotmail.com | |
| 7 | Jayda | Bartoletti | 45 | Arturo.Thompson75@hotmail.com | |
| 8 | Shari | Parisian | 25 | Dwayne73@hotmail.com | |
| 9 | Christy | Senger | 48 | Gilbert7@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableRowSelection
selectOnClickRow
withScrollArea
/>
)
チェックボックスを非表示にする
チェックボックスを非表示にする場合は、withCheckboxをfalseに設定します。デフォルトは、trueです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Kailey | Rath | 62 | Aaron.McDermott@yahoo.com |
| 1 | Lois | Sporer | 32 | Charlotte_Parisian82@gmail.com |
| 2 | Rick | Schaefer | 19 | Wanda_Hermiston14@hotmail.com |
| 3 | Kasandra | Runte | 53 | Shawna_Flatley8@yahoo.com |
| 4 | Sherri | Braun | 43 | Rashawn_Lubowitz@yahoo.com |
| 5 | Cortez | Wolff | 53 | Kavon.Sauer8@hotmail.com |
| 6 | Mathew | Koepp | 37 | Marie_Senger79@gmail.com |
| 7 | Carrie | Zulauf | 38 | Marquise_Upton86@hotmail.com |
| 8 | Rita | Bruen | 44 | Lowell_Stroman@hotmail.com |
| 9 | Jaiden | Bednar | 26 | Vera_Huels1@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableRowSelection
selectOnClickRow
withCheckbox={false}
withScrollArea
/>
)
行を無効にする
行を無効にする場合は、enableRowSelectionに条件の関数を設定します。
| id | firstName | lastName | age | ||
|---|---|---|---|---|---|
| 0 | Jim | Monahan | 29 | Alyssa90@hotmail.com | |
| 1 | Jared | Ortiz | 22 | Laverne31@yahoo.com | |
| 2 | Sarah | Schinner | 64 | Elaina_Ferry41@gmail.com | |
| 3 | Jayce | Herman | 23 | Beatrice.Schiller83@gmail.com | |
| 4 | June | Hudson | 41 | Mertie80@gmail.com | |
| 5 | Shaniya | Konopelski | 39 | Flora.Krajcik0@yahoo.com | |
| 6 | Marilyn | Satterfield | 52 | Connie_Weimann56@yahoo.com | |
| 7 | Tony | McClure | 64 | Favian.Parisian@gmail.com | |
| 8 | Wm | Mueller | 50 | Alejandra.Zemlak3@yahoo.com | |
| 9 | Sister | Collins | 29 | Skylar.Fisher@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 | Fabian | Smitham | 53 | Lavinia.Wunsch39@gmail.com | |
| 1 | Jazmyne | Kilback | 45 | Wilfred75@gmail.com | |
| 2 | Jaron | Blanda | 41 | Jordane_Dach@yahoo.com | |
| 3 | Diane | Klocko | 37 | Jose20@yahoo.com | |
| 4 | Emmet | Blick | 52 | Eriberto98@hotmail.com | |
| 5 | Erma | Schuster | 54 | Sammie.Von23@yahoo.com | |
| 6 | Concepcion | Schimmel | 22 | Walter_Willms@yahoo.com | |
| 7 | Joe | McLaughlin | 57 | Jeannie.Zemlak@gmail.com | |
| 8 | Cielo | Johnson | 56 | Ida.Jast22@hotmail.com | |
| 9 | Randy | Dibbert | 21 | Nathan6@gmail.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 | Wilfred | Dickinson | 53 | Ronnie_Rolfson@yahoo.com |
| 1 | Kelvin | O'Kon | 40 | Domingo.Friesen@hotmail.com |
| 2 | Dean | Green | 35 | Arely57@yahoo.com |
| 3 | Kane | Hegmann | 60 | Cristal.Bruen29@yahoo.com |
| 4 | Joshua | Kuvalis | 33 | Dayana20@yahoo.com |
| 5 | Fannie | Swift | 21 | Neha.Schimmel36@gmail.com |
| 6 | Rowan | Lehner | 49 | Scottie87@hotmail.com |
| 7 | Wendy | Hudson | 35 | Zelma_Vandervort@gmail.com |
| 8 | Novella | Prosacco | 19 | Marcia66@gmail.com |
| 9 | Shayne | Kuvalis | 50 | Pete.Brekke91@hotmail.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 | |
|---|---|---|---|---|
| 4 | Prudence | Hermiston | 56 | Rogers_Sipes@gmail.com |
| 5 | Jessika | Ondricka | 60 | Darlene_OReilly26@gmail.com |
| 9 | Carolyn | Price | 21 | Ebony.Jaskolski@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 | Valentina | Bauch | 31 | Lionel19@hotmail.com |
| 1 | Presley | Parker | 61 | Greyson.Mueller41@yahoo.com |
| 2 | Johnson | Terry | 20 | Nils28@hotmail.com |
| 3 | Evan | Jast | 35 | Braulio3@yahoo.com |
| 4 | Antonio | Jacobs | 36 | Noah83@yahoo.com |
| 5 | Nora | Blanda | 38 | Norene_Schultz@hotmail.com |
| 6 | Carmel | Dooley | 59 | Dominic_Lakin@yahoo.com |
| 7 | Murray | Metz | 40 | Aric_Braun@hotmail.com |
| 8 | Raegan | Labadie | 29 | Dylan_Hackett@hotmail.com |
| 9 | Christie | Beier | 43 | James.Prosacco@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 | Easter | Hane | 36 | Arlo_Corkery@gmail.com |
| 1 | Arch | Hamill | 46 | Santino77@gmail.com |
| 2 | Allene | Shields | 23 | Wendy55@yahoo.com |
| 3 | Pinkie | Gottlieb | 29 | Stephanie.Okuneva@hotmail.com |
| 4 | Henrietta | McCullough | 26 | Dennis_Steuber@gmail.com |
| 5 | Jermey | Kozey | 61 | Juvenal0@yahoo.com |
| 6 | Clinton | Thiel-Cronin | 30 | Clayton_Koelpin-Harber@hotmail.com |
| 7 | Eliza | Doyle | 35 | Jeffrey_Sipes@gmail.com |
| 8 | Joan | Murphy | 38 | Ena90@yahoo.com |
| 9 | Christina | Lowe | 32 | Haskell55@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableColumnResizing
withBorder
withColumnBorders
/>
)
列のサイズ変更の方法を変更する
デフォルトでは、列のサイズ変更のタイミングは、ドラッグしている間に変更されます。ドラッグが終わったときに変更する場合は、columnResizeModeに"onEnd"を設定します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Lilly | Morissette | 24 | Ruth.Jast52@hotmail.com |
| 1 | Adrain | Homenick | 48 | Alexis14@yahoo.com |
| 2 | Gregoria | Nitzsche | 44 | Lance_Erdman95@yahoo.com |
| 3 | Judah | Murazik | 25 | Alejandro_Rowe@gmail.com |
| 4 | Jocelyn | Harvey | 41 | Marlin.Bernier@gmail.com |
| 5 | Thad | Turcotte | 27 | Norman_Feil81@hotmail.com |
| 6 | Lacey | Abernathy | 28 | Jacob36@yahoo.com |
| 7 | Perry | Bergstrom | 33 | Dominic9@gmail.com |
| 8 | Erma | O'Kon | 23 | Juana.Littel@hotmail.com |
| 9 | Verna | Cormier | 61 | Elvis41@gmail.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は、データ項目のリストを表示するために使用されます。