Table
Tableは、列のソートや行の選択やクリックイベント機能を備えたテーブルのコンポーネントです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Oliver | Kub | 39 | Kraig.McCullough@gmail.com |
| 1 | Rickie | Towne | 55 | Oran.Koepp84@hotmail.com |
| 2 | Scotty | Yost | 36 | Jaydon83@gmail.com |
| 3 | Mandy | O'Conner | 35 | Monique89@gmail.com |
| 4 | Edd | Kirlin | 44 | Mitchel_Abernathy@yahoo.com |
| 5 | Ruben | Franecki | 25 | Freddy_Champlin6@hotmail.com |
| 6 | Kacey | Halvorson | 33 | Alexandra7@yahoo.com |
| 7 | Justin | Ritchie | 40 | Justine_Kassulke7@gmail.com |
| 8 | Courtney | Hermiston | 31 | Hugh.Hagenes@hotmail.com |
| 9 | Morris | Johnson | 61 | Piper_Gorczany@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 | Molly | Casper | 27 | Serenity35@yahoo.com |
| 1 | Dolly | Okuneva | 34 | Abby23@yahoo.com |
| 2 | Laurence | Yundt | 53 | Tito_Spencer@gmail.com |
| 3 | Delfina | Runolfsson | 54 | Pablo.Konopelski@yahoo.com |
| 4 | Ali | Larkin | 35 | Elliot44@gmail.com |
| 5 | Flavio | Tromp | 57 | Amari.Jaskolski@hotmail.com |
| 6 | Loma | Roberts | 30 | Modesto81@gmail.com |
| 7 | Ibrahim | Metz | 49 | Abigale43@yahoo.com |
| 8 | Wiley | Wuckert | 24 | Tristin76@gmail.com |
| 9 | Malinda | Corkery | 33 | Elroy.VonRueden54@yahoo.com |
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Molly | Casper | 27 | Serenity35@yahoo.com |
| 1 | Dolly | Okuneva | 34 | Abby23@yahoo.com |
| 2 | Laurence | Yundt | 53 | Tito_Spencer@gmail.com |
| 3 | Delfina | Runolfsson | 54 | Pablo.Konopelski@yahoo.com |
| 4 | Ali | Larkin | 35 | Elliot44@gmail.com |
| 5 | Flavio | Tromp | 57 | Amari.Jaskolski@hotmail.com |
| 6 | Loma | Roberts | 30 | Modesto81@gmail.com |
| 7 | Ibrahim | Metz | 49 | Abigale43@yahoo.com |
| 8 | Wiley | Wuckert | 24 | Tristin76@gmail.com |
| 9 | Malinda | Corkery | 33 | Elroy.VonRueden54@yahoo.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 | Kristie | Stracke | 62 | Pinkie_Schmeler@yahoo.com |
| 1 | Gladyce | Sanford | 41 | Lukas.Jakubowski@gmail.com |
| 2 | Velda | Moen | 27 | Daryl.Lakin37@yahoo.com |
| 3 | Arjun | Konopelski | 44 | Robbie.Harber@yahoo.com |
| 4 | Ayla | Franey | 55 | Brady_Rippin88@hotmail.com |
| 5 | Reyes | Nienow | 55 | Sean18@yahoo.com |
| 6 | Rod | Ortiz | 32 | Philip.Jakubowski@gmail.com |
| 7 | Sylvester | White | 48 | Caleb76@gmail.com |
| 8 | Alexanne | Lind-Smitham | 24 | Macy_Walker@gmail.com |
| 9 | Brionna | Wiegand | 62 | Aniyah_Braun12@yahoo.com |
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Kristie | Stracke | 62 | Pinkie_Schmeler@yahoo.com |
| 1 | Gladyce | Sanford | 41 | Lukas.Jakubowski@gmail.com |
| 2 | Velda | Moen | 27 | Daryl.Lakin37@yahoo.com |
| 3 | Arjun | Konopelski | 44 | Robbie.Harber@yahoo.com |
| 4 | Ayla | Franey | 55 | Brady_Rippin88@hotmail.com |
| 5 | Reyes | Nienow | 55 | Sean18@yahoo.com |
| 6 | Rod | Ortiz | 32 | Philip.Jakubowski@gmail.com |
| 7 | Sylvester | White | 48 | Caleb76@gmail.com |
| 8 | Alexanne | Lind-Smitham | 24 | Macy_Walker@gmail.com |
| 9 | Brionna | Wiegand | 62 | Aniyah_Braun12@yahoo.com |
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Kristie | Stracke | 62 | Pinkie_Schmeler@yahoo.com |
| 1 | Gladyce | Sanford | 41 | Lukas.Jakubowski@gmail.com |
| 2 | Velda | Moen | 27 | Daryl.Lakin37@yahoo.com |
| 3 | Arjun | Konopelski | 44 | Robbie.Harber@yahoo.com |
| 4 | Ayla | Franey | 55 | Brady_Rippin88@hotmail.com |
| 5 | Reyes | Nienow | 55 | Sean18@yahoo.com |
| 6 | Rod | Ortiz | 32 | Philip.Jakubowski@gmail.com |
| 7 | Sylvester | White | 48 | Caleb76@gmail.com |
| 8 | Alexanne | Lind-Smitham | 24 | Macy_Walker@gmail.com |
| 9 | Brionna | Wiegand | 62 | Aniyah_Braun12@yahoo.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<VStack>
<For each={["sm", "md", "lg"]}>
{(size, index) => (
<Table
key={index}
size={size}
columns={columns}
data={data}
withScrollArea
/>
)}
</For>
</VStack>
)
カラースキームを変更する
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Alexys | Hermiston | 58 | Ally_Bogan@yahoo.com |
| 1 | Vivianne | Balistreri | 37 | Herbert43@hotmail.com |
| 2 | Ora | Gusikowski | 27 | Carrie.Beatty37@yahoo.com |
| 3 | Humberto | Gibson | 29 | Simone.Beatty@hotmail.com |
| 4 | Alec | Terry | 33 | Kevin.Dickinson82@gmail.com |
| 5 | Dora | Torphy | 44 | Urban77@yahoo.com |
| 6 | Bertrand | Swaniawski | 59 | Orlo91@hotmail.com |
| 7 | America | Ortiz | 63 | Maggie49@yahoo.com |
| 8 | Hassie | Bailey | 63 | Elliot28@yahoo.com |
| 9 | Roland | Langosh | 48 | Katlynn62@gmail.com |
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Alexys | Hermiston | 58 | Ally_Bogan@yahoo.com |
| 1 | Vivianne | Balistreri | 37 | Herbert43@hotmail.com |
| 2 | Ora | Gusikowski | 27 | Carrie.Beatty37@yahoo.com |
| 3 | Humberto | Gibson | 29 | Simone.Beatty@hotmail.com |
| 4 | Alec | Terry | 33 | Kevin.Dickinson82@gmail.com |
| 5 | Dora | Torphy | 44 | Urban77@yahoo.com |
| 6 | Bertrand | Swaniawski | 59 | Orlo91@hotmail.com |
| 7 | America | Ortiz | 63 | Maggie49@yahoo.com |
| 8 | Hassie | Bailey | 63 | Elliot28@yahoo.com |
| 9 | Roland | Langosh | 48 | Katlynn62@gmail.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 | Noemy | Langosh | 32 | Tess65@hotmail.com |
| 1 | Royal | Stroman | 53 | Marley_Nader@hotmail.com |
| 2 | Cruz | Moore | 46 | Tad14@hotmail.com |
| 3 | Humberto | Nicolas | 26 | Avery12@gmail.com |
| 4 | Ubaldo | Kuphal | 53 | Izabella91@yahoo.com |
| 5 | Susan | Boyer | 21 | Liam_Davis85@hotmail.com |
| 6 | Allison | Lockman | 35 | Frederick.Medhurst@yahoo.com |
| 7 | Simon | Hagenes | 37 | Earnestine_Legros85@gmail.com |
| 8 | Lisandro | Labadie | 18 | Jaycee.Mosciski@hotmail.com |
| 9 | Frederick | Grimes | 47 | Shaniya.Hegmann11@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} withBorder withScrollArea />
列の区切り線を追加する
列の区切り線を追加する場合は、withColumnBordersをtrueにします。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Mae | Boyle | 25 | Carrie.Bartoletti34@gmail.com |
| 1 | Ibrahim | Runolfsson | 51 | Aron76@yahoo.com |
| 2 | Izaiah | McGlynn | 22 | Eulalia.Wolff@gmail.com |
| 3 | Jasmin | Prohaska | 57 | Chase.Wolff@hotmail.com |
| 4 | Elbert | Stracke | 53 | Zane.Spencer@gmail.com |
| 5 | Waldo | Lynch | 44 | Darnell.Treutel@gmail.com |
| 6 | Lincoln | Krajcik | 43 | Nayeli2@gmail.com |
| 7 | Myrtle | Wiza | 40 | Herta_Kris99@yahoo.com |
| 8 | Dolores | Pacocha | 27 | Mackenzie63@hotmail.com |
| 9 | Tyra | Kuhic | 36 | Veda_Bartoletti@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} withColumnBorders withScrollArea />
行がホバーされたときにハイライトする
行がホバーされたときにハイライトする場合は、highlightOnHoverをtrueにします。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Danielle | MacGyver | 61 | Clinton_Hahn6@hotmail.com |
| 1 | Buford | Mann | 47 | Francesca_Macejkovic@hotmail.com |
| 2 | Evangeline | Mueller | 30 | Otilia78@yahoo.com |
| 3 | Louisa | Mraz-West | 37 | Nova_Franey@hotmail.com |
| 4 | Maggie | Baumbach | 52 | Agnes57@yahoo.com |
| 5 | Thelma | Lubowitz | 35 | Miles.Becker@gmail.com |
| 6 | Viola | McDermott | 47 | Frederique.Mraz56@gmail.com |
| 7 | Alexys | Keeling | 37 | Krystina40@yahoo.com |
| 8 | Nya | Hudson | 40 | Tyler64@yahoo.com |
| 9 | Ona | Kris | 32 | Vernice30@yahoo.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} highlightOnHover withScrollArea />
ストライプを使う
ストライプを使う場合は、stripedをtrueにします。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Rufus | Rutherford | 25 | Cedrick.Mertz-McDermott@hotmail.com |
| 1 | Delphia | Schowalter | 21 | Izabella.Abshire76@hotmail.com |
| 2 | Susan | Wilkinson | 21 | Warren81@gmail.com |
| 3 | Hillard | Murazik | 25 | Marquis.Hoeger-Ratke77@hotmail.com |
| 4 | Kallie | Rosenbaum | 42 | Howard51@yahoo.com |
| 5 | Aylin | Yost | 27 | Kristopher.Pollich@hotmail.com |
| 6 | Adelbert | Bashirian | 36 | Maurice.Boyer@hotmail.com |
| 7 | Demarco | King | 27 | Kevon76@gmail.com |
| 8 | Sydney | Roob | 45 | Kane.Reichel@gmail.com |
| 9 | Burdette | O'Keefe | 46 | Darby70@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 | Shanon | Ullrich | 27 | Queen_McLaughlin-Bailey@gmail.com | 1-928-667-5037 x939 | admin | inactive | 11/22/2025 | 8/2/2026 |
| 1 | Ari | Langosh | 42 | Noe_Kutch@gmail.com | 815.303.2479 | admin | inactive | 9/10/2026 | 5/7/2026 |
| 2 | Carroll | Beer | 20 | Alberto31@hotmail.com | 1-558-376-4923 | user | inactive | 1/2/2026 | 10/9/2026 |
| 3 | Kaylee | Frami | 24 | Ava.Kautzer63@hotmail.com | 734-886-5957 | admin | active | 12/17/2025 | 8/7/2026 |
| 4 | Mekhi | Fisher | 40 | Jamar88@yahoo.com | 996-610-6666 x924 | admin | active | 2/19/2026 | 9/29/2026 |
| 5 | Golda | Fadel | 61 | Destini75@hotmail.com | 434-308-8654 x879 | user | inactive | 5/29/2026 | 10/30/2025 |
| 6 | Rossie | Emmerich | 65 | Elinore.Ernser@hotmail.com | 949.400.6043 | admin | active | 7/3/2026 | 12/28/2025 |
| 7 | Dustin | Batz | 35 | Jaycee.Durgan@yahoo.com | 1-985-295-5376 x6851 | user | inactive | 4/5/2026 | 12/10/2025 |
| 8 | Beryl | Prohaska | 47 | Angelo79@yahoo.com | 679.325.7996 x16785 | user | active | 11/26/2025 | 3/1/2026 |
| 9 | Steve | Cummerata | 44 | Nathan62@hotmail.com | (593) 648-8392 x87064 | admin | inactive | 10/29/2025 | 11/23/2025 |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columnsFull} data={data} withScrollArea />
ヘッダーグループ
| id | user | |||
|---|---|---|---|---|
| name | age | |||
| firstName | lastName | |||
| 0 | Gerry | Klocko | 38 | Reva17@hotmail.com |
| 1 | Trever | Goodwin | 44 | Garrick_Schmidt19@gmail.com |
| 2 | Dawn | Prohaska | 42 | Eloise.Gerhold@hotmail.com |
| 3 | Marjorie | D'Amore | 43 | Zane_Blanda90@gmail.com |
| 4 | Joe | Jacobi | 59 | Kaelyn6@yahoo.com |
| 5 | Afton | Mills | 59 | Alycia70@gmail.com |
| 6 | Dameon | Beahan | 24 | Michele66@hotmail.com |
| 7 | Delia | Kassulke | 57 | Rod67@gmail.com |
| 8 | Luella | Mante | 42 | Shaun_Kreiger18@gmail.com |
| 9 | Garth | Strosin | 19 | Christop53@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 | Guido | Hoppe | 51 | Summer_Dooley@yahoo.com |
| 1 | Hoyt | Ondricka | 55 | Andrew.Keebler86@gmail.com |
| 2 | Julie | Ryan | 19 | Gerhard6@hotmail.com |
| 3 | Gisselle | Corkery | 56 | Cassie.Pagac30@hotmail.com |
| 4 | Amie | O'Conner | 25 | Keshawn85@hotmail.com |
| 5 | Colton | Ebert | 30 | Pearl16@hotmail.com |
| 6 | Kelli | Macejkovic | 32 | Dylan.Kautzer53@gmail.com |
| 7 | Monique | McGlynn | 20 | Paris.Hamill70@gmail.com |
| 8 | Lilyan | Casper | 57 | Aiden86@gmail.com |
| 9 | Christina | Sanford | 61 | Alivia51@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 | Athena | Rowe | 42 | Nicklaus.Wolf@hotmail.com |
| 1 | Deontae | Kassulke | 55 | Agustina93@yahoo.com |
| 2 | Carol | Vandervort | 44 | Frankie51@gmail.com |
| 3 | Murl | Corkery | 63 | Ignacio_Gutkowski-Oberbrunner25@hotmail.com |
| 4 | Shanna | Mosciski | 29 | Maxime_Lockman-Hoppe@gmail.com |
| 5 | Jett | Kirlin-Blick | 34 | Danial.Wuckert@yahoo.com |
| 6 | Marilie | Hudson | 29 | Roscoe.Feil@hotmail.com |
| 7 | Reagan | Boehm | 21 | Theron.Stamm73@hotmail.com |
| 8 | Leona | Champlin | 29 | Humberto99@gmail.com |
| 9 | Naomie | Sanford | 46 | Wilmer37@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 | Jaeden | Stiedemann | 29 | Domenico54@gmail.com |
| 1 | Jeffry | Moen | 51 | Deontae15@gmail.com |
| 2 | Carter | Dickinson | 58 | Melanie_Rippin@yahoo.com |
| 3 | Arlie | Berge | 38 | Jace_Fadel@hotmail.com |
| 4 | Zaria | Lakin | 23 | Toby_Kerluke10@hotmail.com |
| 5 | Morgan | Hudson | 25 | Sophie_Marvin43@hotmail.com |
| 6 | Alize | Purdy | 41 | Kayla3@gmail.com |
| 7 | Jeromy | Witting | 36 | Beau88@gmail.com |
| 8 | Emmalee | Von | 47 | Veronica_Lakin50@gmail.com |
| 9 | Charlie | Stanton-Kuhlman | 26 | Darian25@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 | Gilbert | Feest | 55 | Saul.Quitzon@hotmail.com |
| 1 | Josephine | Crist | 20 | Georgianna.Cruickshank35@yahoo.com |
| 2 | Guiseppe | Kutch | 34 | Dewitt.Cummerata52@hotmail.com |
| 3 | Maryam | Kiehn | 50 | Dillan.Quigley97@hotmail.com |
| 4 | Scotty | Friesen | 32 | Enoch_Beatty@hotmail.com |
| 5 | Colleen | Simonis | 30 | Jarred.Feest@hotmail.com |
| 6 | Bridget | Kuhn | 35 | Lester.McLaughlin85@hotmail.com |
| 7 | Twila | Crona | 45 | Daphnee58@gmail.com |
| 8 | Dwayne | Lemke | 61 | Heloise17@hotmail.com |
| 9 | Katrina | Smitham | 49 | Buddy.Zulauf82@yahoo.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
onRowClick={(row) => console.log(row)}
withScrollArea
/>
)
"use client"をファイルの上部に追加する必要があります。行のダブルクリックイベントをハンドルする
行のダブルクリックイベントをハンドルする場合は、onRowDoubleClickを使用します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Jordan | Batz | 59 | Arlie24@yahoo.com |
| 1 | Penelope | Reynolds | 49 | Stacey_Mills11@yahoo.com |
| 2 | Murphy | Berge | 62 | Clovis_Goodwin49@gmail.com |
| 3 | Carey | Balistreri | 51 | Cheryl.Rosenbaum54@yahoo.com |
| 4 | Ozella | Cummings | 62 | Tami77@yahoo.com |
| 5 | Princess | Bechtelar | 51 | Shania61@yahoo.com |
| 6 | Anderson | Lind | 36 | Bradley_Wehner62@yahoo.com |
| 7 | Santina | Bahringer | 56 | Shawn.Fisher@gmail.com |
| 8 | Nigel | Little | 42 | Camylle71@hotmail.com |
| 9 | Louvenia | Kuphal | 64 | Haven54@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 | |
|---|---|---|---|---|
| 5 | Melissa | Metz | 63 | Dimitri_DuBuque57@gmail.com |
| 8 | Melvin | Dickinson | 51 | Vaughn.Swift@hotmail.com |
| 4 | Dee | Kunze | 49 | Kenyon.Gottlieb77@yahoo.com |
| 6 | Weldon | Haag | 48 | Afton29@hotmail.com |
| 2 | Rosalinda | Effertz | 46 | Eveline85@gmail.com |
| 0 | Rachel | Kovacek | 45 | Nickolas.McKenzie91@yahoo.com |
| 3 | Dakota | Aufderhar | 40 | Abigayle_Cole40@hotmail.com |
| 7 | Felipe | Bruen | 39 | Cordia.Bruen@yahoo.com |
| 9 | Brennon | Leannon | 27 | Steven_Bode70@yahoo.com |
| 1 | Maeve | Stracke | 26 | Idella14@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 | Magnus | Klein | 50 | Valerie_Rutherford60@hotmail.com |
| 1 | Imogene | White | 37 | Maximillia29@gmail.com |
| 2 | Flo | Stanton | 48 | Otilia.Kunde@hotmail.com |
| 3 | Lorenza | O'Hara | 47 | Gail_Turcotte79@yahoo.com |
| 4 | Ladarius | Price | 35 | Frank.McGlynn@gmail.com |
| 5 | Kattie | Klocko | 41 | Warren_Reichert5@gmail.com |
| 6 | Erick | Block | 63 | Lou.Bernhard@hotmail.com |
| 7 | Cicero | Turcotte | 65 | Ramon49@yahoo.com |
| 8 | Alfonzo | Rohan | 24 | Emerald14@yahoo.com |
| 9 | Mariam | Morar | 50 | Kamryn_Lubowitz@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table columns={columns} data={data} enableSorting={false} withScrollArea />
)
複数列のソートを無効にする
複数列のソートを無効にする場合は、enableMultiSortをfalseに設定します。デフォルトは、trueです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Frida | Littel | 51 | Sylvan72@hotmail.com |
| 1 | Assunta | Jacobs | 30 | Caden.Wilkinson@gmail.com |
| 2 | Aubrey | Schoen | 48 | Lena78@yahoo.com |
| 3 | Lynette | Cronin | 41 | Kattie21@yahoo.com |
| 4 | Vincenza | Maggio | 56 | Nya_Welch-Hermann@gmail.com |
| 5 | Vicky | Mertz | 31 | Colton89@gmail.com |
| 6 | Winona | Anderson | 20 | Kathryn_Mertz83@yahoo.com |
| 7 | Stuart | Smitham | 28 | Lelah10@yahoo.com |
| 8 | Dario | Konopelski | 56 | Edgardo57@yahoo.com |
| 9 | Heath | Rolfson | 54 | Shirley11@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table columns={columns} data={data} enableMultiSort={false} withScrollArea />
)
最大のソート可能な列数を設定する
最大のソート可能な列数を設定する場合は、maxMultiSortColCountに数値を設定します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Helena | Sauer | 36 | Grayson25@yahoo.com |
| 1 | Glenn | Schinner | 23 | Lela85@yahoo.com |
| 2 | Dock | Romaguera | 61 | Jenny56@gmail.com |
| 3 | Margaret | Williamson | 56 | Mustafa83@hotmail.com |
| 4 | Eldred | Hickle | 63 | Harold.Frami62@yahoo.com |
| 5 | Rhea | Parisian | 18 | Kaya.Stanton@yahoo.com |
| 6 | Frances | Kuvalis | 42 | Marcia.Koepp59@gmail.com |
| 7 | Asa | Maggio | 38 | Miles.Runolfsson14@yahoo.com |
| 8 | Berenice | Wilkinson | 54 | Loyce_Dooley@gmail.com |
| 9 | Antonio | Kiehn | 24 | Bradly13@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
maxMultiSortColCount={2}
withScrollArea
/>
)
手動のソートを使う
手動のソートを使う場合は、manualSortingをtrueに設定します。デフォルトは、falseです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Jazlyn | Rogahn | 45 | Teri62@gmail.com |
| 1 | Shaniya | Schmidt | 65 | Eldred_Volkman@hotmail.com |
| 2 | Genevieve | Ernser | 39 | Theodora_Huel2@gmail.com |
| 3 | Carter | Reilly | 22 | Michele63@gmail.com |
| 4 | Skye | Harvey | 19 | Ryan.Stokes@gmail.com |
| 5 | Cassandre | Goyette | 54 | Brendon30@gmail.com |
| 6 | Wilbur | Mante | 64 | Madyson_Emard@yahoo.com |
| 7 | Vesta | Franecki | 24 | Mercedes1@hotmail.com |
| 8 | Eriberto | Hackett-Collins | 19 | Jodie91@hotmail.com |
| 9 | Virginie | Halvorson | 23 | Constantin45@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 | Elliot | Barrows | 53 | Paris_Hodkiewicz11@hotmail.com |
| 1 | Beverly | Thompson | 53 | Jessica66@gmail.com |
| 2 | Andy | Hodkiewicz | 36 | Mackenzie_Kshlerin@hotmail.com |
| 3 | Joaquin | Osinski | 20 | Glen15@yahoo.com |
| 4 | Antonia | Roob | 27 | Alfonzo_Cronin47@hotmail.com |
| 5 | Alisa | Herzog | 54 | Vella2@hotmail.com |
| 6 | Marley | Kutch | 30 | Pink.Orn@gmail.com |
| 7 | Candida | Wilkinson | 32 | Chandler.Cole57@hotmail.com |
| 8 | Tanya | Gerlach | 33 | Austen_Cartwright62@yahoo.com |
| 9 | Frank | Maggio | 57 | Austyn56@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} sortDescFirst withScrollArea />
ソートを制御する
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Jaiden | Grant | 24 | Robb34@hotmail.com |
| 1 | Alberta | Carroll | 24 | Lavern.Treutel79@hotmail.com |
| 2 | Annetta | Zulauf-Kirlin | 64 | Damien68@gmail.com |
| 3 | Bella | Christiansen | 43 | Aiyana20@gmail.com |
| 4 | Jennifer | Brekke | 29 | Everett.Dach14@yahoo.com |
| 5 | Efrain | Auer | 36 | Emerald_Collins@gmail.com |
| 6 | Robyn | Runte | 53 | Maxie1@hotmail.com |
| 7 | Stuart | Ullrich | 21 | Torey_Hackett-Orn@hotmail.com |
| 8 | Betty | Herzog | 41 | Amie96@gmail.com |
| 9 | Tess | Schuppe | 27 | Osbaldo96@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 | Alan | Kulas | 52 | Natasha_Pfannerstill@hotmail.com |
| 1 | Marquis | Reichert | 35 | Cooper.Nader54@hotmail.com |
| 2 | Craig | Schoen-Huel | 21 | Michale95@yahoo.com |
| 3 | Adalberto | Purdy | 57 | Alejandrin.Heaney46@gmail.com |
| 4 | Chasity | Wolf | 27 | Shelia5@yahoo.com |
| 5 | Grover | Leannon | 64 | Cesar.Fadel70@gmail.com |
| 6 | Candido | Becker | 37 | Aaliyah25@hotmail.com |
| 7 | Gordon | Klein | 62 | Armani36@yahoo.com |
| 8 | Tyrel | Sipes | 21 | Hans_Balistreri56@gmail.com |
| 9 | Ronaldo | Kemmer | 32 | Helen.Morissette@hotmail.com |
| 10 | Cordelia | O'Connell | 42 | Floy_Medhurst@gmail.com |
| 11 | Ova | Padberg | 28 | Willard_Toy23@gmail.com |
| 12 | Valerie | Rau | 45 | Todd_Waters@gmail.com |
| 13 | Kevon | Brakus | 45 | Jerrold.Bauch49@hotmail.com |
| 14 | Tod | Hills | 65 | Keely_Kub@yahoo.com |
| 15 | Hallie | Breitenberg | 65 | Theresa_Upton@yahoo.com |
| 16 | Rebekah | Hermiston | 27 | Chesley_Rodriguez@hotmail.com |
| 17 | Cora | Little | 37 | Effie_Hodkiewicz54@yahoo.com |
| 18 | Nicolette | Parker-Rogahn | 36 | Dusty_Labadie@hotmail.com |
| 19 | Letitia | Hilll | 24 | Boris.Strosin@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 | Cristina | Reichert | 60 | Tiffany_Durgan@hotmail.com |
| 11 | Nelda | Gleason | 43 | Skylar.Kovacek@hotmail.com |
| 12 | Blanche | Auer | 29 | Verla71@gmail.com |
| 13 | Liana | Shanahan | 36 | Gardner_Rolfson@yahoo.com |
| 14 | Georgiana | Wolf | 18 | Devon.Parisian@yahoo.com |
| 15 | Ollie | Rolfson | 57 | Anahi_Goodwin32@gmail.com |
| 16 | Gillian | Kuvalis-Koepp | 41 | Nels_Rath50@hotmail.com |
| 17 | Joseph | Franey | 34 | Beulah9@yahoo.com |
| 18 | Rita | Hickle | 37 | Ima28@hotmail.com |
| 19 | Lacy | Bailey | 59 | Pierce.Parker@hotmail.com |
const { t } = useI18n("table")
const data = useMemo<TableData[]>(() => createTableData(20), [])
return (
<VStack>
<Table
columns={columns}
data={data}
enablePagination
defaultPagination={{ pageIndex: 1, pageSize: 10 }}
footer={(table) => {
const page = table.getState().pagination.pageIndex + 1
const pageSize = table.getState().pagination.pageSize
const total = table.getPageCount()
return (
<Grid templateColumns="1fr 1fr 1fr" w="full">
<Pagination.Root
size={{ base: "sm", sm: "xs" }}
gridColumn="2 / 3"
page={page}
total={total}
onChange={(page) => table.setPageIndex(page - 1)}
/>
<Select.Root
size={{ base: "sm", sm: "xs" }}
aria-label={t("Page size")}
items={[
{ label: "10", value: "10" },
{ label: "20", value: "20" },
{ label: "30", value: "30" },
{ label: "40", value: "40" },
{ label: "50", value: "50" },
]}
value={pageSize.toString()}
rootProps={{ justifySelf: "end", w: "5xs" }}
onChange={(value) => table.setPageSize(Number(value))}
/>
</Grid>
)
}}
withScrollArea
/>
</VStack>
)
"use client"をファイルの上部に追加する必要があります。手動のページネーションを使う
手動のページネーションを使う場合は、manualPaginationをtrueに設定します。デフォルトは、falseです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Grayce | Bednar | 35 | Geo.Toy34@yahoo.com |
| 1 | Mustafa | Cronin | 65 | Gus.OKeefe50@yahoo.com |
| 2 | Jayda | Brown | 56 | Blaise.Abbott@gmail.com |
| 3 | Justus | Stroman | 44 | Kaleb31@hotmail.com |
| 4 | Britney | Considine | 22 | Alene.Hansen50@hotmail.com |
| 5 | Kariane | O'Conner | 41 | Ervin79@yahoo.com |
| 6 | Maryam | Huel | 22 | Jameson.Kassulke@hotmail.com |
| 7 | Dolly | Pagac | 33 | Brain.Grady31@gmail.com |
| 8 | Georgianna | Schamberger | 20 | Jamie_Reynolds@yahoo.com |
| 9 | Al | Stamm | 61 | Shirley_Blick@hotmail.com |
| 10 | Christopher | Stehr | 28 | Alexandre.Doyle@gmail.com |
| 11 | Raymundo | Klein | 25 | Melinda.Kilback83@gmail.com |
| 12 | Taryn | Roob | 42 | Hunter15@hotmail.com |
| 13 | Eldred | Romaguera | 64 | Jovani.Rempel75@hotmail.com |
| 14 | Leann | Wintheiser | 52 | Ron.Hagenes-Casper14@yahoo.com |
| 15 | Katarina | Funk | 22 | Jayde40@hotmail.com |
| 16 | Oran | Morissette | 47 | Adrien_Medhurst-Becker9@yahoo.com |
| 17 | Colleen | Hodkiewicz | 19 | Austyn.Conroy@gmail.com |
| 18 | Theresia | Hand | 39 | Felicia_Greenfelder@yahoo.com |
| 19 | Stephen | Ondricka | 54 | Gennaro.Wiegand@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 | Lavern | Kirlin | 42 | Lucas_Schmitt-Wuckert@gmail.com |
| 1 | Herminia | Jast | 53 | Jaylon32@gmail.com |
| 2 | Nicolas | Yundt | 23 | Fredy78@gmail.com |
| 3 | Kaylin | Hansen | 27 | Issac.Davis51@yahoo.com |
| 4 | Maryann | Reichel | 40 | Mina_Schoen17@hotmail.com |
| 5 | Donald | Gibson | 43 | Nayeli64@hotmail.com |
| 6 | Elisha | Streich | 36 | Germaine_Flatley@gmail.com |
| 7 | Lana | Lowe | 58 | Betsy_Hettinger97@yahoo.com |
| 8 | Crystal | Labadie | 23 | Aniyah_Kreiger76@gmail.com |
| 9 | Pink | McDermott | 18 | Amparo50@hotmail.com |
| 10 | Vernie | Hackett-Daugherty | 57 | Kristofer.Gerlach@hotmail.com |
| 11 | Michale | Brekke | 49 | Doris69@yahoo.com |
| 12 | Buddy | Reichert | 25 | Kennith.OConnell-Franecki14@gmail.com |
| 13 | Shaniya | Swaniawski | 37 | Johnpaul24@gmail.com |
| 14 | Fatima | Leannon | 63 | Margarette.Franey41@hotmail.com |
| 15 | Curtis | Little | 41 | Jordi29@hotmail.com |
| 16 | Monroe | Sipes | 48 | Karson_Abernathy33@hotmail.com |
| 17 | Arnoldo | Rath | 27 | Ashlynn38@gmail.com |
| 18 | Cooper | Reinger | 42 | Kristine78@yahoo.com |
| 19 | Tomasa | Wisozk | 59 | Jonas.Jenkins11@gmail.com |
const [pagination, setPagination] = useState<PaginationState>({
pageIndex: 0,
pageSize: 20,
})
const { t } = useI18n("table")
const data = useMemo<TableData[]>(() => createTableData(40), [])
return (
<VStack>
<Table
columns={columns}
data={data}
enablePagination
pagination={pagination}
onPaginationChange={setPagination}
footer={(table) => {
const page = table.getState().pagination.pageIndex + 1
const pageSize = table.getState().pagination.pageSize
const total = table.getPageCount()
return (
<Grid templateColumns="1fr 1fr 1fr" w="full">
<Pagination.Root
size={{ base: "sm", sm: "xs" }}
gridColumn="2 / 3"
page={page}
total={total}
onChange={(page) => table.setPageIndex(page - 1)}
/>
<Select.Root
size={{ base: "sm", sm: "xs" }}
aria-label={t("Page size")}
items={[
{ label: "10", value: "10" },
{ label: "20", value: "20" },
{ label: "30", value: "30" },
{ label: "40", value: "40" },
{ label: "50", value: "50" },
]}
value={pageSize.toString()}
rootProps={{ justifySelf: "end", w: "5xs" }}
onChange={(value) => table.setPageSize(Number(value))}
/>
</Grid>
)
}}
withScrollArea
/>
</VStack>
)
"use client"をファイルの上部に追加する必要があります。行の選択を有効にする
行の選択を有効にする場合は、enableRowSelectionをtrueに設定します。デフォルトは、falseです。
| id | firstName | lastName | age | ||
|---|---|---|---|---|---|
| 0 | Dwight | Ankunding | 60 | Odie.Swaniawski@hotmail.com | |
| 1 | Joany | Stanton | 18 | Joey_Yundt81@yahoo.com | |
| 2 | Tommie | Kulas | 21 | Jaime97@hotmail.com | |
| 3 | Shanelle | Jacobs | 34 | Melissa.Murphy51@gmail.com | |
| 4 | Elda | Ullrich | 57 | Marie.MacGyver@hotmail.com | |
| 5 | Carmella | Gottlieb | 46 | Granville84@yahoo.com | |
| 6 | Daron | Dare | 34 | Robin97@yahoo.com | |
| 7 | Sarah | Barton-Skiles | 41 | Marietta.Grimes40@gmail.com | |
| 8 | Dereck | Cole | 51 | Michel.Morissette-Witting23@hotmail.com | |
| 9 | Tre | Ledner | 59 | Maverick32@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} enableRowSelection withScrollArea />
デフォルトの選択された行を設定する
デフォルトの選択された行を設定する場合は、defaultRowSelectionにdataのインデックスをキーとしたオブジェクトを設定します。
| id | firstName | lastName | age | ||
|---|---|---|---|---|---|
| 0 | Germaine | Corwin | 46 | Florine_Spinka21@gmail.com | |
| 1 | Anastacio | Parker | 44 | Amari44@hotmail.com | |
| 2 | Sam | Doyle | 58 | Malika_Purdy@hotmail.com | |
| 3 | Samuel | Crooks | 21 | Shyanne.Haley@hotmail.com | |
| 4 | Jaquelin | Leannon | 39 | Tommy.Keeling23@hotmail.com | |
| 5 | Camryn | O'Keefe | 44 | Addison2@hotmail.com | |
| 6 | Eladio | Lueilwitz | 42 | Maynard.Lebsack@gmail.com | |
| 7 | Rosa | Grady | 43 | Rosa_Hand@yahoo.com | |
| 8 | Maye | Kshlerin-Wilkinson | 53 | Doreen_Parisian84@hotmail.com | |
| 9 | Micheal | Kris | 62 | Braden4@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableRowSelection
defaultRowSelection={{ 0: true }}
withScrollArea
/>
)
行のクリックで選択を有効にする
行のクリックで選択を有効にする場合は、selectOnClickRowをtrueに設定します。デフォルトは、falseです。
| id | firstName | lastName | age | ||
|---|---|---|---|---|---|
| 0 | Abner | Pacocha | 37 | Kennedy64@gmail.com | |
| 1 | Alden | Cremin | 19 | Malvina43@yahoo.com | |
| 2 | Carmel | Farrell | 60 | Robbie44@yahoo.com | |
| 3 | Marcel | Bergstrom | 19 | Lila.Bruen@yahoo.com | |
| 4 | Billie | Ziemann | 51 | Lucas26@gmail.com | |
| 5 | Colten | Skiles | 49 | Camron53@gmail.com | |
| 6 | Pinkie | Wiza | 44 | Otha.Harber47@hotmail.com | |
| 7 | Macy | Heaney | 49 | Keshawn_Tillman84@gmail.com | |
| 8 | Lizzie | Parisian | 56 | Cristopher_Wolff@yahoo.com | |
| 9 | Carolyn | Satterfield | 50 | Archibald.Larson@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableRowSelection
selectOnClickRow
withScrollArea
/>
)
チェックボックスを非表示にする
チェックボックスを非表示にする場合は、withCheckboxをfalseに設定します。デフォルトは、trueです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Sonny | Heidenreich | 37 | Bettye.Cummings@hotmail.com |
| 1 | Adrienne | Schmidt | 42 | Lon.Blanda@yahoo.com |
| 2 | Trycia | Rutherford | 54 | Ciara_Bailey@gmail.com |
| 3 | Lula | Champlin | 60 | Darrick_Ruecker39@gmail.com |
| 4 | Matilda | Hudson | 45 | Skylar53@hotmail.com |
| 5 | Foster | Monahan | 36 | Teagan_Zieme@yahoo.com |
| 6 | Larue | Jakubowski-Brakus | 49 | Calista_Reynolds30@yahoo.com |
| 7 | Belinda | Pfannerstill | 58 | Jamey_Dicki64@yahoo.com |
| 8 | Dustin | Zboncak | 44 | Benedict28@gmail.com |
| 9 | Adrien | Auer | 60 | Jacky.Huels49@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableRowSelection
selectOnClickRow
withCheckbox={false}
withScrollArea
/>
)
行を無効にする
行を無効にする場合は、enableRowSelectionに条件の関数を設定します。
| id | firstName | lastName | age | ||
|---|---|---|---|---|---|
| 0 | Clemmie | Boyle | 31 | Rogelio13@gmail.com | |
| 1 | Evangeline | Wilkinson | 59 | Friedrich_MacGyver30@yahoo.com | |
| 2 | Janet | Schmeler | 20 | Jenny38@hotmail.com | |
| 3 | Odie | Moen | 24 | Marion_Mosciski@yahoo.com | |
| 4 | Orlo | Pfeffer | 19 | Arnulfo_Kunde@yahoo.com | |
| 5 | Mose | Wiegand | 58 | Barton96@yahoo.com | |
| 6 | Vito | Purdy | 25 | Elouise_Terry75@hotmail.com | |
| 7 | Aurelio | Rodriguez | 62 | Rodolfo.Dickinson21@gmail.com | |
| 8 | Newell | Schmidt | 56 | Lucius.Dietrich@gmail.com | |
| 9 | Lola | Hilll | 48 | Erica_Harber@yahoo.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 | Tricia | Dach | 53 | Ivy.Walker50@gmail.com | |
| 1 | Brycen | Hodkiewicz | 28 | Everette94@hotmail.com | |
| 2 | Alexys | O'Conner | 20 | Janie.Quigley12@hotmail.com | |
| 3 | Orville | Braun-Runolfsson | 40 | Alma_Ryan@gmail.com | |
| 4 | Darby | Wisoky | 25 | Juanita25@hotmail.com | |
| 5 | Laisha | Dooley | 32 | Kathlyn_Donnelly@gmail.com | |
| 6 | Zita | Walker | 48 | Loy51@yahoo.com | |
| 7 | Garrett | Hayes | 64 | Eva_Harber@gmail.com | |
| 8 | Dortha | Stanton | 36 | Jerrell96@yahoo.com | |
| 9 | Cullen | Shields | 61 | Julianne3@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 | Kory | Leannon | 51 | Brianne.Block80@hotmail.com |
| 1 | Darlene | Mosciski-Champlin | 42 | Fatima79@yahoo.com |
| 2 | Alysha | Howe | 31 | Wyatt_Hodkiewicz96@yahoo.com |
| 3 | Gabriella | Stehr | 54 | Bart.Bednar@hotmail.com |
| 4 | Retta | Keeling | 40 | Christelle_Fritsch81@gmail.com |
| 5 | Jeffrey | Heller | 43 | Imogene_Zieme@hotmail.com |
| 6 | Karl | Hammes | 39 | Javier.Rohan@gmail.com |
| 7 | Matilde | Gislason | 46 | Shemar.Veum@gmail.com |
| 8 | Haley | Kohler | 32 | Brando.Hahn@gmail.com |
| 9 | Louie | O'Hara | 24 | Dessie.Halvorson@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<VStack>
<Table
columns={columns}
data={data}
header={(table) => {
const value =
(table.getColumn("email")?.getFilterValue() as string | undefined) ??
""
return (
<InputGroup.Root>
<InputGroup.Element>
<SearchIcon />
</InputGroup.Element>
<Input
placeholder="Filter emails"
value={value}
onChange={(ev) =>
table.getColumn("email")?.setFilterValue(ev.target.value)
}
/>
</InputGroup.Root>
)
}}
withScrollArea
/>
</VStack>
)
"use client"をファイルの上部に追加する必要があります。デフォルトのフィルターを設定する
デフォルトのフィルターを設定する場合は、defaultColumnFiltersに配列を設定します。配列のオブジェクトには、フィルターする列のidと値を設定します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 6 | Miles | D'Amore | 43 | Darrell_Lindgren47@gmail.com |
| 9 | Eula | Johnson | 43 | Rashawn74@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 | Raymond | Johnston-Padberg | 55 | Everardo50@gmail.com |
| 1 | Keegan | Wiegand | 18 | Johnnie15@yahoo.com |
| 2 | Morton | Fadel | 18 | Shanie.Medhurst26@yahoo.com |
| 3 | Doris | Schuppe | 27 | Eloisa.Bechtelar52@hotmail.com |
| 4 | Julien | Stoltenberg | 39 | Coralie.Macejkovic0@yahoo.com |
| 5 | Korey | Runolfsdottir | 58 | Kyleigh.Hessel@yahoo.com |
| 6 | Woodrow | Moen | 35 | Leanna_Quitzon-Kulas27@yahoo.com |
| 7 | Hunter | Bednar | 63 | Joana96@hotmail.com |
| 8 | Ross | Casper | 42 | Josie22@gmail.com |
| 9 | Burley | Schmidt | 32 | Dorothy_Russel66@gmail.com |
const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([
{ id: "email", value: "" },
])
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<VStack>
<Table
columns={columns}
data={data}
columnFilters={columnFilters}
onColumnFiltersChange={setColumnFilters}
header={(table) => {
const value =
(table.getColumn("email")?.getFilterValue() as string | undefined) ??
""
return (
<InputGroup.Root>
<InputGroup.Element>
<SearchIcon />
</InputGroup.Element>
<Input
placeholder="Filter emails"
value={value}
onChange={(ev) =>
table.getColumn("email")?.setFilterValue(ev.target.value)
}
/>
</InputGroup.Root>
)
}}
withScrollArea
/>
</VStack>
)
"use client"をファイルの上部に追加する必要があります。列のサイズ変更を有効にする
列のサイズ変更を有効にする場合は、enableColumnResizingをtrueに設定します。デフォルトは、falseです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Vern | Johnson | 61 | Orlo62@yahoo.com |
| 1 | Mamie | McKenzie | 45 | Felicita23@gmail.com |
| 2 | Norris | Grady-Boyer | 52 | Pasquale_Brown@hotmail.com |
| 3 | Khalid | Bins | 51 | Reggie_Romaguera@gmail.com |
| 4 | Lizeth | Marks | 32 | Gia_Medhurst@hotmail.com |
| 5 | Jonathon | Will | 57 | Kayli27@hotmail.com |
| 6 | Nikolas | Christiansen | 22 | Ronald_Walter@yahoo.com |
| 7 | Lessie | Swift | 38 | Sheridan_Wisoky-Barrows99@gmail.com |
| 8 | Harrison | Goldner | 23 | Lena60@yahoo.com |
| 9 | Dejuan | Yundt | 50 | Irving.Jaskolski-Windler@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableColumnResizing
withBorder
withColumnBorders
/>
)
列のサイズ変更の方法を変更する
デフォルトでは、列のサイズ変更のタイミングは、ドラッグしている間に変更されます。ドラッグが終わったときに変更する場合は、columnResizeModeに"onEnd"を設定します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Sherman | Conn | 34 | Pansy.Mosciski44@yahoo.com |
| 1 | Gianni | Williamson | 42 | Malvina.Haley-Wintheiser10@gmail.com |
| 2 | Beth | Kuvalis | 56 | Fatima.Farrell@hotmail.com |
| 3 | Solon | Hilpert | 53 | Hilton_Hackett93@gmail.com |
| 4 | Lana | O'Keefe | 26 | Makenzie_Turner@hotmail.com |
| 5 | Dayana | Collier | 23 | Princess7@yahoo.com |
| 6 | Barbara | Williamson | 22 | Bradly28@gmail.com |
| 7 | Reynold | Bechtelar | 27 | Osborne.Cruickshank47@hotmail.com |
| 8 | Adell | Kozey | 56 | Lilian.Ryan11@hotmail.com |
| 9 | Kayden | Bruen | 55 | Brody.Considine@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableColumnResizing
columnResizeMode="onEnd"
withBorder
withColumnBorders
/>
)
Props
アクセシビリティ
Tableは、アクセシビリティに関してWAI-ARIA - Table Patternに従います。
tablePropsにaria-labelを設定すると、スクリーンリーダーによって読み上げられます。
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
tableProps={{ "aria-label": "User list" }}
/>
)
キーボード操作
| キー | 説明 | 状態 |
|---|---|---|
ArrowLeft | フォーカスを左のセルに1つ移動します。行の一番左のセルにフォーカスがある場合、フォーカスは移動しません。 | - |
ArrowRight | フォーカスを右のセルに1つ移動します。行の一番右のセルにフォーカスがある場合、フォーカスは移動しません。 | - |
ArrowUp | フォーカスを上のセルに1つ移動します。列の一番上のセルにフォーカスがある場合、フォーカスは移動しません。 | - |
ArrowDown | フォーカスを下のセルに1つ移動します。列の一番下のセルにフォーカスがある場合、フォーカスは移動しません。 | - |
Home | フォーカスのある行の最初のセルにフォーカスを移動します。 | - |
End | フォーカスのある行の最後のセルにフォーカスを移動します。 | - |
PageUp | 前のページに移動します。 | enablePagination={true} |
PageDown | 次のページに移動します。 | enablePagination={true} |
ARIAロールと属性
| 要素 | ロールと属性 | 使い方 |
|---|---|---|
table.ui-native-table__root | role="grid" | グリッドであることを示します。 |
aria-rowcount | テーブルの行数を示します。 | |
aria-colcount | テーブルの列数を示します。 | |
aria-multiselectable | enableRowSelectionが設定されている場合は"true"を設定します。 | |
thead.ui-native-table__thead | role="rowgroup" | 行グループであることを示します。 |
tr.ui-native-table__tr | role="row" | 行であることを示します。 |
aria-rowindex | 行がテーブルの何行目であるかを示します。 | |
aria-disabled | enableRowSelectionを関数で設定し、falseの行には"true"を設定します。 | |
aria-selected | 行が選択されている場合は"true"を設定し、未選択の場合は"false"を設定します。 | |
th.ui-native-table__th | role="columnheader" | カラムヘッダーであることを示します。 |
aria-rowindex | 行がテーブルの何行目であるかを示します。 | |
aria-colindex | 列がテーブルの何列目であるかを示します。 | |
aria-sort | 列が昇順の場合は"ascending"を設定し、降順の場合は"descending"を設定、指定がない場合は"none"を設定します。 | |
tbody.ui-native-table__tbody | role="rowgroup" | 行グループであることを示します。 |
td.ui-native-table__td | role="gridcell" | グリッドセルであることを示します。 |
aria-colindex | 列がテーブルの何列目であるかを示します。 | |
aria-rowindex | 行がテーブルの何行目であるかを示します。 | |
tfoot.ui-native-table__tfoot | role="rowgroup" | 行グループであることを示します。 |
label.ui-checkbox__root > input | aria-label | ヘッダーの場合は"すべての行を選択する"、それ以外の行の場合は"行を選択する"を設定します。 |
th.ui-native-table__th > button | aria-label | 列が昇順の場合は"昇順でソートする"を設定し、降順の場合は"降順でソートする"を設定、指定がない場合は"ソートを解除する"を設定します。 |
類似のコンポーネント
NativeTable
NativeTableは、データを効率的に整理して表示するコンポーネントです。
Stat
Statは、数値やデータをボックス内に表示するために使用されます。
AreaChart
AreaChartは、複数のデータを比較するためのエリアチャートを描画するコンポーネントです。
Badge
Badgeは、アイテムのステータスを強調表示して、すぐに認識できるようにするコンポーネントです。
BarChart
BarChartは、複数のデータを比較するための棒グラフを描画するコンポーネントです。
Card
Cardは、関連する情報をグループ化して表示するコンポーネントです。デフォルトでは、article要素をレンダリングします。
ComposedChart
ComposedChartは、複数のデータを比較するための複合チャートを描画するコンポーネントです。
DataList
DataListは、データ項目のリストを表示するために使用されます。