Table
Tableは、列のソートや行の選択やクリックイベント機能を備えたテーブルのコンポーネントです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Geo | Beahan | 29 | Craig.Hickle37@hotmail.com |
| 1 | Marcelino | Jones | 37 | Emanuel.OKeefe96@yahoo.com |
| 2 | Jena | Wisozk | 63 | Juana.Schmitt@hotmail.com |
| 3 | Derek | Block | 64 | Wilfrid_Haley7@hotmail.com |
| 4 | Rex | Corkery | 38 | Arnold_Heathcote@hotmail.com |
| 5 | Rodolfo | Koch | 29 | Celine.Hagenes@gmail.com |
| 6 | Maggie | Veum | 48 | Elyse.Goodwin1@gmail.com |
| 7 | Miguel | Dibbert | 57 | Tricia_Lowe-Friesen89@gmail.com |
| 8 | Drew | Dickinson | 59 | Sarai.Greenholt90@gmail.com |
| 9 | Tyler | Schamberger | 23 | Jasmine_Bergstrom82@yahoo.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 | Leatha | Frami | 38 | Sara.Hayes@hotmail.com |
| 1 | Celia | Hessel | 54 | Jay_Wilkinson11@hotmail.com |
| 2 | Becky | O'Kon | 40 | Jewell.Reynolds47@hotmail.com |
| 3 | Tyler | Hayes | 63 | Elizabeth_Wolf@yahoo.com |
| 4 | Dianne | Hackett | 57 | Bryana.Predovic10@gmail.com |
| 5 | Bobbie | Marks | 43 | Kendra.OHara@yahoo.com |
| 6 | Marjorie | Hermann | 31 | Simon17@hotmail.com |
| 7 | Kylie | Reichert | 27 | Rufus.McKenzie@gmail.com |
| 8 | Marcus | Hilll | 48 | Charlotte_Kiehn@yahoo.com |
| 9 | Erin | Kuhic | 58 | Adell8@hotmail.com |
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Leatha | Frami | 38 | Sara.Hayes@hotmail.com |
| 1 | Celia | Hessel | 54 | Jay_Wilkinson11@hotmail.com |
| 2 | Becky | O'Kon | 40 | Jewell.Reynolds47@hotmail.com |
| 3 | Tyler | Hayes | 63 | Elizabeth_Wolf@yahoo.com |
| 4 | Dianne | Hackett | 57 | Bryana.Predovic10@gmail.com |
| 5 | Bobbie | Marks | 43 | Kendra.OHara@yahoo.com |
| 6 | Marjorie | Hermann | 31 | Simon17@hotmail.com |
| 7 | Kylie | Reichert | 27 | Rufus.McKenzie@gmail.com |
| 8 | Marcus | Hilll | 48 | Charlotte_Kiehn@yahoo.com |
| 9 | Erin | Kuhic | 58 | Adell8@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 | Margaret | Raynor | 41 | Cyril12@hotmail.com |
| 1 | Abigale | Erdman | 34 | Jonathon_Denesik@yahoo.com |
| 2 | Imani | Heidenreich | 59 | Skyla.Buckridge48@hotmail.com |
| 3 | Lauren | Rutherford | 44 | Joshua.Kozey63@hotmail.com |
| 4 | June | Medhurst | 46 | Edyth.Strosin@hotmail.com |
| 5 | Yasmine | Stokes | 55 | Dwayne.Jenkins31@gmail.com |
| 6 | Penny | Hagenes | 37 | Marjolaine.Hodkiewicz@gmail.com |
| 7 | Christine | Durgan | 57 | Dayana.Greenfelder@gmail.com |
| 8 | Kristin | Doyle-Koch | 37 | Grayce.Little28@gmail.com |
| 9 | Francis | Renner | 48 | Marguerite_Barton@gmail.com |
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Margaret | Raynor | 41 | Cyril12@hotmail.com |
| 1 | Abigale | Erdman | 34 | Jonathon_Denesik@yahoo.com |
| 2 | Imani | Heidenreich | 59 | Skyla.Buckridge48@hotmail.com |
| 3 | Lauren | Rutherford | 44 | Joshua.Kozey63@hotmail.com |
| 4 | June | Medhurst | 46 | Edyth.Strosin@hotmail.com |
| 5 | Yasmine | Stokes | 55 | Dwayne.Jenkins31@gmail.com |
| 6 | Penny | Hagenes | 37 | Marjolaine.Hodkiewicz@gmail.com |
| 7 | Christine | Durgan | 57 | Dayana.Greenfelder@gmail.com |
| 8 | Kristin | Doyle-Koch | 37 | Grayce.Little28@gmail.com |
| 9 | Francis | Renner | 48 | Marguerite_Barton@gmail.com |
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Margaret | Raynor | 41 | Cyril12@hotmail.com |
| 1 | Abigale | Erdman | 34 | Jonathon_Denesik@yahoo.com |
| 2 | Imani | Heidenreich | 59 | Skyla.Buckridge48@hotmail.com |
| 3 | Lauren | Rutherford | 44 | Joshua.Kozey63@hotmail.com |
| 4 | June | Medhurst | 46 | Edyth.Strosin@hotmail.com |
| 5 | Yasmine | Stokes | 55 | Dwayne.Jenkins31@gmail.com |
| 6 | Penny | Hagenes | 37 | Marjolaine.Hodkiewicz@gmail.com |
| 7 | Christine | Durgan | 57 | Dayana.Greenfelder@gmail.com |
| 8 | Kristin | Doyle-Koch | 37 | Grayce.Little28@gmail.com |
| 9 | Francis | Renner | 48 | Marguerite_Barton@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<VStack>
<For each={["sm", "md", "lg"]}>
{(size, index) => (
<Table
key={index}
size={size}
columns={columns}
data={data}
withScrollArea
/>
)}
</For>
</VStack>
)
カラースキームを変更する
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Mustafa | Davis | 51 | Kendrick.Schowalter52@yahoo.com |
| 1 | Hailee | Collins | 53 | Johanna6@hotmail.com |
| 2 | Guillermo | Adams | 50 | Moses_Kohler@hotmail.com |
| 3 | Friedrich | Jones-Weber | 47 | Ana0@hotmail.com |
| 4 | Kimberly | Upton-Maggio | 33 | Remington_Cole@hotmail.com |
| 5 | Kirsten | Herman | 63 | Arthur_Treutel@yahoo.com |
| 6 | Timothy | Sawayn | 35 | Nelda_Dickens@yahoo.com |
| 7 | Olive | Blick | 47 | Verona75@gmail.com |
| 8 | Hiram | Hahn | 38 | Amiya.Schoen@hotmail.com |
| 9 | Russell | Mayer | 21 | Delmer_Zieme20@yahoo.com |
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Mustafa | Davis | 51 | Kendrick.Schowalter52@yahoo.com |
| 1 | Hailee | Collins | 53 | Johanna6@hotmail.com |
| 2 | Guillermo | Adams | 50 | Moses_Kohler@hotmail.com |
| 3 | Friedrich | Jones-Weber | 47 | Ana0@hotmail.com |
| 4 | Kimberly | Upton-Maggio | 33 | Remington_Cole@hotmail.com |
| 5 | Kirsten | Herman | 63 | Arthur_Treutel@yahoo.com |
| 6 | Timothy | Sawayn | 35 | Nelda_Dickens@yahoo.com |
| 7 | Olive | Blick | 47 | Verona75@gmail.com |
| 8 | Hiram | Hahn | 38 | Amiya.Schoen@hotmail.com |
| 9 | Russell | Mayer | 21 | Delmer_Zieme20@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 | Rosalinda | Labadie | 57 | Luther_Keeling@yahoo.com |
| 1 | Maxine | Rohan | 59 | Alejandra_Dietrich@hotmail.com |
| 2 | Mae | Bayer | 31 | Emery.Bogisich@yahoo.com |
| 3 | Flo | Trantow | 51 | Calvin14@gmail.com |
| 4 | Grant | Conn | 58 | Cathy_Baumbach15@yahoo.com |
| 5 | Leona | Fahey | 53 | Jaida57@yahoo.com |
| 6 | Agustina | Oberbrunner | 22 | Katherine74@hotmail.com |
| 7 | Alva | Altenwerth | 21 | Frederick_Kling@yahoo.com |
| 8 | Shawna | Haag | 27 | Grayson74@gmail.com |
| 9 | Jordi | Blanda | 52 | Brock.Turcotte-Mohr86@yahoo.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} withBorder withScrollArea />
列の区切り線を追加する
列の区切り線を追加する場合は、withColumnBordersをtrueにします。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Leigh | Abshire | 19 | Delores.Jast@gmail.com |
| 1 | Nicole | Collier | 48 | Evelyn49@hotmail.com |
| 2 | Lindsey | Lang | 34 | Delia_Carter50@hotmail.com |
| 3 | Tillman | Gulgowski | 49 | Jerad_Runolfsdottir81@hotmail.com |
| 4 | Corey | Weissnat | 48 | Wilhelmine_Hauck7@yahoo.com |
| 5 | Candida | Koss | 32 | Terrence_Hilll57@yahoo.com |
| 6 | Amelia | Bode | 28 | Ines.Bergstrom@yahoo.com |
| 7 | Vena | Hackett | 49 | Randall.Jerde@gmail.com |
| 8 | Dominic | Barrows | 55 | Olga.Macejkovic@hotmail.com |
| 9 | Armando | Hoppe | 49 | Judy_Towne25@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} withColumnBorders withScrollArea />
行がホバーされたときにハイライトする
行がホバーされたときにハイライトする場合は、highlightOnHoverをtrueにします。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Kellen | Herzog | 42 | Seth69@gmail.com |
| 1 | Arvilla | Mann | 24 | Sue.Balistreri@yahoo.com |
| 2 | Karla | Lehner-Grant | 26 | Dahlia_Waters59@hotmail.com |
| 3 | Kelley | Larkin | 39 | Aubrey.Jakubowski@gmail.com |
| 4 | Jerome | Bergnaum | 21 | James75@gmail.com |
| 5 | Carlos | Quitzon | 22 | Martina.Bashirian@hotmail.com |
| 6 | Carmella | Funk | 52 | Russell_Schmeler58@gmail.com |
| 7 | Wallace | Howe | 62 | Judge.Barton33@hotmail.com |
| 8 | Emerson | Braun | 57 | Mckayla_McClure@hotmail.com |
| 9 | Vidal | Kreiger | 31 | Wayne.Schultz@yahoo.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} highlightOnHover withScrollArea />
ストライプを使う
ストライプを使う場合は、stripedをtrueにします。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Lorena | Miller | 57 | Jennifer.Fahey-Williamson@yahoo.com |
| 1 | Ellis | Howell | 37 | Kali_OConner14@gmail.com |
| 2 | Ward | Oberbrunner | 64 | Alvin_Wisozk6@hotmail.com |
| 3 | Vaughn | Daugherty | 63 | Earnest66@gmail.com |
| 4 | Cristian | Yundt | 21 | Janie_Rodriguez0@hotmail.com |
| 5 | Eileen | Jakubowski | 35 | Preston_Carter21@hotmail.com |
| 6 | Alda | Kassulke-Gusikowski | 52 | Emery_Jakubowski@gmail.com |
| 7 | Kay | Wunsch | 61 | April.Tromp@hotmail.com |
| 8 | Jane | Nicolas | 41 | Maureen.Wintheiser70@yahoo.com |
| 9 | Martine | Heathcote | 29 | Melissa_Beer@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 | Willy | Kling | 35 | Whitney.Goyette-Grady2@gmail.com | 253-878-5069 x822 | user | inactive | 7/5/2025 | 12/18/2025 |
| 1 | Marguerite | Jast | 19 | Lillian_Pouros58@hotmail.com | (472) 996-5313 x478 | user | active | 1/21/2026 | 2/26/2026 |
| 2 | Kristina | Rempel | 49 | Ellen.Davis58@gmail.com | 471.482.5797 x16225 | user | inactive | 3/17/2026 | 5/6/2025 |
| 3 | Estelle | Herzog | 41 | Kristopher_Smitham4@hotmail.com | (445) 640-5731 x3321 | admin | active | 10/21/2025 | 1/3/2026 |
| 4 | Hilbert | Williamson | 58 | Leigh_Langosh@gmail.com | 700-545-8155 | admin | inactive | 3/8/2026 | 1/19/2026 |
| 5 | Rachel | O'Reilly | 46 | Shad69@gmail.com | 784.266.9557 x665 | user | inactive | 2/16/2026 | 7/15/2025 |
| 6 | Maryann | Kuhlman | 62 | Jimmie_Donnelly@yahoo.com | (803) 391-9085 x65897 | admin | inactive | 6/7/2025 | 5/9/2025 |
| 7 | Edythe | Reichert | 47 | Francesca.Osinski@gmail.com | 1-394-847-2930 | admin | active | 11/4/2025 | 5/17/2025 |
| 8 | Ottilie | Russel | 56 | Delia_Jast98@yahoo.com | 324.851.5680 x661 | user | active | 4/23/2026 | 7/23/2025 |
| 9 | Hugo | Gerlach | 31 | Arnold.Sawayn@gmail.com | 206.996.7898 x36751 | admin | inactive | 10/5/2025 | 1/25/2026 |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columnsFull} data={data} withScrollArea />
ヘッダーグループ
| id | user | |||
|---|---|---|---|---|
| name | age | |||
| firstName | lastName | |||
| 0 | Mariana | Veum | 34 | Caroline_Donnelly@hotmail.com |
| 1 | Khalil | Quitzon | 55 | Bert_McDermott@yahoo.com |
| 2 | Jerry | Kautzer | 46 | Dorthy.Blanda35@gmail.com |
| 3 | Megane | Sporer | 38 | Stanford.Bednar@yahoo.com |
| 4 | Kaya | Heidenreich | 26 | Justice78@gmail.com |
| 5 | Giles | Stroman | 63 | Corene_Douglas54@yahoo.com |
| 6 | Dustin | Rolfson | 45 | Magdalen5@gmail.com |
| 7 | Earlene | Pacocha | 38 | Madeline_Wiza34@hotmail.com |
| 8 | Jeremiah | Rath | 51 | Walter_Lang86@hotmail.com |
| 9 | Jeannie | Marvin | 28 | Timmy.Raynor57@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 | Clement | Ryan | 58 | Blake.Huel@yahoo.com |
| 1 | Kylie | Emmerich | 42 | Chasity.Smitham@gmail.com |
| 2 | Colleen | Lehner | 32 | Mildred73@gmail.com |
| 3 | Cordia | Dach | 50 | Cicero_Blick@hotmail.com |
| 4 | Hilda | Lubowitz | 40 | Meredith35@hotmail.com |
| 5 | Jaylen | Schmitt | 62 | Darian_OKeefe@yahoo.com |
| 6 | Reva | Pollich | 55 | Melissa.Schamberger@hotmail.com |
| 7 | Graciela | Roob | 23 | Jana_Boyer13@gmail.com |
| 8 | Tate | Kuhic | 20 | Samara_Hoppe@hotmail.com |
| 9 | Andres | Hills | 19 | Hugo74@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 | Myriam | Hane | 44 | Jeffery.Dooley94@hotmail.com |
| 1 | Renee | Heaney | 56 | Catalina_Schiller62@hotmail.com |
| 2 | Destin | Ortiz | 27 | Ines.Sawayn-Dare78@yahoo.com |
| 3 | Peter | Kuhn | 46 | Henri_Cole16@yahoo.com |
| 4 | Faustino | Grimes-Beier | 64 | Walker43@gmail.com |
| 5 | Pauline | Buckridge | 18 | Armand44@yahoo.com |
| 6 | Allan | Hansen | 56 | Herminio_Prosacco10@gmail.com |
| 7 | Oscar | Roberts | 24 | Oscar.Ullrich@gmail.com |
| 8 | Doris | Dibbert | 46 | Dakota_Cronin82@gmail.com |
| 9 | Vivienne | Herman | 62 | Nichole8@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 | Wilma | Schmeler | 23 | Lindsey_Ortiz66@yahoo.com |
| 1 | Raven | Dicki | 30 | Darin.Brakus@yahoo.com |
| 2 | Clyde | Quitzon | 25 | Elisa_Koepp58@hotmail.com |
| 3 | Deshaun | Mraz | 34 | Pierce_Wintheiser@gmail.com |
| 4 | Cole | Predovic | 40 | Wilma47@hotmail.com |
| 5 | Sarah | Olson-Nitzsche | 37 | Selena_VonRueden@gmail.com |
| 6 | Thelma | Schoen | 65 | Orville75@hotmail.com |
| 7 | Ricky | Weimann | 29 | Christian.Spinka72@hotmail.com |
| 8 | Amos | Weber | 47 | Douglas82@gmail.com |
| 9 | Elsie | Jerde | 37 | Verona_Cole@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
initialFocusableCell={{ colIndex: 1, rowIndex: 0 }}
withScrollArea
/>
)
行のクリックイベントをハンドルする
行のクリックイベントをハンドルする場合は、onRowClickを使用します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Toney | Mills | 62 | Ronny_Johnston@hotmail.com |
| 1 | Milton | Jerde | 42 | Rogelio_Nienow71@hotmail.com |
| 2 | Cruz | Abbott | 30 | Sid_Brakus32@gmail.com |
| 3 | Jaleel | Price | 49 | Sherri78@gmail.com |
| 4 | Ernest | Cremin | 59 | Sonya29@yahoo.com |
| 5 | Mario | Parker | 61 | Jane99@hotmail.com |
| 6 | Magdalen | Stroman-Considine | 41 | Ora.Collins47@hotmail.com |
| 7 | Melanie | Bartell | 45 | Roland.Ritchie32@hotmail.com |
| 8 | Corbin | Champlin | 51 | Susie8@yahoo.com |
| 9 | Dianna | Schiller | 44 | Winifred_Pfeffer10@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 | Sheila | Gleichner | 56 | Dixie20@yahoo.com |
| 1 | Madaline | Langworth | 31 | Juana_Koss42@yahoo.com |
| 2 | Titus | Wehner | 21 | Daphne_Trantow@gmail.com |
| 3 | Tevin | Will | 21 | Helena.Zemlak@hotmail.com |
| 4 | Marvin | Schultz | 43 | Mallie.Farrell23@yahoo.com |
| 5 | Nestor | Waters-Walter | 52 | Lindsey_Franey@yahoo.com |
| 6 | Angelina | Corkery | 31 | Dannie67@gmail.com |
| 7 | Mozelle | Wintheiser | 35 | Caesar33@gmail.com |
| 8 | Ruby | Tromp | 54 | Bryce36@gmail.com |
| 9 | Lillie | Gusikowski | 48 | Cierra88@yahoo.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 | |
|---|---|---|---|---|
| 3 | Jeanne | Block | 65 | Celia25@yahoo.com |
| 7 | Billie | Schroeder | 64 | Inez55@yahoo.com |
| 0 | Timothy | Johnson | 62 | Kristie.Streich@hotmail.com |
| 9 | Quentin | O'Conner | 62 | Jaquan25@yahoo.com |
| 8 | Joannie | Stroman | 46 | Gretchen46@gmail.com |
| 4 | Adan | Reynolds | 44 | Preston_Ernser@hotmail.com |
| 5 | Emmie | Erdman | 44 | Lizeth.Stehr33@hotmail.com |
| 2 | Erica | Satterfield | 41 | Opal.Rowe@gmail.com |
| 6 | Gene | Price | 26 | Dayne_Little@gmail.com |
| 1 | Phil | Rolfson | 25 | Lana_Streich88@yahoo.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 | Rosalyn | West | 58 | Valentin.Weimann-Zboncak@gmail.com |
| 1 | Alphonso | Frami | 24 | Sylvia_Turcotte@gmail.com |
| 2 | Luther | Kutch | 38 | Ludwig80@yahoo.com |
| 3 | Carole | Corkery | 25 | Delbert.Sporer@hotmail.com |
| 4 | Ardith | Rempel | 24 | Bertrand54@hotmail.com |
| 5 | Chauncey | Rippin | 29 | Clair15@yahoo.com |
| 6 | Emma | Blanda | 42 | Cassandra81@gmail.com |
| 7 | Douglas | Heidenreich | 60 | Ronald.Kuhn-Marks@hotmail.com |
| 8 | Salvatore | Heathcote | 65 | Morton.Kunze@hotmail.com |
| 9 | Lavina | Wilkinson | 52 | Mark48@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table columns={columns} data={data} enableSorting={false} withScrollArea />
)
複数列のソートを無効にする
複数列のソートを無効にする場合は、enableMultiSortをfalseに設定します。デフォルトは、trueです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Laurie | Stracke | 61 | Andy_Torp71@gmail.com |
| 1 | Connie | Wehner | 47 | Jermaine.Jacobs97@hotmail.com |
| 2 | Bernardo | Walker | 28 | Allan.Hackett@gmail.com |
| 3 | Olive | Wilkinson-Mante | 59 | Ernesto_Veum76@hotmail.com |
| 4 | Rickey | Harris | 41 | Ila.Bailey94@yahoo.com |
| 5 | Karelle | Johnston | 23 | Felton.Lesch@hotmail.com |
| 6 | Carolyn | Murazik | 27 | Dandre.Morissette12@yahoo.com |
| 7 | Margie | Runolfsson | 59 | Nyah25@gmail.com |
| 8 | Sherry | Will | 48 | Emilie80@hotmail.com |
| 9 | Jordi | Von | 22 | Stanley_Hoeger@yahoo.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table columns={columns} data={data} enableMultiSort={false} withScrollArea />
)
最大のソート可能な列数を設定する
最大のソート可能な列数を設定する場合は、maxMultiSortColCountに数値を設定します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Gabriel | O'Keefe | 61 | Edmond76@yahoo.com |
| 1 | Andrea | Cummerata | 58 | Kristen.Graham41@hotmail.com |
| 2 | Kendra | Purdy | 22 | Corene72@hotmail.com |
| 3 | Wendy | Pagac | 41 | Samara_Abshire11@hotmail.com |
| 4 | Alonzo | Windler | 40 | Katheryn.Champlin70@yahoo.com |
| 5 | Jon | Greenholt | 41 | Donna_Wilderman40@hotmail.com |
| 6 | Ewell | Cummerata | 32 | Alexis_Armstrong@yahoo.com |
| 7 | Rolando | Corkery | 62 | Alessia84@hotmail.com |
| 8 | Rebecca | Yundt | 55 | Giovanni72@gmail.com |
| 9 | Maurice | Williamson | 55 | Lindsey30@yahoo.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
maxMultiSortColCount={2}
withScrollArea
/>
)
手動のソートを使う
手動のソートを使う場合は、manualSortingをtrueに設定します。デフォルトは、falseです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Justin | Okuneva | 52 | Blake_Renner52@hotmail.com |
| 1 | Martine | Grady | 42 | Gabriel43@gmail.com |
| 2 | Luz | Becker | 22 | Lamar_Altenwerth@gmail.com |
| 3 | Enoch | Nikolaus | 39 | Kelsi94@gmail.com |
| 4 | Glenn | Schulist | 43 | Ramona_Spinka58@hotmail.com |
| 5 | Mona | Hansen | 19 | Mozelle.Watsica@hotmail.com |
| 6 | Marilyn | Rau | 62 | Antonia_Blanda25@gmail.com |
| 7 | Kaley | Graham | 20 | Ryan.Dickens94@hotmail.com |
| 8 | Randy | Prosacco | 50 | Curtis5@hotmail.com |
| 9 | Norris | Corkery | 48 | Eloise_Gottlieb@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 | Janet | Toy | 57 | Chris_Blanda@yahoo.com |
| 1 | Barbara | Lindgren | 59 | Jarvis.Bruen34@hotmail.com |
| 2 | Seth | Buckridge | 25 | Greg_Franey@yahoo.com |
| 3 | Marta | Gleichner | 36 | Einar94@hotmail.com |
| 4 | Kelli | Doyle | 44 | Luther.Treutel5@yahoo.com |
| 5 | Linda | McCullough | 41 | Kianna_Mosciski73@gmail.com |
| 6 | Armando | Luettgen | 36 | Alexa_Langworth@hotmail.com |
| 7 | Maureen | Fahey | 54 | Philip.Bernhard@yahoo.com |
| 8 | Melissa | Erdman | 59 | Irene.Kertzmann@hotmail.com |
| 9 | Berniece | Pagac | 37 | Danyka.Mueller78@yahoo.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} sortDescFirst withScrollArea />
ソートを制御する
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Blaze | Rogahn | 60 | Friedrich.Klein@gmail.com |
| 1 | Carl | Bashirian | 53 | Edmund.Gibson-Hayes@hotmail.com |
| 2 | Barney | Quitzon | 21 | Aidan4@gmail.com |
| 3 | Carlton | Bartell | 30 | Eddie.Williamson-Hessel84@gmail.com |
| 4 | Carrie | Swaniawski | 61 | Jasper47@gmail.com |
| 5 | Telly | Bailey | 27 | Eileen.Hickle@gmail.com |
| 6 | Henderson | Sporer | 51 | Iris80@gmail.com |
| 7 | Wendy | Mraz | 44 | Wilburn6@yahoo.com |
| 8 | Maureen | Hand | 38 | Alex60@gmail.com |
| 9 | Orval | Emard | 44 | Fredrick57@hotmail.com |
const [sorting, setSorting] = useState<SortingState<TableData>>([
{ id: "age", desc: true },
])
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} withScrollArea />
"use client"をファイルの上部に追加する必要があります。ページネーションを有効にする
ページネーションを有効にする場合は、enablePaginationをtrueに設定し、ページネーションをコントロールするコンポーネントをheaderまたはfooterに設定します。デフォルトは、falseです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Tabitha | Moore | 48 | Randall.Weber@hotmail.com |
| 1 | Aryanna | Jast | 57 | Vincent.Walker17@yahoo.com |
| 2 | Don | Hettinger | 46 | Agnes35@gmail.com |
| 3 | Maddison | Hackett | 42 | Brittany1@gmail.com |
| 4 | Rey | Zieme | 31 | Nadine_Stoltenberg86@gmail.com |
| 5 | Ben | Sporer | 29 | Candice.Johns@gmail.com |
| 6 | Virgie | Carroll | 22 | Johnpaul_Little@yahoo.com |
| 7 | Tia | Luettgen | 60 | Lenny_Weber77@hotmail.com |
| 8 | Deborah | Parisian | 56 | Randall92@gmail.com |
| 9 | Kari | Romaguera | 44 | Eugene7@gmail.com |
| 10 | Roosevelt | Considine | 39 | Dolores84@gmail.com |
| 11 | Chester | Reynolds | 55 | Selmer72@yahoo.com |
| 12 | Edwin | Roob | 25 | Vida.Bayer@yahoo.com |
| 13 | Ona | Lind | 50 | Candido.Stokes14@gmail.com |
| 14 | Luther | Wilkinson | 37 | Erica.Stracke@gmail.com |
| 15 | Kiara | Schroeder | 22 | Doreen.Little@gmail.com |
| 16 | Jimmy | Cole | 28 | Bernice62@yahoo.com |
| 17 | Glenn | Labadie | 29 | Molly_Bradtke13@hotmail.com |
| 18 | Henrietta | Hirthe | 61 | Jody_Yundt84@hotmail.com |
| 19 | Jocelyn | Schumm | 26 | Ronald_Kassulke@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 | Domenick | Balistreri | 37 | Francisco.Huel@gmail.com |
| 11 | Jettie | Jast | 47 | Roderick3@yahoo.com |
| 12 | Van | Turner | 28 | Kyra2@yahoo.com |
| 13 | Adelia | VonRueden | 28 | Willis11@yahoo.com |
| 14 | Esther | Walker | 25 | Salvador8@gmail.com |
| 15 | Emmalee | Doyle | 22 | Justina.Huel@hotmail.com |
| 16 | Maude | Gibson | 49 | Jerrod.Pfannerstill@yahoo.com |
| 17 | Dixie | Cormier | 52 | Nicholaus.Olson32@yahoo.com |
| 18 | Eleanore | Shields | 32 | Tammy63@yahoo.com |
| 19 | Danny | Rowe | 29 | Summer_Bradtke97@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 | Caterina | Rath | 65 | Bryant.Glover12@yahoo.com |
| 1 | Johann | Wyman | 19 | Rahul_Greenholt-Jacobi83@yahoo.com |
| 2 | Isaias | Kautzer | 46 | Marilyn_Kessler@hotmail.com |
| 3 | Kari | Cronin | 25 | Tracy.VonRueden96@gmail.com |
| 4 | Rodolfo | Herman | 28 | Lucy.Zemlak@hotmail.com |
| 5 | Danial | Trantow | 34 | Willis_Lang@hotmail.com |
| 6 | Marcus | Zemlak | 58 | Whitney82@hotmail.com |
| 7 | Julia | Reilly | 54 | Fritz_Bins7@gmail.com |
| 8 | Raquel | Weber | 36 | Kenneth.Graham60@yahoo.com |
| 9 | Stacey | Keeling | 55 | Austin.Stroman@gmail.com |
| 10 | Forrest | Bartoletti | 22 | Eva33@hotmail.com |
| 11 | Timmy | Borer | 42 | Meredith_Bauch0@yahoo.com |
| 12 | Elaine | Jacobs | 50 | Johnpaul.Wintheiser@yahoo.com |
| 13 | Eulah | Balistreri | 39 | Justine97@gmail.com |
| 14 | Leonard | Waters | 35 | Coralie_Daugherty95@yahoo.com |
| 15 | Elmer | Von | 37 | Ismael.Kling0@yahoo.com |
| 16 | Cathrine | O'Conner | 23 | Mac.Barrows@hotmail.com |
| 17 | Rolando | Greenholt | 27 | Angie.Legros@yahoo.com |
| 18 | Tommie | Langworth | 27 | Meggie_Osinski6@hotmail.com |
| 19 | Jannie | Abernathy | 60 | Gilberto.Homenick@yahoo.com |
const { t } = useI18n("table")
const [pagination, setPagination] = useState<PaginationState>({
pageIndex: 0,
pageSize: 20,
})
const rowCount = 40
const defaultData = useMemo<TableData[]>(() => createTableData(rowCount), [])
const data = useMemo<TableData[]>(
() =>
defaultData.slice(
pagination.pageIndex * pagination.pageSize,
(pagination.pageIndex + 1) * pagination.pageSize,
),
[defaultData, pagination],
)
return (
<VStack>
<Table
columns={columns}
data={data}
enablePagination
manualPagination
pagination={pagination}
rowCount={rowCount}
onPaginationChange={setPagination}
footer={(table) => {
const page = table.getState().pagination.pageIndex + 1
const pageSize = table.getState().pagination.pageSize
const total = table.getPageCount()
return (
<Grid templateColumns="1fr 1fr 1fr" w="full">
<Pagination.Root
size={{ base: "sm", sm: "xs" }}
gridColumn="2 / 3"
page={page}
total={total}
onChange={(page) => table.setPageIndex(page - 1)}
/>
<Select.Root
size={{ base: "sm", sm: "xs" }}
aria-label={t("Page size")}
items={[
{ label: "10", value: "10" },
{ label: "20", value: "20" },
{ label: "30", value: "30" },
{ label: "40", value: "40" },
{ label: "50", value: "50" },
]}
value={pageSize.toString()}
rootProps={{ justifySelf: "end", w: "5xs" }}
onChange={(value) => table.setPageSize(Number(value))}
/>
</Grid>
)
}}
withScrollArea
/>
</VStack>
)
"use client"をファイルの上部に追加する必要があります。ページネーションを制御する
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Yvette | Kirlin | 56 | Dan.Crist@gmail.com |
| 1 | Madeline | Fritsch | 43 | Gonzalo_Goyette57@hotmail.com |
| 2 | Tim | Kuhlman | 47 | Henry.Frami30@yahoo.com |
| 3 | Sheri | Flatley | 40 | Angie14@hotmail.com |
| 4 | Keely | Kunze | 60 | Andres_Gerhold@hotmail.com |
| 5 | Melisa | Fahey | 26 | Raymond_Dickinson@yahoo.com |
| 6 | Mustafa | Thiel | 31 | Clayton22@yahoo.com |
| 7 | Allison | Emard | 20 | Madeline_Balistreri@hotmail.com |
| 8 | Sherri | Haley | 46 | Napoleon_Bogan@hotmail.com |
| 9 | Deangelo | Torp | 44 | Maximillian_Kihn@gmail.com |
| 10 | Laverna | Swaniawski | 61 | Javier.Little@hotmail.com |
| 11 | Wanda | Beier | 32 | Macy_Cremin16@hotmail.com |
| 12 | Dewey | Swift | 26 | Victor58@hotmail.com |
| 13 | Bethany | Kutch | 23 | Jerald34@hotmail.com |
| 14 | Rogelio | Heaney | 55 | Morgan.Bernier@hotmail.com |
| 15 | Tracey | Huels | 29 | Axel.Kassulke71@hotmail.com |
| 16 | Becky | Tremblay | 19 | Jannie57@hotmail.com |
| 17 | Jake | Bahringer | 55 | Miranda_Swaniawski@hotmail.com |
| 18 | Holly | Jaskolski | 30 | Dewayne98@hotmail.com |
| 19 | Earline | Emard | 43 | Casimir2@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 | Ivy | Wisoky | 30 | Carolyn.Upton18@hotmail.com | |
| 1 | Karen | Kihn | 60 | Oda73@yahoo.com | |
| 2 | Elbert | Block | 23 | Randal.Ullrich@hotmail.com | |
| 3 | Daisy | Moen | 57 | Clayton11@yahoo.com | |
| 4 | Broderick | O'Keefe | 30 | Wendell.Roberts@gmail.com | |
| 5 | Louis | Rosenbaum | 30 | Ozella_Mann95@hotmail.com | |
| 6 | Ira | Bernier | 63 | Theresa.Carroll82@gmail.com | |
| 7 | Delmer | Wyman | 65 | Stephany.Koelpin69@yahoo.com | |
| 8 | Suzanne | Collins | 65 | Cassidy_Predovic70@yahoo.com | |
| 9 | Ramiro | Kilback | 30 | Megan.Witting8@yahoo.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} enableRowSelection withScrollArea />
デフォルトの選択された行を設定する
デフォルトの選択された行を設定する場合は、defaultRowSelectionにdataのインデックスをキーとしたオブジェクトを設定します。
| id | firstName | lastName | age | ||
|---|---|---|---|---|---|
| 0 | Delia | Bauch | 18 | Andres.Rath88@hotmail.com | |
| 1 | Hugo | Murazik | 40 | Melvina.Kuhn60@gmail.com | |
| 2 | Christie | Greenfelder | 55 | Allen56@hotmail.com | |
| 3 | Darren | Medhurst | 29 | Janis_Ortiz@gmail.com | |
| 4 | Dallas | Hoeger | 46 | Asha_Gutmann97@hotmail.com | |
| 5 | Phyllis | Hermann | 54 | Eloise.DAmore@gmail.com | |
| 6 | Gerard | Schowalter | 47 | Toni49@hotmail.com | |
| 7 | Tomas | Wolf | 60 | Herbert.Kulas48@yahoo.com | |
| 8 | Silvia | Murphy | 35 | Gwendolyn_Lakin@hotmail.com | |
| 9 | Amely | Willms | 34 | Clinton_Johnston@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 | Terri | Kirlin | 56 | Roberta47@gmail.com | |
| 1 | Gabriel | Denesik | 39 | Sam84@hotmail.com | |
| 2 | Shaun | Beier | 22 | Octavia_Hartmann@hotmail.com | |
| 3 | Carol | Volkman | 59 | Stephany.Will@gmail.com | |
| 4 | Alvina | Douglas | 37 | Lucas62@hotmail.com | |
| 5 | Nella | Stoltenberg | 51 | Kimberly_Morissette58@yahoo.com | |
| 6 | Iris | Wilkinson | 21 | Darryl.Boyer@yahoo.com | |
| 7 | Rita | Herzog | 33 | Vallie_Predovic@hotmail.com | |
| 8 | Cheyenne | Schroeder | 41 | Ernestina.Lueilwitz-Runolfsdottir@yahoo.com | |
| 9 | Tommie | Nitzsche | 35 | Lavada_Cormier@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableRowSelection
selectOnClickRow
withScrollArea
/>
)
チェックボックスを非表示にする
チェックボックスを非表示にする場合は、withCheckboxをfalseに設定します。デフォルトは、trueです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Felix | Rath | 53 | Ed7@hotmail.com |
| 1 | Karlee | Dicki | 50 | Clara_Bernhard79@yahoo.com |
| 2 | Eddie | Klocko | 65 | Nina.Will90@yahoo.com |
| 3 | Nicholas | Fisher | 52 | Patty77@gmail.com |
| 4 | Billy | Kihn | 32 | Vito5@gmail.com |
| 5 | Marshall | Schowalter | 38 | Tristian_Feest@yahoo.com |
| 6 | Tobin | Cronin-Davis | 31 | Juvenal.Considine@yahoo.com |
| 7 | Teresa | Hegmann | 44 | Mildred.Haag@yahoo.com |
| 8 | Cathy | Schneider | 39 | Cora32@hotmail.com |
| 9 | Gary | Rohan | 18 | Chelsey_Kilback@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableRowSelection
selectOnClickRow
withCheckbox={false}
withScrollArea
/>
)
行を無効にする
行を無効にする場合は、enableRowSelectionに条件の関数を設定します。
| id | firstName | lastName | age | ||
|---|---|---|---|---|---|
| 0 | Merle | Mante | 64 | Marshall_Strosin@hotmail.com | |
| 1 | Makenzie | Frami | 43 | Eunice.Ankunding@hotmail.com | |
| 2 | Lois | Von-Lindgren | 18 | Linnie_Treutel@gmail.com | |
| 3 | Princess | Zboncak | 56 | Darnell_Quigley@gmail.com | |
| 4 | Daisy | Krajcik | 35 | Ottilie_DAmore@gmail.com | |
| 5 | Danika | Kuhn | 62 | Wallace.Bogisich@yahoo.com | |
| 6 | Maximus | Sawayn | 29 | Wendy_Terry69@yahoo.com | |
| 7 | Paul | Mann | 26 | Ruben_Jacobson65@hotmail.com | |
| 8 | Jaden | Grimes | 28 | Flossie.Brown@hotmail.com | |
| 9 | Rhea | Schultz | 58 | Clint38@gmail.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 | Clinton | Conn | 33 | Gilbert76@gmail.com | |
| 1 | Maggie | Hirthe | 25 | Raven_Kunze94@hotmail.com | |
| 2 | Tara | Gottlieb | 41 | Amos.Morissette46@yahoo.com | |
| 3 | Blair | Mohr | 40 | Jesus17@yahoo.com | |
| 4 | Jermain | Johns | 37 | Aubrey_Roob83@gmail.com | |
| 5 | Geraldine | Kovacek | 56 | Doug.Stanton@hotmail.com | |
| 6 | Alonzo | Fahey | 41 | Lambert_Schamberger@yahoo.com | |
| 7 | Donnie | Schmeler | 34 | Aric.Spinka67@yahoo.com | |
| 8 | Demetris | Muller | 63 | Annette79@gmail.com | |
| 9 | Elise | Weimann | 41 | Jarret.Simonis@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 | Mya | Cronin | 20 | Darla75@yahoo.com |
| 1 | Gail | Bosco | 20 | Bertrand_Jones-Schmidt92@hotmail.com |
| 2 | Cheyenne | Cormier | 36 | Alicia.Bahringer@gmail.com |
| 3 | Else | Runte | 33 | Samuel_Cummerata84@hotmail.com |
| 4 | Sherwood | Collier | 58 | Meta_Lynch11@yahoo.com |
| 5 | Darren | Swift | 60 | Berta13@gmail.com |
| 6 | Luke | Hintz | 65 | Rae36@gmail.com |
| 7 | Alek | Runolfsdottir | 37 | Ansley1@yahoo.com |
| 8 | Rebecca | Auer | 44 | Lyle.OHara@hotmail.com |
| 9 | Clark | Wyman | 25 | Maddison69@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 | |
|---|---|---|---|---|
| 2 | Reina | Hilll-Koepp | 22 | Cecelia47@gmail.com |
| 4 | Amanda | Cassin | 43 | Matilda.Gerhold@gmail.com |
| 8 | Leroy | Oberbrunner | 52 | Gilda_Hettinger50@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 | Edmond | Harvey | 41 | Lavinia52@hotmail.com |
| 1 | Matt | Wolf | 56 | Diana_Tremblay@hotmail.com |
| 2 | Pearl | Brakus | 45 | Mamie_Orn40@gmail.com |
| 3 | Carson | Gleason | 45 | Manley49@hotmail.com |
| 4 | Mattie | Renner-Hodkiewicz | 47 | Gustavo20@yahoo.com |
| 5 | Rocio | Gerlach | 61 | Emanuel79@hotmail.com |
| 6 | Jacob | Krajcik | 53 | Flora_OConner91@yahoo.com |
| 7 | Toni | Parker | 19 | Patrick.Crooks5@hotmail.com |
| 8 | Dustin | McGlynn | 39 | Lavinia.Rodriguez30@hotmail.com |
| 9 | Schuyler | Koelpin | 19 | Gerda_Veum16@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 | Bob | Frami | 57 | Jennie_Heidenreich@gmail.com |
| 1 | Gracie | Lehner | 19 | Jennifer.Rosenbaum16@hotmail.com |
| 2 | Rebecca | Medhurst | 36 | Conrad0@gmail.com |
| 3 | Frida | Windler | 52 | Chauncey80@hotmail.com |
| 4 | Anibal | Mertz | 29 | Toby.Skiles12@hotmail.com |
| 5 | Maverick | Cartwright | 43 | Maeve.Marquardt@yahoo.com |
| 6 | June | Volkman | 30 | Ross_Nienow59@gmail.com |
| 7 | Patience | Okuneva | 40 | Teresa.Larkin12@gmail.com |
| 8 | Emanuel | Greenholt | 30 | Roy_Swaniawski9@gmail.com |
| 9 | Gillian | Leuschke | 23 | Jonathan99@yahoo.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableColumnResizing
withBorder
withColumnBorders
/>
)
列のサイズ変更の方法を変更する
デフォルトでは、列のサイズ変更のタイミングは、ドラッグしている間に変更されます。ドラッグが終わったときに変更する場合は、columnResizeModeに"onEnd"を設定します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Sammie | Nicolas | 58 | Brandi.Bernhard@gmail.com |
| 1 | Annette | Collier | 59 | Micheal.Dietrich@yahoo.com |
| 2 | Amos | Vandervort | 43 | Halle_DuBuque86@yahoo.com |
| 3 | Myron | Effertz | 39 | Ines44@gmail.com |
| 4 | Armand | Shields | 63 | Myra_Haley@gmail.com |
| 5 | Jose | Beatty | 55 | Alma_Bartoletti@hotmail.com |
| 6 | Charlotte | Smitham | 51 | Leonie.Collins@gmail.com |
| 7 | Ella | Murazik | 28 | Ramona_Jacobs86@gmail.com |
| 8 | Roberta | Cruickshank | 22 | Orrin30@gmail.com |
| 9 | Amos | Becker | 59 | Newell_Hettinger75@yahoo.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ロールと属性
| コンポーネント | ロールと属性 | 使い方 |
|---|---|---|
NativeTable.Root | role="grid" | グリッドであることを示します。 |
aria-rowcount | テーブルの行数を示します。 | |
aria-colcount | テーブルの列数を示します。 | |
aria-multiselectable | enableRowSelectionが設定されている場合は"true"を設定します。 | |
NativeTable.Thead | role="rowgroup" | 行グループであることを示します。 |
NativeTable.Tr | role="row" | 行であることを示します。 |
aria-rowindex | 行がテーブルの何行目であるかを示します。 | |
aria-disabled | enableRowSelectionを関数で設定し、falseの行には"true"を設定します。 | |
aria-selected | 行が選択されている場合は"true"を設定し、未選択の場合は"false"を設定します。 | |
NativeTable.Th | role="columnheader" | カラムヘッダーであることを示します。 |
aria-rowindex | 行がテーブルの何行目であるかを示します。 | |
aria-colindex | 列がテーブルの何列目であるかを示します。 | |
aria-sort | 列が昇順の場合は"ascending"を設定し、降順の場合は"descending"を設定、指定がない場合は"none"を設定します。 | |
NativeTable.Tbody | role="rowgroup" | 行グループであることを示します。 |
NativeTable.Td | role="gridcell" | グリッドセルであることを示します。 |
aria-colindex | 列がテーブルの何列目であるかを示します。 | |
aria-rowindex | 行がテーブルの何行目であるかを示します。 | |
NativeTable.Tfoot | role="rowgroup" | 行グループであることを示します。 |
Checkbox | aria-label | ヘッダーの場合は"すべての行を選択する"、それ以外の行の場合は"行を選択する"を設定します。 |
SortingIcon | aria-label | 列が昇順の場合は"昇順でソートする"を設定し、降順の場合は"降順でソートする"を設定、指定がない場合は"ソートを解除する"を設定します。 |
類似のコンポーネント
NativeTable
NativeTableは、データを効率的に整理して表示するコンポーネントです。
Stat
Statは、数値やデータをボックス内に表示するために使用されます。
AreaChart
AreaChartは、複数のデータを比較するためのエリアチャートを描画するコンポーネントです。
Badge
Badgeは、アイテムのステータスを強調表示して、すぐに認識できるようにするコンポーネントです。
BarChart
BarChartは、複数のデータを比較するための棒グラフを描画するコンポーネントです。
Card
Cardは、関連する情報をグループ化して表示するコンポーネントです。デフォルトでは、article要素をレンダリングします。
ComposedChart
ComposedChartは、複数のデータを比較するための複合チャートを描画するコンポーネントです。
DataList
DataListは、データ項目のリストを表示するために使用されます。