Table
Tableは、列のソートや行の選択やクリックイベント機能を備えたテーブルのコンポーネントです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Alena | Breitenberg | 38 | Elsie_Bruen@hotmail.com |
| 1 | Toni | Predovic | 55 | Vivian.Deckow@hotmail.com |
| 2 | Ida | Langosh | 62 | Della_Cartwright@hotmail.com |
| 3 | Ellen | Medhurst | 38 | Lempi81@yahoo.com |
| 4 | Marco | Stokes | 65 | Margot43@gmail.com |
| 5 | Kari | Vandervort | 45 | Conor_Pagac0@gmail.com |
| 6 | Dovie | Schuppe | 36 | Miles_Gulgowski@yahoo.com |
| 7 | Laverne | Wolff | 19 | Alfredo.Fisher@hotmail.com |
| 8 | Connor | Medhurst | 38 | Kerry_Lindgren-Pouros@gmail.com |
| 9 | Javier | Erdman | 42 | Pedro58@gmail.com |
interface Data {
id: string
age: number
email: string
firstName: string
lastName: string
}
const columnHelper = createColumnHelper<Data>()
const columns = useMemo(
() => [
columnHelper.accessor("id", { cellProps: { numeric: true } }),
columnHelper.accessor("firstName", { lineClamp: 1 }),
columnHelper.accessor("lastName", { lineClamp: 1 }),
columnHelper.accessor("age", { cellProps: { numeric: true } }),
columnHelper.accessor("email", { lineClamp: 1 }),
],
[],
)
const data = useMemo<Data[]>(
() =>
Array.from({ length: 10 }, (_, index) => ({
id: index.toString(),
age: faker.number.int({ max: 65, min: 18 }),
email: faker.internet.email(),
firstName: faker.person.firstName(),
lastName: faker.person.lastName(),
})),
[],
)
return <Table columns={columns} data={data} withScrollArea />
使い方
import { Table } from "@yamada-ui/react"
import { Table } from "@/components/ui"
import { Table } from "@workspaces/ui"
<Table />
Tableは、内部でtanstack-tableとNativeTableを使用しています。バリアントを変更する
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Murl | Lang | 33 | Sherry98@hotmail.com |
| 1 | Kellie | Hoppe | 59 | Alfonso_Osinski@gmail.com |
| 2 | Nathan | Rippin | 19 | Rick_Rolfson21@gmail.com |
| 3 | Jo | Kulas | 29 | Michael.Rath@hotmail.com |
| 4 | Jenny | Cole | 44 | Guadalupe_Greenholt@gmail.com |
| 5 | Abigail | Toy | 54 | David52@gmail.com |
| 6 | Ally | Collier | 61 | Alexis75@gmail.com |
| 7 | Nicole | Schulist | 54 | Nasir.Williamson@hotmail.com |
| 8 | Francesco | Fritsch | 31 | Martin.Blick@yahoo.com |
| 9 | Isac | MacGyver | 45 | Kirsten.Bode54@gmail.com |
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Murl | Lang | 33 | Sherry98@hotmail.com |
| 1 | Kellie | Hoppe | 59 | Alfonso_Osinski@gmail.com |
| 2 | Nathan | Rippin | 19 | Rick_Rolfson21@gmail.com |
| 3 | Jo | Kulas | 29 | Michael.Rath@hotmail.com |
| 4 | Jenny | Cole | 44 | Guadalupe_Greenholt@gmail.com |
| 5 | Abigail | Toy | 54 | David52@gmail.com |
| 6 | Ally | Collier | 61 | Alexis75@gmail.com |
| 7 | Nicole | Schulist | 54 | Nasir.Williamson@hotmail.com |
| 8 | Francesco | Fritsch | 31 | Martin.Blick@yahoo.com |
| 9 | Isac | MacGyver | 45 | Kirsten.Bode54@gmail.com |
const data = useMemo<Data[]>(() => 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 | Runolfsson | 64 | Cary.Walker22@hotmail.com |
| 1 | Meagan | Turner | 57 | Angel83@yahoo.com |
| 2 | Flo | Hettinger | 24 | Leopold40@gmail.com |
| 3 | Boris | Kunze | 50 | Bruce.OConner26@gmail.com |
| 4 | Nicola | Orn | 54 | Gilbert_Moore@yahoo.com |
| 5 | Clarence | Walsh | 51 | Zula54@hotmail.com |
| 6 | Oran | Johnson | 55 | Jazmin21@yahoo.com |
| 7 | Jaida | Schimmel | 62 | Jay21@yahoo.com |
| 8 | Merle | Orn | 40 | Verna28@hotmail.com |
| 9 | Yessenia | Hermann | 43 | Adeline.Kutch@yahoo.com |
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Kristie | Runolfsson | 64 | Cary.Walker22@hotmail.com |
| 1 | Meagan | Turner | 57 | Angel83@yahoo.com |
| 2 | Flo | Hettinger | 24 | Leopold40@gmail.com |
| 3 | Boris | Kunze | 50 | Bruce.OConner26@gmail.com |
| 4 | Nicola | Orn | 54 | Gilbert_Moore@yahoo.com |
| 5 | Clarence | Walsh | 51 | Zula54@hotmail.com |
| 6 | Oran | Johnson | 55 | Jazmin21@yahoo.com |
| 7 | Jaida | Schimmel | 62 | Jay21@yahoo.com |
| 8 | Merle | Orn | 40 | Verna28@hotmail.com |
| 9 | Yessenia | Hermann | 43 | Adeline.Kutch@yahoo.com |
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Kristie | Runolfsson | 64 | Cary.Walker22@hotmail.com |
| 1 | Meagan | Turner | 57 | Angel83@yahoo.com |
| 2 | Flo | Hettinger | 24 | Leopold40@gmail.com |
| 3 | Boris | Kunze | 50 | Bruce.OConner26@gmail.com |
| 4 | Nicola | Orn | 54 | Gilbert_Moore@yahoo.com |
| 5 | Clarence | Walsh | 51 | Zula54@hotmail.com |
| 6 | Oran | Johnson | 55 | Jazmin21@yahoo.com |
| 7 | Jaida | Schimmel | 62 | Jay21@yahoo.com |
| 8 | Merle | Orn | 40 | Verna28@hotmail.com |
| 9 | Yessenia | Hermann | 43 | Adeline.Kutch@yahoo.com |
const data = useMemo<Data[]>(() => 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 | Elian | Rice | 25 | Rhonda_Kulas81@gmail.com |
| 1 | Olivia | Schuppe | 65 | Monroe.Lockman@yahoo.com |
| 2 | Ervin | Welch | 18 | Reva.Graham83@gmail.com |
| 3 | Neil | Shields | 63 | Lance20@yahoo.com |
| 4 | Arnaldo | Kerluke | 56 | Randal.Pacocha@gmail.com |
| 5 | Adolf | Gleason | 59 | Jackie_Kautzer90@hotmail.com |
| 6 | Keith | Feil | 43 | Donna.Dietrich@hotmail.com |
| 7 | Phyllis | Ferry | 58 | Harold_Mohr@gmail.com |
| 8 | Deontae | Auer | 20 | Jasmin54@gmail.com |
| 9 | Darius | Abshire | 39 | Myah_Macejkovic@hotmail.com |
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Elian | Rice | 25 | Rhonda_Kulas81@gmail.com |
| 1 | Olivia | Schuppe | 65 | Monroe.Lockman@yahoo.com |
| 2 | Ervin | Welch | 18 | Reva.Graham83@gmail.com |
| 3 | Neil | Shields | 63 | Lance20@yahoo.com |
| 4 | Arnaldo | Kerluke | 56 | Randal.Pacocha@gmail.com |
| 5 | Adolf | Gleason | 59 | Jackie_Kautzer90@hotmail.com |
| 6 | Keith | Feil | 43 | Donna.Dietrich@hotmail.com |
| 7 | Phyllis | Ferry | 58 | Harold_Mohr@gmail.com |
| 8 | Deontae | Auer | 20 | Jasmin54@gmail.com |
| 9 | Darius | Abshire | 39 | Myah_Macejkovic@hotmail.com |
const data = useMemo<Data[]>(() => 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 | Frederick | Renner | 24 | Anya_Dare-Daugherty@hotmail.com |
| 1 | Jacklyn | Kunze | 61 | Dusty80@hotmail.com |
| 2 | Luis | Greenholt | 40 | Van60@hotmail.com |
| 3 | Vincenzo | Kunde | 36 | Antonio_Kuhlman0@gmail.com |
| 4 | Willard | Anderson | 33 | Shari44@gmail.com |
| 5 | Julien | Orn | 27 | Violet_Lubowitz@yahoo.com |
| 6 | Darla | Terry | 27 | Floyd_Hills78@yahoo.com |
| 7 | Domenick | Padberg | 47 | Rudy.Lueilwitz@gmail.com |
| 8 | Jude | Kemmer | 42 | Wilfred_Goodwin@gmail.com |
| 9 | Jean | Koch | 29 | Letha38@yahoo.com |
const data = useMemo<Data[]>(() => createTableData(), [])
return <Table columns={columns} data={data} withBorder withScrollArea />
列の区切り線を追加する
列の区切り線を追加する場合は、withColumnBordersをtrueにします。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Turner | Goodwin | 63 | Bernice.Hagenes69@hotmail.com |
| 1 | Reanna | Kozey | 64 | Beverly_Buckridge86@gmail.com |
| 2 | Pamela | Reinger | 42 | Felipe.Stark@yahoo.com |
| 3 | Corey | Lang | 44 | Rory48@yahoo.com |
| 4 | Terry | Carter | 29 | Viviane_Hudson33@hotmail.com |
| 5 | Vickie | Kunde | 51 | Tristian10@yahoo.com |
| 6 | Franklin | Heller | 18 | Rochelle.Spencer92@yahoo.com |
| 7 | Jennie | Waters | 39 | Bert_Yundt56@gmail.com |
| 8 | Derrick | Roob | 47 | Clementina_Wisozk@yahoo.com |
| 9 | Garry | Bauch-Corkery | 63 | Vera.Marquardt70@hotmail.com |
const data = useMemo<Data[]>(() => createTableData(), [])
return <Table columns={columns} data={data} withColumnBorders withScrollArea />
行がホバーされたときにハイライトする
行がホバーされたときにハイライトする場合は、highlightOnHoverをtrueにします。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Mark | Leannon | 24 | Celia75@yahoo.com |
| 1 | Alberta | Bernier | 21 | Buck.Huels@gmail.com |
| 2 | Vicki | Sawayn | 33 | Ralph_Armstrong-Olson72@yahoo.com |
| 3 | Roscoe | Hoeger | 21 | Elias.Kuhlman@yahoo.com |
| 4 | Lindsey | Mohr | 48 | Shelia19@yahoo.com |
| 5 | Dora | Mills | 54 | Douglas84@gmail.com |
| 6 | Laney | Dietrich | 33 | Cathy71@gmail.com |
| 7 | Macy | Powlowski | 63 | Cameron91@yahoo.com |
| 8 | Bobby | Gleichner | 53 | Grant.Emmerich@gmail.com |
| 9 | Johann | Corwin | 61 | Loraine63@yahoo.com |
const data = useMemo<Data[]>(() => createTableData(), [])
return <Table columns={columns} data={data} highlightOnHover withScrollArea />
ストライプを使う
ストライプを使う場合は、stripedをtrueにします。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Gary | Daniel | 55 | Gwen.Kovacek@gmail.com |
| 1 | Randall | Cole | 64 | Lance_Bradtke@hotmail.com |
| 2 | Vaughn | Klein | 65 | Margarita95@yahoo.com |
| 3 | Emily | Greenholt | 65 | Charlene15@hotmail.com |
| 4 | Corey | Hirthe | 45 | Emelie62@gmail.com |
| 5 | Bridget | Anderson | 60 | Byron_Macejkovic30@gmail.com |
| 6 | Isabel | Brekke | 55 | Joann_Raynor@hotmail.com |
| 7 | Julia | Abshire | 34 | Gary_Kihn@hotmail.com |
| 8 | Miguel | Haley | 20 | Karl78@hotmail.com |
| 9 | Paolo | Schultz | 18 | Caroline.Olson@yahoo.com |
const data = useMemo<Data[]>(() => createTableData(), [])
return <Table columns={columns} data={data} striped withScrollArea />
スクロールエリアを使う
スクロールエリアを使う場合は、withScrollAreaをtrueにします。
| id | firstName | lastName | age | phone | role | status | createdAt | updatedAt | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | Damon | Davis | 28 | Priscilla.Feil@yahoo.com | 689-525-3289 x201 | user | inactive | 12/26/2025 | 11/21/2025 |
| 1 | Neil | Klein | 50 | Jay.Friesen@yahoo.com | (486) 980-3403 x5677 | admin | active | 10/11/2025 | 7/1/2025 |
| 2 | Paris | Wolf | 59 | Luther_Hackett@yahoo.com | 287-284-6450 x00750 | user | active | 7/21/2025 | 10/18/2025 |
| 3 | Sylvester | Borer | 53 | Kyle.Mueller0@hotmail.com | 849.704.1227 x4819 | user | active | 1/29/2026 | 9/25/2025 |
| 4 | Derrick | Sipes | 46 | Suzanne.Block@hotmail.com | 396.869.7286 x8324 | admin | active | 9/10/2025 | 3/1/2026 |
| 5 | Emerson | Terry | 41 | Carrie_Hartmann@gmail.com | 590.643.9904 x868 | user | inactive | 11/7/2025 | 6/27/2025 |
| 6 | Jasmine | Bogisich | 49 | Demarco96@hotmail.com | 291-317-6066 | admin | active | 2/1/2026 | 7/10/2025 |
| 7 | Deon | Haag | 31 | Irma.Feil93@gmail.com | 482.361.3539 x730 | admin | inactive | 10/13/2025 | 12/30/2025 |
| 8 | Johnpaul | Hickle | 46 | Beulah50@yahoo.com | 1-394-645-4611 | user | inactive | 4/12/2025 | 10/29/2025 |
| 9 | Kane | Mueller | 51 | Oliver43@gmail.com | 325.828.9872 x377 | user | active | 8/1/2025 | 8/22/2025 |
const data = useMemo<Data[]>(() => createTableData(), [])
return <Table columns={columnsFull} data={data} withScrollArea />
ヘッダーグループ
| id | user | |||
|---|---|---|---|---|
| name | age | |||
| firstName | lastName | |||
| 0 | Teri | Wiegand | 38 | Melba_Daugherty6@gmail.com |
| 1 | Bettie | Marquardt | 61 | John.Towne41@yahoo.com |
| 2 | John | Beier | 51 | Victoria6@hotmail.com |
| 3 | Edward | Wisozk | 22 | Christina_White@gmail.com |
| 4 | Sarah | Grady | 52 | Lola.Parker72@gmail.com |
| 5 | Alex | Kshlerin | 57 | Lawrence_Feil26@hotmail.com |
| 6 | Nathan | Dare | 28 | Clarissa98@yahoo.com |
| 7 | Chris | Erdman | 45 | Geovanny.Lowe@gmail.com |
| 8 | Shannon | West | 42 | Garrick.Hayes@gmail.com |
| 9 | Jeanette | Dickinson | 39 | Annie_Corwin@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<Data[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
withBorder
withColumnBorders
withScrollArea
/>
)
フッターグループ
| id | user | |||
|---|---|---|---|---|
| name | age | |||
| firstName | lastName | |||
| 0 | Jeanne | Kilback | 49 | Una7@yahoo.com |
| 1 | Della | Goyette | 28 | Yvonne6@yahoo.com |
| 2 | Rogelio | Little | 42 | Kenyatta83@yahoo.com |
| 3 | Everett | Herzog | 22 | Ezekiel.Kohler@yahoo.com |
| 4 | Claire | Nolan | 26 | Francesco42@hotmail.com |
| 5 | Jarrod | Stiedemann | 44 | Henrietta_Marquardt@hotmail.com |
| 6 | Lorine | Collins | 20 | Ericka7@hotmail.com |
| 7 | Yvonne | Gorczany | 39 | Madge_Botsford19@hotmail.com |
| 8 | Guillermo | Morissette | 18 | Carrie83@yahoo.com |
| 9 | Israel | Homenick | 48 | Courtney_Kling66@yahoo.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<Data[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
withBorder
withColumnBorders
withFooterGroups
withScrollArea
/>
)
キーボードナビゲーションを無効にする
キーボードナビゲーションを無効にする場合は、enableKeyboardNavigationをfalseに設定します。デフォルトは、trueです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Micheal | Bogisich | 56 | Duane.Hilpert@yahoo.com |
| 1 | Kyra | Rolfson | 43 | Darryl_Windler-Walker@yahoo.com |
| 2 | Burley | Jast | 55 | Alessandra_Boyle63@gmail.com |
| 3 | Tami | Thiel | 57 | Burdette.OReilly5@hotmail.com |
| 4 | Willard | Pouros | 32 | Howard_Kiehn30@hotmail.com |
| 5 | Dedrick | Sporer | 52 | Mikayla.Vandervort@yahoo.com |
| 6 | Brandon | Schoen | 31 | Fabiola38@yahoo.com |
| 7 | Rene | Upton | 52 | Vicky17@yahoo.com |
| 8 | Conrad | Cormier | 58 | Leona.Murphy@hotmail.com |
| 9 | Wendy | Leannon | 54 | Roselyn.Maggio94@gmail.com |
const data = useMemo<Data[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableKeyboardNavigation={false}
withScrollArea
/>
)
初回のフォーカス可能なセルを設定する
初回のフォーカス可能なセルを設定する場合は、initialFocusableCellにセルの列と行を指定したオブジェクト({ colIndex: number, rowIndex: number })を設定します。デフォルトは、{ colIndex: 0, rowIndex: 0 }です。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Ryan | Langworth | 61 | Kenneth78@gmail.com |
| 1 | Roderick | Keeling | 50 | June_Auer6@yahoo.com |
| 2 | Jennifer | Grant | 47 | Danielle36@hotmail.com |
| 3 | Linnie | Koch | 61 | Taylor.Boyer32@yahoo.com |
| 4 | Arturo | Friesen | 40 | Jeanette.Kulas@hotmail.com |
| 5 | Horace | Kovacek-Hermiston | 29 | Zoey.Collins@yahoo.com |
| 6 | Latoya | Schultz | 39 | Brooks.Jones@yahoo.com |
| 7 | Juan | Fahey | 35 | Gladys.Boyle@gmail.com |
| 8 | Danielle | Jakubowski | 34 | Margaret33@yahoo.com |
| 9 | James | Mueller | 62 | Travis_Reichert@yahoo.com |
const data = useMemo<Data[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
initialFocusableCell={{ colIndex: 1, rowIndex: 0 }}
withScrollArea
/>
)
行のクリックイベントをハンドルする
行のクリックイベントをハンドルする場合は、onRowClickを使用します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Everett | Reichert | 57 | Cleora_Becker@hotmail.com |
| 1 | Tamara | Miller-Wolff | 20 | Hubert_White@hotmail.com |
| 2 | Dean | Zulauf | 65 | Marie.Bode@gmail.com |
| 3 | Clair | Macejkovic | 48 | Darrell_Dicki90@gmail.com |
| 4 | Megan | Bergstrom | 42 | Rochelle_Hickle@hotmail.com |
| 5 | Amy | Williamson | 22 | Gene.Jones@gmail.com |
| 6 | Julian | O'Keefe | 34 | Cathrine16@gmail.com |
| 7 | Morris | O'Kon | 61 | Godfrey11@hotmail.com |
| 8 | Tamia | Waelchi | 38 | Samson.Watsica80@hotmail.com |
| 9 | Sadie | Wunsch | 33 | Stephanie37@yahoo.com |
const data = useMemo<Data[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
onRowClick={(row) => console.log(row)}
withScrollArea
/>
)
"use client"をファイルの上部に追加する必要があります。行のダブルクリックイベントをハンドルする
行のダブルクリックイベントをハンドルする場合は、onRowDoubleClickを使用します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Thelma | Mante-Ziemann | 50 | Jan_Hermann@gmail.com |
| 1 | Leslie | Bechtelar | 24 | Talia85@hotmail.com |
| 2 | Ayla | Hahn | 32 | Rene_Batz0@gmail.com |
| 3 | Lamar | Jacobi | 37 | Brandi_Stiedemann37@gmail.com |
| 4 | Shyanne | Schulist | 44 | Damon_Terry50@gmail.com |
| 5 | Cristina | Kihn | 59 | Santa.Gislason@yahoo.com |
| 6 | Giovanna | Gerlach | 49 | Belle63@gmail.com |
| 7 | Marilyne | Kirlin | 57 | Callie59@hotmail.com |
| 8 | Laverne | Emard | 37 | Eda71@hotmail.com |
| 9 | Grady | Klocko | 30 | Alfonso.Bayer@gmail.com |
const data = useMemo<Data[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
onRowDoubleClick={(row) => console.log(row)}
withScrollArea
/>
)
"use client"をファイルの上部に追加する必要があります。デフォルトのソートを設定する
デフォルトのソートを設定する場合は、defaultSortingに配列を設定します。配列のオブジェクトには、ソートをする列のidと方向を設定します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 7 | Earl | Kerluke-Rogahn | 61 | Miguel.Goyette14@yahoo.com |
| 8 | Guido | Davis | 60 | Elaine84@hotmail.com |
| 9 | Marty | Stiedemann | 60 | Jonas.Quigley@hotmail.com |
| 0 | Dennis | O'Kon | 58 | Kara84@yahoo.com |
| 4 | Ira | Corkery | 53 | Lindsay42@yahoo.com |
| 5 | Marcella | Wehner | 37 | Sandy44@yahoo.com |
| 2 | Lee | Pollich | 34 | Forrest_Reynolds@hotmail.com |
| 6 | Angelica | Hodkiewicz-Jast | 26 | Dorothea_Hermiston22@hotmail.com |
| 1 | Tami | Schaefer-Larson | 25 | Cecil76@hotmail.com |
| 3 | Gayle | Monahan | 22 | Reina.Bradtke71@yahoo.com |
const data = useMemo<Data[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
defaultSorting={[{ id: "age", desc: true }]}
withScrollArea
/>
)
ソートを無効にする
ソートを無効にする場合は、enableSortingをfalseに設定します。デフォルトは、trueです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Walter | Blick | 38 | Roberta69@yahoo.com |
| 1 | Sherry | Emard | 31 | Carmen.Toy78@hotmail.com |
| 2 | Nina | Cormier | 31 | Inez_Ortiz43@hotmail.com |
| 3 | Cristina | Gutkowski | 53 | Etha.Halvorson9@yahoo.com |
| 4 | Harry | Nolan | 45 | Luke_Harris12@yahoo.com |
| 5 | Treva | Gleichner | 25 | Joyce_Swift59@gmail.com |
| 6 | Virginia | Cummings | 25 | Irwin.Ernser43@yahoo.com |
| 7 | Rosalie | Wiegand | 20 | Vicky_Sawayn@yahoo.com |
| 8 | Allan | Grady | 28 | Margaret.Schimmel@yahoo.com |
| 9 | Jesus | Turner | 29 | Danny_Schimmel@yahoo.com |
const data = useMemo<Data[]>(() => createTableData(), [])
return (
<Table columns={columns} data={data} enableSorting={false} withScrollArea />
)
複数列のソートを無効にする
複数列のソートを無効にする場合は、enableMultiSortをfalseに設定します。デフォルトは、trueです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Caroline | Leannon | 22 | Hertha_Feest@gmail.com |
| 1 | Vicky | Marvin | 26 | Nancy_Cummerata@hotmail.com |
| 2 | Lucy | Kohler | 56 | Rolando44@yahoo.com |
| 3 | Xander | Schowalter | 25 | Emily.Marquardt-Beer49@gmail.com |
| 4 | Lena | Heaney | 43 | Brandon81@yahoo.com |
| 5 | Elouise | Grimes | 33 | Justus_Bruen48@hotmail.com |
| 6 | Imani | Kuphal | 27 | Shania86@gmail.com |
| 7 | Josefina | Morar | 23 | Maximilian_Strosin@gmail.com |
| 8 | Abel | Hammes | 46 | Kellie_Lubowitz@gmail.com |
| 9 | Aniyah | Wolf | 38 | Jerry.Murray@hotmail.com |
const data = useMemo<Data[]>(() => createTableData(), [])
return (
<Table columns={columns} data={data} enableMultiSort={false} withScrollArea />
)
最大のソート可能な列数を設定する
最大のソート可能な列数を設定する場合は、maxMultiSortColCountに数値を設定します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Nicole | Rohan | 60 | Alan.Kerluke49@yahoo.com |
| 1 | Ramon | Dach | 23 | Rhiannon53@yahoo.com |
| 2 | Billie | Pfeffer | 20 | Courtney.White5@gmail.com |
| 3 | Fernando | Grimes | 20 | Frederique.Kutch89@yahoo.com |
| 4 | Neil | Terry | 19 | Glen.Gerlach-Hintz57@hotmail.com |
| 5 | Christopher | Murazik | 65 | Amos_Smith@hotmail.com |
| 6 | Ruben | Grant | 60 | Krystal_Jenkins87@yahoo.com |
| 7 | Marie | Koss | 31 | Anna.Lueilwitz2@yahoo.com |
| 8 | Francis | Farrell | 48 | Angel.Kulas27@hotmail.com |
| 9 | Kelly | Bechtelar | 37 | Jocelyn_Williamson@hotmail.com |
const data = useMemo<Data[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
maxMultiSortColCount={2}
withScrollArea
/>
)
手動のソートを使う
手動のソートを使う場合は、manualSortingをtrueに設定します。デフォルトは、falseです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Dorothy | Kutch | 50 | Renee3@gmail.com |
| 1 | Andrew | Walker | 46 | Lula.Douglas42@yahoo.com |
| 2 | Max | Rohan | 48 | Krista_Ziemann@gmail.com |
| 3 | Fernando | Howell | 37 | Dianna86@yahoo.com |
| 4 | Janelle | Schulist | 43 | Marquis.Schamberger68@hotmail.com |
| 5 | Lane | Hackett | 30 | Ivan66@gmail.com |
| 6 | Amari | McKenzie | 52 | Madeline_Kozey-Okuneva97@yahoo.com |
| 7 | Tina | Kris | 56 | Raegan_Bauch@gmail.com |
| 8 | Sonny | Padberg | 22 | Ira62@hotmail.com |
| 9 | Marty | Steuber | 47 | Estefania33@gmail.com |
const defaultData = useMemo<Data[]>(() => createTableData(), [])
const [data, setData] = useState<Data[]>(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 | Adolfo | Jaskolski | 19 | Anibal.Parker@gmail.com |
| 1 | Jeremy | Rutherford | 56 | Darron49@yahoo.com |
| 2 | Elmer | Reinger | 33 | Janae_Pagac95@hotmail.com |
| 3 | Elena | Gislason | 38 | Levi_Roberts@yahoo.com |
| 4 | Dawn | Jaskolski | 36 | Luke_Stanton82@gmail.com |
| 5 | Darrin | Doyle | 22 | Bernie54@gmail.com |
| 6 | Jonatan | Howell | 45 | Jesus.Satterfield@hotmail.com |
| 7 | Muriel | Collins | 60 | Debra.Ruecker50@gmail.com |
| 8 | Katie | West | 34 | Jazmyn1@gmail.com |
| 9 | Harvey | Lubowitz | 32 | Colby.Keebler@hotmail.com |
const data = useMemo<Data[]>(() => createTableData(), [])
return <Table columns={columns} data={data} sortDescFirst withScrollArea />
ソートを制御する
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Gloria | Cremin | 21 | Margarita.Doyle89@gmail.com |
| 1 | Vernon | Collins | 31 | Brandy.Quitzon83@yahoo.com |
| 2 | Julian | Hermiston | 49 | Randall29@gmail.com |
| 3 | Hollie | Sanford | 33 | Elsa.Sporer@hotmail.com |
| 4 | Leonardo | Kunze | 19 | Tiffany_Leannon96@gmail.com |
| 5 | Ansley | Beer | 38 | Emanuel_OHara22@yahoo.com |
| 6 | Tyrone | Reichert | 52 | Chauncey94@yahoo.com |
| 7 | Leigh | Stroman | 23 | Jerald_Kling59@gmail.com |
| 8 | Gage | Flatley | 30 | Rita.Ratke1@yahoo.com |
| 9 | Julio | Torp | 54 | Lela.Jast43@yahoo.com |
const [sorting, setSorting] = useState<SortingState<Data>>([
{ id: "age", desc: true },
])
const data = useMemo<Data[]>(() => createTableData(), [])
return <Table columns={columns} data={data} withScrollArea />
"use client"をファイルの上部に追加する必要があります。ページネーションを有効にする
ページネーションを有効にする場合は、enablePaginationをtrueに設定し、ページネーションをコントロールするコンポーネントをheaderまたはfooterに設定します。デフォルトは、falseです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Ashley | Rath | 54 | Emma42@yahoo.com |
| 1 | Kurt | Grady | 64 | Gregg67@yahoo.com |
| 2 | Jose | Paucek | 26 | Enrique.Tromp39@yahoo.com |
| 3 | Logan | Corkery | 57 | Shawna22@yahoo.com |
| 4 | Orville | Beer | 19 | Leo.Walker@hotmail.com |
| 5 | Delia | Schumm | 35 | Cecelia.Leannon95@gmail.com |
| 6 | Jaime | Herman | 53 | Rene22@gmail.com |
| 7 | Erik | Johns | 46 | Laila.Reichert44@gmail.com |
| 8 | Cody | Crona | 51 | Thelma55@hotmail.com |
| 9 | Darla | Reichel | 34 | Tim.Rolfson@yahoo.com |
| 10 | Kristen | Schmitt | 63 | Rogelio_Hills47@gmail.com |
| 11 | Owen | Parisian | 37 | Wendy8@hotmail.com |
| 12 | Javier | Pouros | 46 | Marjory94@yahoo.com |
| 13 | Leann | Jones | 57 | Russel_Franey-Hansen@gmail.com |
| 14 | Marta | Becker | 36 | Glenn_Price82@gmail.com |
| 15 | Lynne | Schultz | 57 | Oswald.Christiansen@hotmail.com |
| 16 | Sheri | Beatty | 65 | Chad_Hayes-Runte5@yahoo.com |
| 17 | Martin | Dickinson | 64 | Anabelle_Rippin@gmail.com |
| 18 | Haylee | Spinka | 32 | Cindy_Boyle75@gmail.com |
| 19 | Maggie | Cormier | 27 | Robyn19@hotmail.com |
const { t } = useI18n("table")
const data = useMemo<Data[]>(() => 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 | Pedro | Smitham | 48 | Delbert83@gmail.com |
| 11 | Patti | Weissnat | 64 | Kennedy59@hotmail.com |
| 12 | Brandi | Hegmann | 50 | Lonny.Erdman-Conroy11@hotmail.com |
| 13 | Ivory | Rath | 22 | Nelson76@yahoo.com |
| 14 | Heath | Stehr | 55 | Saul.Cremin@gmail.com |
| 15 | Izaiah | Davis | 50 | Bryan18@gmail.com |
| 16 | Terrence | Daniel | 44 | Krista.Bergstrom68@hotmail.com |
| 17 | Rosalie | Crooks | 31 | Beverly56@yahoo.com |
| 18 | Bertha | Stokes | 19 | Alyson_Buckridge@yahoo.com |
| 19 | Clifton | Goodwin | 19 | Susie78@hotmail.com |
const { t } = useI18n("table")
const data = useMemo<Data[]>(() => 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 | Luis | Davis | 62 | Lina.Howell@yahoo.com |
| 1 | Creola | Johnson | 25 | Denise79@yahoo.com |
| 2 | Percy | Farrell | 44 | Angelina.Prohaska@hotmail.com |
| 3 | Bertrand | Bode-Hane | 29 | Virginia98@gmail.com |
| 4 | Ada | Fahey | 24 | Delores.Bode@yahoo.com |
| 5 | Alonzo | Stark | 43 | Melvin63@yahoo.com |
| 6 | Casey | Ryan | 23 | Dewey_Price@hotmail.com |
| 7 | Ellen | Nikolaus | 50 | Jeff_Rolfson27@yahoo.com |
| 8 | Ruby | Cole | 24 | Mabel_Hagenes-Runolfsdottir@gmail.com |
| 9 | Miriam | Grimes | 54 | Tracy88@yahoo.com |
| 10 | Rene | McClure | 25 | Charlie.Howell@hotmail.com |
| 11 | Carole | Bechtelar | 50 | Keyon_Legros@hotmail.com |
| 12 | Kevin | Bayer | 21 | Bethany.Franey78@hotmail.com |
| 13 | Edna | Schultz | 27 | Vernice20@yahoo.com |
| 14 | Latoya | Leuschke | 27 | Lindsey.Runolfsdottir@yahoo.com |
| 15 | Wade | Wisozk | 20 | Enrique84@hotmail.com |
| 16 | Kari | Nitzsche | 42 | Bridgette.Kris@gmail.com |
| 17 | Clara | Kassulke | 49 | Tom50@hotmail.com |
| 18 | Johnny | D'Amore | 41 | Mary_Gulgowski@hotmail.com |
| 19 | Elsa | Volkman | 46 | Rose65@hotmail.com |
const { t } = useI18n("table")
const [pagination, setPagination] = useState<PaginationState>({
pageIndex: 0,
pageSize: 20,
})
const rowCount = 40
const defaultData = useMemo<Data[]>(() => createTableData(rowCount), [])
const data = useMemo<Data[]>(
() =>
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 | Connie | Ziemann | 23 | Terry.Fay@hotmail.com |
| 1 | Angel | Ziemann | 19 | Deborah64@gmail.com |
| 2 | Ervin | Hand | 56 | Zachary32@gmail.com |
| 3 | Felicia | Botsford | 50 | Mafalda_Weissnat@yahoo.com |
| 4 | Gertrude | Hermann | 21 | Tiffany59@yahoo.com |
| 5 | Obie | D'Amore | 54 | Doug19@gmail.com |
| 6 | Osvaldo | Collier | 35 | Orlando_Becker82@hotmail.com |
| 7 | Roman | Kihn | 24 | Gilberto43@gmail.com |
| 8 | Beth | Prosacco | 23 | Florence_Ward28@yahoo.com |
| 9 | Gabriel | Anderson | 55 | Jerad_Rodriguez@hotmail.com |
| 10 | Frederick | Upton | 58 | Juanita_Ullrich70@hotmail.com |
| 11 | Maxine | West | 51 | Katrina_Bernhard89@yahoo.com |
| 12 | Terrence | Cremin | 64 | Lauretta.McCullough66@yahoo.com |
| 13 | Estefania | Deckow | 55 | Stanley.Gibson45@gmail.com |
| 14 | Jillian | Strosin | 23 | Santa.Bode24@gmail.com |
| 15 | Lora | Wilkinson | 53 | Brigitte23@yahoo.com |
| 16 | Christy | Rodriguez | 55 | Ernestine_Beier95@yahoo.com |
| 17 | Damon | Johnson | 62 | Theresia.Spinka16@yahoo.com |
| 18 | Dortha | Mertz | 42 | Bernadette_Legros@gmail.com |
| 19 | Axel | Halvorson | 20 | Rickey.Dach-Spencer@hotmail.com |
const [pagination, setPagination] = useState<PaginationState>({
pageIndex: 0,
pageSize: 20,
})
const { t } = useI18n("table")
const data = useMemo<Data[]>(() => 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 | Americo | Cruickshank | 44 | Toby.McCullough27@gmail.com | |
| 1 | Coleman | Daugherty | 42 | Meredith44@yahoo.com | |
| 2 | Maritza | Friesen | 21 | Ed_Hammes@gmail.com | |
| 3 | Deanna | Lehner | 39 | Harold.Franey55@gmail.com | |
| 4 | Vicenta | Cole | 34 | Maurice_Kuphal10@gmail.com | |
| 5 | Ernest | Miller-Witting | 19 | Josefina_Walsh55@yahoo.com | |
| 6 | Virginia | Hane | 27 | Cole.Waelchi13@hotmail.com | |
| 7 | Josephine | Frami | 54 | Duane_Medhurst69@gmail.com | |
| 8 | Kaci | Bartell | 53 | Maxwell_Blick@hotmail.com | |
| 9 | Hosea | Mayert | 44 | Trevion4@gmail.com |
const data = useMemo<Data[]>(() => createTableData(), [])
return <Table columns={columns} data={data} enableRowSelection withScrollArea />
デフォルトの選択された行を設定する
デフォルトの選択された行を設定する場合は、defaultRowSelectionにdataのインデックスをキーとしたオブジェクトを設定します。
| id | firstName | lastName | age | ||
|---|---|---|---|---|---|
| 0 | Elmore | Johnson | 56 | Kara2@hotmail.com | |
| 1 | Raphael | Larkin | 45 | Jorge2@gmail.com | |
| 2 | Stacey | Stoltenberg | 39 | Rod15@hotmail.com | |
| 3 | Zoila | Schowalter | 26 | Allen.Langosh38@yahoo.com | |
| 4 | Noe | Rippin | 54 | Mark82@gmail.com | |
| 5 | Alice | Connelly | 45 | Leon.Pfeffer84@hotmail.com | |
| 6 | Mozell | Hayes | 46 | Rafael_Emmerich@gmail.com | |
| 7 | Skyla | Hayes | 24 | Megan_Bechtelar@hotmail.com | |
| 8 | Laura | Bosco | 51 | Heidi_Littel43@hotmail.com | |
| 9 | Gloria | Johnson | 61 | Ismael_Crona@gmail.com |
const data = useMemo<Data[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableRowSelection
defaultRowSelection={{ 0: true }}
withScrollArea
/>
)
行のクリックで選択を有効にする
行のクリックで選択を有効にする場合は、selectOnClickRowをtrueに設定します。デフォルトは、falseです。
| id | firstName | lastName | age | ||
|---|---|---|---|---|---|
| 0 | Consuelo | Rempel | 61 | Telly.Johnson85@yahoo.com | |
| 1 | Reuben | Marquardt | 51 | Debbie63@hotmail.com | |
| 2 | Agustin | Glover | 59 | Lamar.Braun-Lynch@yahoo.com | |
| 3 | Chanel | Zboncak | 61 | Orion_VonRueden@gmail.com | |
| 4 | Lawrence | Lemke | 28 | Rocio11@gmail.com | |
| 5 | Celine | Hammes | 36 | Ludie49@hotmail.com | |
| 6 | Tamara | Frami | 22 | Leah_Ruecker@hotmail.com | |
| 7 | Steve | Hills | 35 | Jennifer25@yahoo.com | |
| 8 | Cesar | Barton | 61 | Percy.Hilpert19@gmail.com | |
| 9 | Bianka | Runolfsson | 29 | Demarco_Johns31@hotmail.com |
const data = useMemo<Data[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableRowSelection
selectOnClickRow
withScrollArea
/>
)
チェックボックスを非表示にする
チェックボックスを非表示にする場合は、withCheckboxをfalseに設定します。デフォルトは、trueです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Florence | Considine | 47 | Lawrence85@gmail.com |
| 1 | Davin | Goodwin | 63 | Kathlyn.Hackett@gmail.com |
| 2 | Dino | Steuber | 23 | Roosevelt.Collier@hotmail.com |
| 3 | Lorene | DuBuque | 43 | Clint48@gmail.com |
| 4 | Carla | Barrows | 41 | Toby.Prohaska@hotmail.com |
| 5 | Owen | Jakubowski | 52 | Joanie.Schowalter62@yahoo.com |
| 6 | Sophie | Denesik | 23 | Dianna.Hessel55@gmail.com |
| 7 | Jarret | Kirlin | 30 | Dewitt.Price7@hotmail.com |
| 8 | Colt | Funk | 48 | Christy49@gmail.com |
| 9 | Roel | Jones | 43 | Gabriel_Beier39@yahoo.com |
const data = useMemo<Data[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableRowSelection
selectOnClickRow
withCheckbox={false}
withScrollArea
/>
)
行を無効にする
行を無効にする場合は、enableRowSelectionに条件の関数を設定します。
| id | firstName | lastName | age | ||
|---|---|---|---|---|---|
| 0 | Santino | Maggio | 55 | Charley.Thompson@hotmail.com | |
| 1 | Gregg | Weimann | 50 | Teri_Green@gmail.com | |
| 2 | Theresa | Wehner | 60 | Zackary64@gmail.com | |
| 3 | Eduardo | Dicki | 49 | Harmony94@gmail.com | |
| 4 | Marsha | Marvin | 35 | Carlton73@yahoo.com | |
| 5 | Johnny | Weissnat | 21 | Joaquin_Block84@gmail.com | |
| 6 | Wilma | Larson | 35 | Theo_Mante@gmail.com | |
| 7 | Jacquelyn | Hayes | 27 | Nettie54@yahoo.com | |
| 8 | Gustavo | Wolf | 39 | Shannon_Quigley61@gmail.com | |
| 9 | Lisa | Kub | 55 | Chadrick.Pollich-Feil66@yahoo.com |
const data = useMemo<Data[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableRowSelection={(row) => row.id !== "1"}
withScrollArea
/>
)
"use client"をファイルの上部に追加する必要があります。行の選択を制御する
| id | firstName | lastName | age | ||
|---|---|---|---|---|---|
| 0 | Patience | Franecki | 35 | Ricky8@hotmail.com | |
| 1 | Ola | Bayer | 36 | Ronnie98@hotmail.com | |
| 2 | Antonia | Ratke | 40 | Eriberto35@yahoo.com | |
| 3 | Leah | Larkin | 42 | Oceane_Vandervort79@yahoo.com | |
| 4 | Paulette | Wolff | 19 | Brock.Tremblay58@gmail.com | |
| 5 | Fernando | Kreiger | 23 | Mattie.Rempel@hotmail.com | |
| 6 | Piper | Mayer | 40 | Marta87@hotmail.com | |
| 7 | Amber | Okuneva | 18 | Carmine.Wiegand2@hotmail.com | |
| 8 | Courtney | Schiller | 51 | Misty54@gmail.com | |
| 9 | Doris | Crona | 63 | Wendy.Schmitt96@gmail.com |
const [rowSelection, setRowSelection] = useState<RowSelectionState>({})
const data = useMemo<Data[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableRowSelection
rowSelection={rowSelection}
onRowSelectionChange={setRowSelection}
withScrollArea
/>
)
"use client"をファイルの上部に追加する必要があります。フィルターを使う
フィルターを使う場合は、フィルターをコントロールするコンポーネントをheaderまたはfooterに設定します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Harmon | Boyle | 59 | Manuela_Mayer2@yahoo.com |
| 1 | Mateo | Harris | 44 | Cicero.Lehner96@hotmail.com |
| 2 | Sammie | Terry | 31 | Meredith_Mosciski@yahoo.com |
| 3 | Shayna | Bednar | 45 | Brycen.Klein60@gmail.com |
| 4 | Gia | Lind | 37 | Akeem.Hand@gmail.com |
| 5 | Garrett | Berge | 30 | Jason67@gmail.com |
| 6 | Kent | Luettgen | 33 | Kathleen75@hotmail.com |
| 7 | Enrique | Hirthe-Kling | 32 | Robert_Stehr@gmail.com |
| 8 | Dennis | Schamberger | 38 | Darrel.Gulgowski@hotmail.com |
| 9 | Julius | Gulgowski | 27 | Earnest3@hotmail.com |
const data = useMemo<Data[]>(() => createTableData(), [])
return (
<VStack>
<Table
columns={columns}
data={data}
header={(table) => {
const value =
(table.getColumn("email")?.getFilterValue() as string | undefined) ??
""
return (
<InputGroup.Root>
<InputGroup.Element>
<SearchIcon />
</InputGroup.Element>
<Input
placeholder="Filter emails"
value={value}
onChange={(ev) =>
table.getColumn("email")?.setFilterValue(ev.target.value)
}
/>
</InputGroup.Root>
)
}}
withScrollArea
/>
</VStack>
)
"use client"をファイルの上部に追加する必要があります。デフォルトのフィルターを設定する
デフォルトのフィルターを設定する場合は、defaultColumnFiltersに配列を設定します。配列のオブジェクトには、フィルターする列のidと値を設定します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Salma | Kling | 61 | Lorena.Armstrong45@gmail.com |
| 4 | Bert | Conn | 65 | Turner_Johns19@gmail.com |
| 9 | Keeley | Connelly | 26 | Darin.Bosco@gmail.com |
const data = useMemo<Data[]>(() => 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 | Brooke | Simonis | 42 | Aliya.Hilll66@gmail.com |
| 1 | Darwin | O'Conner | 56 | Fern.Koch32@gmail.com |
| 2 | Krystina | Labadie | 62 | Santos.Welch@hotmail.com |
| 3 | Mauricio | Collier | 60 | Irma67@gmail.com |
| 4 | Clint | Gutmann | 33 | Oscar.Kuvalis91@hotmail.com |
| 5 | Eunice | Lemke | 30 | Gerald95@hotmail.com |
| 6 | Travis | Jerde | 39 | Sofia98@hotmail.com |
| 7 | Ezekiel | Daniel | 47 | Yvonne_Kreiger71@hotmail.com |
| 8 | Samara | Anderson | 37 | Reta.Lebsack66@hotmail.com |
| 9 | Eric | Murray-Schroeder | 31 | Lukas_Schmeler@yahoo.com |
const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([
{ id: "email", value: "" },
])
const data = useMemo<Data[]>(() => 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 | Lila | Rau | 58 | Shelley81@yahoo.com |
| 1 | Mckenna | Bailey | 25 | Kim.Kshlerin41@gmail.com |
| 2 | Eldred | Miller | 57 | Sherry.Hackett76@hotmail.com |
| 3 | Cecile | Kohler | 33 | Dayana_Willms@hotmail.com |
| 4 | Skye | Conroy | 25 | Arlene.Altenwerth93@gmail.com |
| 5 | Noemy | Beer | 65 | Edwin.Thompson80@yahoo.com |
| 6 | Harold | Pfeffer | 39 | Noah.Rath@yahoo.com |
| 7 | Kristi | Kshlerin | 56 | Wilfred_Upton-Huel50@gmail.com |
| 8 | Lauren | Crooks | 27 | Janelle41@hotmail.com |
| 9 | Lora | Erdman | 43 | Marguerite92@yahoo.com |
const data = useMemo<Data[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableColumnResizing
withBorder
withColumnBorders
/>
)
列のサイズ変更の方法を変更する
デフォルトでは、列のサイズ変更のタイミングは、ドラッグしている間に変更されます。ドラッグが終わったときに変更する場合は、columnResizeModeに"onEnd"を設定します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Carolyn | Runte | 30 | Ramon38@gmail.com |
| 1 | Wilma | Ullrich | 56 | Wilbert.Schimmel@gmail.com |
| 2 | Delia | Hintz | 49 | Brad53@gmail.com |
| 3 | Tracey | Sawayn | 34 | Kathy_Reynolds4@hotmail.com |
| 4 | Doris | Ullrich | 63 | Josue.Wolf@yahoo.com |
| 5 | Ona | Wisoky-Abbott | 58 | May40@hotmail.com |
| 6 | Lila | Maggio | 23 | Jedediah.Kunde@yahoo.com |
| 7 | Ricardo | Jaskolski | 60 | Bertha7@hotmail.com |
| 8 | Clark | Douglas-Schulist | 27 | Madeline94@hotmail.com |
| 9 | Shyanne | McGlynn | 60 | Patsy_Huels-Fadel74@gmail.com |
const data = useMemo<Data[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableColumnResizing
columnResizeMode="onEnd"
withBorder
withColumnBorders
/>
)
Props
アクセシビリティ
Tableは、アクセシビリティに関してWAI-ARIA - Table Patternに従います。
tablePropsにaria-labelを設定すると、スクリーンリーダーによって読み上げられます。
const data = useMemo<Data[]>(() => 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 | 列が昇順の場合は"昇順でソートする"を設定し、降順の場合は"降順でソートする"を設定、指定がない場合は"ソートを解除する"を設定します。 |
類似のコンポーネント
Stat
Statは、数値やデータをボックス内に表示するために使用されます。
NativeTable
NativeTableは、データを効率的に整理して表示するコンポーネントです。
PieChart
PieChartは、複数のデータを比較するためのパイチャートを描画するコンポーネントです。
RadialChart
RadialChartは、複数のデータを比較するための放射状チャートを描画するコンポーネントです。
RadarChart
RadarChartは、複数のデータを比較するためのレーダーチャートを描画するコンポーネントです。
DonutChart
DonutChartは、複数のデータを比較するためのドーナツチャートを描画するコンポーネントです。
AreaChart
AreaChartは、複数のデータを比較するためのエリアチャートを描画するコンポーネントです。
ComposedChart
ComposedChartは、複数のデータを比較するための複合チャートを描画するコンポーネントです。