Table
Tableは、列のソートや行の選択やクリックイベント機能を備えたテーブルのコンポーネントです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Ari | Stanton | 55 | Andy.Mueller@gmail.com |
| 1 | Ezekiel | Kris | 59 | Sister.Klocko-Ziemann@yahoo.com |
| 2 | Effie | Wilkinson | 33 | Donavon97@yahoo.com |
| 3 | Gretchen | Koch | 40 | Candido80@hotmail.com |
| 4 | Ethelyn | Daniel | 60 | Jeramy.Hegmann@yahoo.com |
| 5 | Gennaro | Cruickshank | 41 | Ellis.Turner@yahoo.com |
| 6 | Cristopher | Fahey | 44 | Oliver84@gmail.com |
| 7 | Otilia | Shields | 30 | Arielle.Miller46@yahoo.com |
| 8 | Burdette | O'Kon-Lind | 54 | Era.Flatley@hotmail.com |
| 9 | Emmett | Turcotte | 22 | Sandrine34@hotmail.com |
interface Data {
id: string
age: number
email: string
firstName: string
lastName: string
}
const columnHelper = createColumnHelper<Data>()
const columns = useMemo(
() => [
columnHelper.accessor("id", { cellProps: { numeric: true } }),
columnHelper.accessor("firstName", { lineClamp: 1 }),
columnHelper.accessor("lastName", { lineClamp: 1 }),
columnHelper.accessor("age", { cellProps: { numeric: true } }),
columnHelper.accessor("email", { lineClamp: 1 }),
],
[],
)
const data = useMemo<Data[]>(
() =>
Array.from({ length: 10 }, (_, index) => ({
id: index.toString(),
age: faker.number.int({ max: 65, min: 18 }),
email: faker.internet.email(),
firstName: faker.person.firstName(),
lastName: faker.person.lastName(),
})),
[],
)
return <Table columns={columns} data={data} withScrollArea />
使い方
import { Table } from "@yamada-ui/react"
import { Table } from "@/components/ui"
import { Table } from "@workspaces/ui"
<Table />
Tableは、内部でtanstack-tableとNativeTableを使用しています。バリアントを変更する
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Vilma | Gleason | 26 | Nolan_Bednar18@yahoo.com |
| 1 | Blanche | Harvey | 58 | Dario.Skiles@hotmail.com |
| 2 | Megane | Stokes | 32 | Tatyana80@gmail.com |
| 3 | Freida | Hickle | 40 | Madyson.Keeling@yahoo.com |
| 4 | Rodolfo | Blanda | 25 | Quinten7@gmail.com |
| 5 | Jalon | Koch | 24 | Tremayne53@gmail.com |
| 6 | Ann | Gibson | 24 | Raquel_Lebsack@yahoo.com |
| 7 | Reymundo | Moore | 19 | Tom_OReilly65@gmail.com |
| 8 | Jaren | Borer | 31 | Marie82@hotmail.com |
| 9 | Mallory | Runte | 53 | Ocie.Collins28@hotmail.com |
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Vilma | Gleason | 26 | Nolan_Bednar18@yahoo.com |
| 1 | Blanche | Harvey | 58 | Dario.Skiles@hotmail.com |
| 2 | Megane | Stokes | 32 | Tatyana80@gmail.com |
| 3 | Freida | Hickle | 40 | Madyson.Keeling@yahoo.com |
| 4 | Rodolfo | Blanda | 25 | Quinten7@gmail.com |
| 5 | Jalon | Koch | 24 | Tremayne53@gmail.com |
| 6 | Ann | Gibson | 24 | Raquel_Lebsack@yahoo.com |
| 7 | Reymundo | Moore | 19 | Tom_OReilly65@gmail.com |
| 8 | Jaren | Borer | 31 | Marie82@hotmail.com |
| 9 | Mallory | Runte | 53 | Ocie.Collins28@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<VStack>
<For each={["line", "outline"]}>
{(variant, index) => (
<Table
key={index}
variant={variant}
columns={columns}
data={data}
withScrollArea
/>
)}
</For>
</VStack>
)
サイズを変更する
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Kirsten | Fay | 41 | Rhonda_Yundt@gmail.com |
| 1 | Norene | Jacobs | 20 | Catharine_Hirthe95@gmail.com |
| 2 | Luna | Ebert | 50 | Buck_Abbott@gmail.com |
| 3 | Leilani | Bashirian | 21 | Kennedy.Effertz@gmail.com |
| 4 | Clayton | Johns | 56 | Verlie.Bins2@yahoo.com |
| 5 | Melyna | Pfannerstill | 37 | Jonatan68@hotmail.com |
| 6 | Uriah | Wuckert | 64 | Elisha10@gmail.com |
| 7 | Mekhi | Gleichner | 47 | Irwin_Koch@yahoo.com |
| 8 | Hester | Johns | 61 | Misty.Dibbert85@yahoo.com |
| 9 | Sabrina | Rolfson | 26 | Omer94@hotmail.com |
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Kirsten | Fay | 41 | Rhonda_Yundt@gmail.com |
| 1 | Norene | Jacobs | 20 | Catharine_Hirthe95@gmail.com |
| 2 | Luna | Ebert | 50 | Buck_Abbott@gmail.com |
| 3 | Leilani | Bashirian | 21 | Kennedy.Effertz@gmail.com |
| 4 | Clayton | Johns | 56 | Verlie.Bins2@yahoo.com |
| 5 | Melyna | Pfannerstill | 37 | Jonatan68@hotmail.com |
| 6 | Uriah | Wuckert | 64 | Elisha10@gmail.com |
| 7 | Mekhi | Gleichner | 47 | Irwin_Koch@yahoo.com |
| 8 | Hester | Johns | 61 | Misty.Dibbert85@yahoo.com |
| 9 | Sabrina | Rolfson | 26 | Omer94@hotmail.com |
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Kirsten | Fay | 41 | Rhonda_Yundt@gmail.com |
| 1 | Norene | Jacobs | 20 | Catharine_Hirthe95@gmail.com |
| 2 | Luna | Ebert | 50 | Buck_Abbott@gmail.com |
| 3 | Leilani | Bashirian | 21 | Kennedy.Effertz@gmail.com |
| 4 | Clayton | Johns | 56 | Verlie.Bins2@yahoo.com |
| 5 | Melyna | Pfannerstill | 37 | Jonatan68@hotmail.com |
| 6 | Uriah | Wuckert | 64 | Elisha10@gmail.com |
| 7 | Mekhi | Gleichner | 47 | Irwin_Koch@yahoo.com |
| 8 | Hester | Johns | 61 | Misty.Dibbert85@yahoo.com |
| 9 | Sabrina | Rolfson | 26 | Omer94@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<VStack>
<For each={["sm", "md", "lg"]}>
{(size, index) => (
<Table
key={index}
size={size}
columns={columns}
data={data}
withScrollArea
/>
)}
</For>
</VStack>
)
カラースキームを変更する
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Ewald | Lubowitz | 35 | Alvena72@yahoo.com |
| 1 | Darrion | Adams | 21 | Mamie_Harris@hotmail.com |
| 2 | Madeline | Predovic | 43 | Timmothy_Kunde@gmail.com |
| 3 | Dion | Walsh | 28 | Merlin43@yahoo.com |
| 4 | Orlando | Ledner | 63 | May.Dickinson@hotmail.com |
| 5 | Frieda | Auer | 32 | Reese.Smith9@hotmail.com |
| 6 | Byron | D'Amore | 49 | Genevieve86@hotmail.com |
| 7 | Josianne | Olson | 59 | Jennings_Harber72@gmail.com |
| 8 | Fabian | Sanford | 32 | Efrain.Wolf@yahoo.com |
| 9 | Jaylon | Moen | 62 | Eleonore_Shanahan91@gmail.com |
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Ewald | Lubowitz | 35 | Alvena72@yahoo.com |
| 1 | Darrion | Adams | 21 | Mamie_Harris@hotmail.com |
| 2 | Madeline | Predovic | 43 | Timmothy_Kunde@gmail.com |
| 3 | Dion | Walsh | 28 | Merlin43@yahoo.com |
| 4 | Orlando | Ledner | 63 | May.Dickinson@hotmail.com |
| 5 | Frieda | Auer | 32 | Reese.Smith9@hotmail.com |
| 6 | Byron | D'Amore | 49 | Genevieve86@hotmail.com |
| 7 | Josianne | Olson | 59 | Jennings_Harber72@gmail.com |
| 8 | Fabian | Sanford | 32 | Efrain.Wolf@yahoo.com |
| 9 | Jaylon | Moen | 62 | Eleonore_Shanahan91@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 | Marlin | Labadie | 41 | Camila.Lang94@gmail.com |
| 1 | Chanelle | Ritchie | 54 | Jaclyn.Harber@hotmail.com |
| 2 | Adrien | Runte | 33 | Salvador_Stracke-Connelly@hotmail.com |
| 3 | Tillman | Cormier-Zemlak | 41 | Vance96@yahoo.com |
| 4 | Clovis | Jacobson | 26 | Wendy_Orn@hotmail.com |
| 5 | Ubaldo | Bruen | 53 | Paolo.Franecki1@hotmail.com |
| 6 | Freda | Bergnaum | 53 | Holly_Predovic91@gmail.com |
| 7 | Gabe | Zulauf-Pollich | 43 | Marisol_Tromp@gmail.com |
| 8 | Lou | Casper | 41 | Levi_Schmeler@hotmail.com |
| 9 | Bertrand | Rosenbaum-Bruen | 48 | Kyla49@yahoo.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} withBorder withScrollArea />
列の区切り線を追加する
列の区切り線を追加する場合は、withColumnBordersをtrueにします。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Breana | Watsica | 42 | Rogelio47@hotmail.com |
| 1 | Wilhelmine | Greenfelder | 37 | Kavon.Veum24@hotmail.com |
| 2 | Francis | Roberts | 33 | Santino_Funk@yahoo.com |
| 3 | Zack | Purdy | 24 | Leonardo_Ondricka64@gmail.com |
| 4 | Mackenzie | Stark | 60 | Mariane93@yahoo.com |
| 5 | Dakota | Brown | 39 | Carley.Heathcote@gmail.com |
| 6 | Amira | Macejkovic | 33 | Matilde.Goldner66@gmail.com |
| 7 | Michel | Cremin | 46 | Josue.Breitenberg34@gmail.com |
| 8 | Bret | Hamill | 52 | Mariela.Kovacek@gmail.com |
| 9 | Sydney | Sawayn | 49 | Dariana14@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} withColumnBorders withScrollArea />
行がホバーされたときにハイライトする
行がホバーされたときにハイライトする場合は、highlightOnHoverをtrueにします。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Rico | Bechtelar | 64 | Estrella_Kihn@hotmail.com |
| 1 | Adonis | Gulgowski | 47 | Lonie86@hotmail.com |
| 2 | Marcellus | Mante | 24 | Raquel.Bartell51@hotmail.com |
| 3 | Mattie | Kilback | 33 | Clovis60@hotmail.com |
| 4 | Jenifer | Willms | 52 | Celestino65@hotmail.com |
| 5 | Novella | Crooks | 63 | Raegan.Stehr27@yahoo.com |
| 6 | Joan | Schmeler | 47 | Marcel.Collins-Ernser@gmail.com |
| 7 | Destiny | Fisher | 60 | Vada15@hotmail.com |
| 8 | Joe | Altenwerth | 27 | Cali_Heathcote@gmail.com |
| 9 | Kaylee | Ernser | 22 | Clayton.Terry19@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} highlightOnHover withScrollArea />
ストライプを使う
ストライプを使う場合は、stripedをtrueにします。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Bernita | Dicki | 26 | Shayna_Raynor@yahoo.com |
| 1 | Kraig | Roob | 28 | Deanna17@gmail.com |
| 2 | Norval | Parker | 21 | Sheila86@gmail.com |
| 3 | Roberta | Johns | 31 | Coleman_Huel@gmail.com |
| 4 | Archie | Ziemann | 38 | Freida.Boyer98@yahoo.com |
| 5 | Modesto | Schumm | 62 | Drew.Altenwerth85@hotmail.com |
| 6 | Shanon | Aufderhar | 37 | Keanu32@yahoo.com |
| 7 | Kiel | Hagenes | 51 | Gregory.Smith15@gmail.com |
| 8 | Valentine | Wolff | 28 | Ayla51@gmail.com |
| 9 | Rebekah | Koelpin | 42 | Casey_Thompson@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} striped withScrollArea />
スクロールエリアを使う
スクロールエリアを使う場合は、withScrollAreaをtrueにします。
| id | firstName | lastName | age | phone | role | status | createdAt | updatedAt | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | Timmothy | Bartoletti | 45 | Alva56@hotmail.com | 506-573-7304 x6266 | user | active | 1/1/2026 | 11/21/2025 |
| 1 | Micah | Cronin | 28 | Yesenia95@hotmail.com | 380-596-1985 x0767 | user | active | 3/29/2026 | 10/10/2025 |
| 2 | Lucas | Schmeler | 30 | Alisa13@yahoo.com | (895) 752-1284 | user | inactive | 6/4/2026 | 5/16/2026 |
| 3 | Giovanna | Wehner | 19 | Braden91@gmail.com | 532.891.1767 x1471 | admin | inactive | 6/21/2026 | 7/7/2026 |
| 4 | Terrence | Quigley | 24 | Darrell_Waelchi@hotmail.com | 693-769-3292 x66319 | user | inactive | 5/24/2026 | 7/6/2026 |
| 5 | Odell | O'Reilly | 26 | Robert48@hotmail.com | 292.785.7362 x383 | admin | active | 12/5/2025 | 8/25/2026 |
| 6 | Ricky | Mraz | 42 | Ryan41@gmail.com | 1-860-717-2885 x554 | admin | inactive | 12/18/2025 | 1/18/2026 |
| 7 | Jayda | Thompson | 52 | Laurie.Waelchi99@hotmail.com | 931-950-5660 x1394 | admin | active | 1/26/2026 | 6/13/2026 |
| 8 | Callie | Hintz | 51 | Ed_Gleichner43@gmail.com | 1-488-649-6050 | user | inactive | 1/8/2026 | 10/16/2025 |
| 9 | Leilani | Walsh | 48 | Anibal_Bednar@gmail.com | (827) 432-3529 x1811 | user | inactive | 2/16/2026 | 11/27/2025 |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columnsFull} data={data} withScrollArea />
ヘッダーグループ
| id | user | |||
|---|---|---|---|---|
| name | age | |||
| firstName | lastName | |||
| 0 | Tess | Will | 54 | Ralph60@yahoo.com |
| 1 | Kaleigh | Russel | 50 | Donato_Ruecker37@yahoo.com |
| 2 | Elissa | Macejkovic | 65 | Dino.Nolan1@gmail.com |
| 3 | Zena | Swaniawski | 33 | Tricia_Torphy23@gmail.com |
| 4 | Martine | Rippin | 36 | Elliot50@gmail.com |
| 5 | Kattie | Terry | 41 | Reed_Mohr@gmail.com |
| 6 | Kyla | Wilderman | 29 | Hailee55@yahoo.com |
| 7 | Quinton | Murazik | 36 | Alek.Oberbrunner@gmail.com |
| 8 | Sincere | Kilback | 39 | Carolyn_Metz86@hotmail.com |
| 9 | Johan | West | 64 | Hettie_Steuber57@hotmail.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 | Tommy | Kiehn | 58 | Avis_Murazik37@hotmail.com |
| 1 | Talia | Hand | 58 | Corbin.Stroman7@hotmail.com |
| 2 | Tyrone | Casper | 21 | Roxane_Kuhn@hotmail.com |
| 3 | Zion | Boyle | 49 | Keyshawn_Bartoletti@hotmail.com |
| 4 | Glenna | Jaskolski | 21 | Phoebe.Roberts@yahoo.com |
| 5 | Sigrid | Bartoletti | 34 | Laisha.Lang@yahoo.com |
| 6 | Nestor | Haag | 55 | Kyla_Schmeler80@gmail.com |
| 7 | Sarina | Boehm | 61 | Rashawn_Glover66@hotmail.com |
| 8 | Pete | Jenkins | 36 | Hudson24@yahoo.com |
| 9 | Peyton | Jenkins | 30 | Darian_Muller@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 | Nicola | Mayert | 52 | Jody_Reichert8@gmail.com |
| 1 | Reid | Davis | 38 | Katarina_Koch88@gmail.com |
| 2 | Nash | Hane-Heidenreich | 34 | Eulalia_Rowe46@gmail.com |
| 3 | Tatyana | Gleason | 35 | Abbey_Kiehn47@yahoo.com |
| 4 | Jada | Kertzmann | 19 | Tyra62@gmail.com |
| 5 | Ernestina | Leuschke | 48 | Angelina57@yahoo.com |
| 6 | Quinten | Flatley | 19 | Keanu_Shanahan@yahoo.com |
| 7 | Yesenia | Senger | 45 | Weldon_Osinski@hotmail.com |
| 8 | Robb | Hudson | 20 | Jeanette.Lehner49@hotmail.com |
| 9 | Brenda | Metz | 36 | Alberta74@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 | Clarence | Flatley | 18 | Santos_Roob25@hotmail.com |
| 1 | Demarco | Abbott | 25 | Katherine_Zulauf41@yahoo.com |
| 2 | Waylon | Schmidt | 27 | Maybell_Marquardt@hotmail.com |
| 3 | Candace | Flatley-Schuster | 61 | Josianne.Gleichner39@gmail.com |
| 4 | Bennett | Heathcote | 64 | Emmett38@hotmail.com |
| 5 | Joanne | Emard | 48 | Afton80@yahoo.com |
| 6 | Miranda | Lueilwitz | 42 | Conor_Huel@gmail.com |
| 7 | Reinhold | Grant | 45 | Jacob.Kuphal89@yahoo.com |
| 8 | Lionel | King | 45 | Erma_Becker@yahoo.com |
| 9 | Ova | Streich | 28 | Jensen30@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
initialFocusableCell={{ colIndex: 1, rowIndex: 0 }}
withScrollArea
/>
)
行のクリックイベントをハンドルする
行のクリックイベントをハンドルする場合は、onRowClickを使用します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Daniella | Zulauf | 45 | Vincenza2@yahoo.com |
| 1 | Jeanette | Hessel | 24 | Michael.Franey@gmail.com |
| 2 | Russ | Dickinson | 38 | Abbie6@gmail.com |
| 3 | Marcelle | Ledner-Zemlak | 50 | Candido88@yahoo.com |
| 4 | Darwin | MacGyver | 19 | Jerrod.Morar@hotmail.com |
| 5 | Jerrell | Koepp | 64 | Christie_McClure89@yahoo.com |
| 6 | Elroy | Maggio | 41 | Jaylen32@hotmail.com |
| 7 | Fausto | Kozey | 55 | Grace.Huels@gmail.com |
| 8 | Carroll | Bergnaum | 18 | Fidel_Koch92@hotmail.com |
| 9 | Clair | Smith | 44 | Fabian_Okuneva@hotmail.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 | Angeline | Hickle | 20 | Berry.Quigley2@yahoo.com |
| 1 | Amani | Monahan | 49 | Geraldine83@yahoo.com |
| 2 | Trace | Schoen | 18 | Electa73@yahoo.com |
| 3 | Myles | Mitchell | 20 | Hilbert.Bernhard@gmail.com |
| 4 | Presley | Rempel | 27 | Darrick.Waters93@yahoo.com |
| 5 | Floy | VonRueden | 19 | Mercedes.Muller41@yahoo.com |
| 6 | Alford | Kuhic-Jacobson | 34 | Magali_Zieme17@gmail.com |
| 7 | Gardner | Beatty | 65 | Myra_Wilkinson90@yahoo.com |
| 8 | Travon | Auer | 35 | Howard_Stamm@yahoo.com |
| 9 | Lorene | Walker-Rodriguez | 35 | Jaunita71@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 | |
|---|---|---|---|---|
| 1 | Dameon | Gottlieb | 64 | Sonya15@hotmail.com |
| 4 | Aniya | Franey | 63 | Wilbur37@yahoo.com |
| 5 | Garett | Rohan | 60 | Ollie.Dibbert@hotmail.com |
| 3 | Brielle | Connelly | 51 | Waino_Hills@hotmail.com |
| 6 | Anabel | Schumm | 49 | Darby_Schaden@hotmail.com |
| 7 | Rossie | Schamberger | 45 | Dandre_Lindgren-Armstrong@hotmail.com |
| 0 | Rossie | Senger | 42 | Wilson40@yahoo.com |
| 8 | Addie | Raynor | 32 | Jairo_Donnelly@hotmail.com |
| 2 | Aimee | Effertz | 22 | Carole.Beatty@gmail.com |
| 9 | Darrion | Towne | 19 | Darien_Conroy@yahoo.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
defaultSorting={[{ id: "age", desc: true }]}
withScrollArea
/>
)
ソートを無効にする
ソートを無効にする場合は、enableSortingをfalseに設定します。デフォルトは、trueです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Tom | Hilll | 40 | Alf_Dare45@hotmail.com |
| 1 | Daryl | Kertzmann | 36 | Odie86@gmail.com |
| 2 | Hubert | Braun | 57 | Jovany_Turner@yahoo.com |
| 3 | Bailey | Keebler-Stracke | 23 | Ubaldo_Armstrong-Koelpin81@hotmail.com |
| 4 | Paolo | Dickens | 35 | Christiana_Boyle-Bogan16@gmail.com |
| 5 | Karl | Rogahn | 64 | Russel77@gmail.com |
| 6 | Tyson | Bernier | 36 | Milan59@gmail.com |
| 7 | Rebeka | Mohr | 32 | Ari_Leuschke@hotmail.com |
| 8 | Sabryna | Heller | 40 | Sara59@hotmail.com |
| 9 | Fannie | Tillman | 37 | Liza.Trantow56@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table columns={columns} data={data} enableSorting={false} withScrollArea />
)
複数列のソートを無効にする
複数列のソートを無効にする場合は、enableMultiSortをfalseに設定します。デフォルトは、trueです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Olive | Bauch-Johnson | 47 | Eleanor_Cremin@gmail.com |
| 1 | Margaret | Spinka | 63 | Justice79@gmail.com |
| 2 | Pierre | O'Hara | 41 | Brenden.Feest@yahoo.com |
| 3 | Rodney | Bahringer | 47 | Cassidy_Volkman27@hotmail.com |
| 4 | Lesley | Wuckert | 46 | Murl_Rempel62@yahoo.com |
| 5 | Corene | Langworth | 54 | Lee45@gmail.com |
| 6 | Maegan | Doyle | 35 | Rosie.Spinka95@gmail.com |
| 7 | Dominic | Lebsack | 64 | Emanuel.Volkman@yahoo.com |
| 8 | Maverick | Goldner | 43 | Rosa_Mohr@gmail.com |
| 9 | Loren | Kris | 41 | Jaylen.Schultz@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table columns={columns} data={data} enableMultiSort={false} withScrollArea />
)
最大のソート可能な列数を設定する
最大のソート可能な列数を設定する場合は、maxMultiSortColCountに数値を設定します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Kenya | Braun | 65 | Reilly.Berge81@hotmail.com |
| 1 | Orville | Jaskolski | 18 | Marcos.Jones16@gmail.com |
| 2 | Keyon | Dickens | 51 | Coy.Gusikowski@hotmail.com |
| 3 | Ole | Kulas | 51 | Hoyt.Boyle@hotmail.com |
| 4 | Orville | McClure | 44 | Jocelyn_Von@gmail.com |
| 5 | Aida | Koch | 58 | Heloise_Conroy@gmail.com |
| 6 | Devan | Windler | 26 | Paulette57@hotmail.com |
| 7 | Lazaro | Buckridge | 29 | Norval_Greenfelder37@yahoo.com |
| 8 | Verlie | Kessler | 39 | Geo.Vandervort@yahoo.com |
| 9 | Jacynthe | Dare | 27 | Guido7@yahoo.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
maxMultiSortColCount={2}
withScrollArea
/>
)
手動のソートを使う
手動のソートを使う場合は、manualSortingをtrueに設定します。デフォルトは、falseです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Jackeline | Ankunding | 63 | Wilburn77@yahoo.com |
| 1 | Vicki | Gibson | 51 | Earnestine13@hotmail.com |
| 2 | Denise | Jaskolski | 59 | Kiarra24@yahoo.com |
| 3 | Ova | Dietrich | 19 | Liana.Rolfson27@hotmail.com |
| 4 | Johnnie | Mitchell | 30 | Lois_Schroeder53@yahoo.com |
| 5 | Isidro | Schneider | 61 | Clemmie.McKenzie63@gmail.com |
| 6 | Alvera | Watsica | 62 | Stephania.Spinka0@yahoo.com |
| 7 | Mike | Krajcik | 24 | Ebba.Beer@yahoo.com |
| 8 | Jedidiah | Gorczany | 19 | Cleve22@yahoo.com |
| 9 | Theron | Leffler | 26 | Darien_Dietrich9@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 | Calista | Russel | 23 | Tyrell51@gmail.com |
| 1 | Reinhold | Crona | 60 | Grace_Kub-Hilpert76@gmail.com |
| 2 | Keith | Reichert | 47 | Amya.Thiel7@hotmail.com |
| 3 | Jett | Kovacek | 27 | Hershel10@gmail.com |
| 4 | Dwayne | Miller | 60 | Eunice_Wyman-Kutch@gmail.com |
| 5 | Elissa | Simonis | 35 | Osborne.Beer@hotmail.com |
| 6 | Maud | Russel | 36 | Celia.McDermott-DuBuque@yahoo.com |
| 7 | Albert | Walker | 44 | Wendell.Predovic@yahoo.com |
| 8 | Felicia | Hudson | 65 | Selmer46@hotmail.com |
| 9 | Cole | Hand | 50 | Chadd_Watsica@yahoo.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} sortDescFirst withScrollArea />
ソートを制御する
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Leopoldo | Feeney | 38 | Edison52@yahoo.com |
| 1 | Rosanna | Windler | 31 | Gayle37@hotmail.com |
| 2 | Lexi | Yost-Blick | 64 | Ryley.Bosco@gmail.com |
| 3 | Jadon | Emmerich | 54 | Loma.Becker@hotmail.com |
| 4 | Jaiden | Weissnat | 20 | Jermaine68@hotmail.com |
| 5 | Merritt | Considine | 19 | Velda.Bode@gmail.com |
| 6 | Miles | Dickens | 24 | Ismael.Gerhold@gmail.com |
| 7 | Winnifred | Lueilwitz | 21 | Jamar53@gmail.com |
| 8 | Nelda | Padberg | 23 | Coty_Steuber@gmail.com |
| 9 | Hans | Lang | 25 | Kaylie.Koch@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 | Madeline | Rolfson | 52 | Presley.Hagenes-Heller94@yahoo.com |
| 1 | Hayden | Bartell | 50 | Melissa73@gmail.com |
| 2 | Myrtle | Oberbrunner-Stoltenberg | 45 | Art.Mitchell91@gmail.com |
| 3 | Roosevelt | Lakin | 57 | Ocie.Heathcote@hotmail.com |
| 4 | Julien | Hackett | 40 | Morton_Goldner51@hotmail.com |
| 5 | Penelope | Bruen-Marks | 57 | Lemuel94@gmail.com |
| 6 | Aron | Dickens | 48 | Ericka_Lehner75@hotmail.com |
| 7 | Kira | Fay | 41 | Clifton.Dooley@hotmail.com |
| 8 | Darrin | Breitenberg | 44 | Rashawn.Ullrich@yahoo.com |
| 9 | Toney | Raynor | 41 | Norris_Fritsch91@gmail.com |
| 10 | Leanna | Kling | 19 | Leanne68@yahoo.com |
| 11 | Stan | Von | 39 | Chauncey37@hotmail.com |
| 12 | Marion | Becker | 32 | Salvatore.Herzog@gmail.com |
| 13 | Libby | Fisher | 64 | Etha33@gmail.com |
| 14 | Loyal | Larkin | 27 | Ansel_Bradtke@hotmail.com |
| 15 | Ari | Lindgren | 26 | Ervin.Towne@hotmail.com |
| 16 | Scotty | Keebler | 60 | Loyce_Brakus@hotmail.com |
| 17 | Agnes | Hudson | 53 | Blanca_Rosenbaum@gmail.com |
| 18 | Mallory | Casper | 24 | Scot78@yahoo.com |
| 19 | Kristy | Rice | 56 | Angelina.Lakin@yahoo.com |
const { t } = useI18n("table")
const data = useMemo<TableData[]>(() => createTableData(40), [])
return (
<VStack>
<Table
columns={columns}
data={data}
enablePagination
footer={(table) => {
const page = table.getState().pagination.pageIndex + 1
const pageSize = table.getState().pagination.pageSize
const total = table.getPageCount()
return (
<Grid templateColumns="1fr 1fr 1fr" w="full">
<Pagination.Root
size={{ base: "sm", sm: "xs" }}
gridColumn="2 / 3"
page={page}
total={total}
onChange={(page) => table.setPageIndex(page - 1)}
/>
<Select.Root
size={{ base: "sm", sm: "xs" }}
aria-label={t("Page size")}
items={[
{ label: "10", value: "10" },
{ label: "20", value: "20" },
{ label: "30", value: "30" },
{ label: "40", value: "40" },
{ label: "50", value: "50" },
]}
value={pageSize.toString()}
rootProps={{ justifySelf: "end", w: "5xs" }}
onChange={(value) => table.setPageSize(Number(value))}
/>
</Grid>
)
}}
withScrollArea
/>
</VStack>
)
"use client"をファイルの上部に追加する必要があります。デフォルトのページインデックスとページサイズを設定する
デフォルトのページインデックスとページサイズを設定する場合は、defaultPaginationにオブジェクトを設定します。オブジェクトには、pageIndexとpageSizeを設定します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 10 | Patsy | Willms | 34 | Tommy_Keeling-Hills70@yahoo.com |
| 11 | Louvenia | Harvey | 51 | Freddie_Ankunding98@hotmail.com |
| 12 | Romaine | Labadie | 34 | Hermina.Bailey90@yahoo.com |
| 13 | Furman | Rosenbaum | 30 | Jeanette52@yahoo.com |
| 14 | Tad | Hegmann | 46 | Candida_Wiegand86@yahoo.com |
| 15 | Jaleel | Pollich | 30 | Delta8@hotmail.com |
| 16 | Mable | McCullough | 26 | Heath63@hotmail.com |
| 17 | Loyal | Grant | 62 | Jazmyne.Greenfelder@gmail.com |
| 18 | Alayna | Jenkins | 59 | Pearlie10@hotmail.com |
| 19 | Skyla | Bergnaum | 55 | Americo61@yahoo.com |
const { t } = useI18n("table")
const data = useMemo<TableData[]>(() => createTableData(20), [])
return (
<VStack>
<Table
columns={columns}
data={data}
enablePagination
defaultPagination={{ pageIndex: 1, pageSize: 10 }}
footer={(table) => {
const page = table.getState().pagination.pageIndex + 1
const pageSize = table.getState().pagination.pageSize
const total = table.getPageCount()
return (
<Grid templateColumns="1fr 1fr 1fr" w="full">
<Pagination.Root
size={{ base: "sm", sm: "xs" }}
gridColumn="2 / 3"
page={page}
total={total}
onChange={(page) => table.setPageIndex(page - 1)}
/>
<Select.Root
size={{ base: "sm", sm: "xs" }}
aria-label={t("Page size")}
items={[
{ label: "10", value: "10" },
{ label: "20", value: "20" },
{ label: "30", value: "30" },
{ label: "40", value: "40" },
{ label: "50", value: "50" },
]}
value={pageSize.toString()}
rootProps={{ justifySelf: "end", w: "5xs" }}
onChange={(value) => table.setPageSize(Number(value))}
/>
</Grid>
)
}}
withScrollArea
/>
</VStack>
)
"use client"をファイルの上部に追加する必要があります。手動のページネーションを使う
手動のページネーションを使う場合は、manualPaginationをtrueに設定します。デフォルトは、falseです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Gideon | Cummerata | 50 | Stefanie.Hermiston@yahoo.com |
| 1 | Bud | Jakubowski | 54 | Daija.Rice63@yahoo.com |
| 2 | Shaun | Schultz | 36 | Ryleigh_Greenfelder48@hotmail.com |
| 3 | Kariane | Keebler | 29 | Donnell.Keebler@yahoo.com |
| 4 | Karl | Bartoletti | 60 | Rafaela.Langworth59@hotmail.com |
| 5 | Marilie | Nader | 38 | Pat74@hotmail.com |
| 6 | Braxton | Pfannerstill | 54 | Jewell_Blick95@yahoo.com |
| 7 | Abe | Sanford | 61 | Eriberto_Hodkiewicz@hotmail.com |
| 8 | Gabriel | Langworth | 45 | Doris67@gmail.com |
| 9 | Jackson | Turcotte | 45 | Fabian_Maggio@yahoo.com |
| 10 | Rasheed | Rice | 47 | Julian86@gmail.com |
| 11 | Selena | Koepp | 62 | Jaden30@yahoo.com |
| 12 | Ralph | Kessler | 29 | Sheryl_Kiehn44@gmail.com |
| 13 | Ellie | Oberbrunner | 21 | Gardner87@yahoo.com |
| 14 | Isaiah | Hickle | 18 | Kristian93@yahoo.com |
| 15 | Shawna | Thiel | 60 | Maya_Schulist@hotmail.com |
| 16 | Milton | Powlowski | 50 | Aric_Schuster@hotmail.com |
| 17 | Caitlyn | Conn | 34 | Xzavier.Jast@gmail.com |
| 18 | Verda | Schaden | 50 | Damian_West@hotmail.com |
| 19 | Faith | Bogan | 40 | Sally_Wiza2@gmail.com |
const { t } = useI18n("table")
const [pagination, setPagination] = useState<PaginationState>({
pageIndex: 0,
pageSize: 20,
})
const rowCount = 40
const defaultData = useMemo<TableData[]>(() => createTableData(rowCount), [])
const data = useMemo<TableData[]>(
() =>
defaultData.slice(
pagination.pageIndex * pagination.pageSize,
(pagination.pageIndex + 1) * pagination.pageSize,
),
[defaultData, pagination],
)
return (
<VStack>
<Table
columns={columns}
data={data}
enablePagination
manualPagination
pagination={pagination}
rowCount={rowCount}
onPaginationChange={setPagination}
footer={(table) => {
const page = table.getState().pagination.pageIndex + 1
const pageSize = table.getState().pagination.pageSize
const total = table.getPageCount()
return (
<Grid templateColumns="1fr 1fr 1fr" w="full">
<Pagination.Root
size={{ base: "sm", sm: "xs" }}
gridColumn="2 / 3"
page={page}
total={total}
onChange={(page) => table.setPageIndex(page - 1)}
/>
<Select.Root
size={{ base: "sm", sm: "xs" }}
aria-label={t("Page size")}
items={[
{ label: "10", value: "10" },
{ label: "20", value: "20" },
{ label: "30", value: "30" },
{ label: "40", value: "40" },
{ label: "50", value: "50" },
]}
value={pageSize.toString()}
rootProps={{ justifySelf: "end", w: "5xs" }}
onChange={(value) => table.setPageSize(Number(value))}
/>
</Grid>
)
}}
withScrollArea
/>
</VStack>
)
"use client"をファイルの上部に追加する必要があります。ページネーションを制御する
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Daphne | Hoppe | 56 | Toy99@gmail.com |
| 1 | Chad | Rau-Ernser | 57 | Sidney_Klocko@gmail.com |
| 2 | Kareem | Stracke | 39 | Danielle_Klein@yahoo.com |
| 3 | Malcolm | Leffler | 39 | Charlie_Gleason@hotmail.com |
| 4 | Omar | West | 36 | Gerard.Considine6@yahoo.com |
| 5 | Chauncey | Boyer | 53 | Sage69@gmail.com |
| 6 | Eunice | Medhurst | 43 | Curtis.Effertz44@yahoo.com |
| 7 | Ambrose | Kreiger | 46 | Dixie59@yahoo.com |
| 8 | Vivian | Hammes | 52 | Theresa.Romaguera@gmail.com |
| 9 | Willie | Powlowski | 39 | Betsy72@gmail.com |
| 10 | Macy | Ullrich | 52 | Cleo.Hodkiewicz1@yahoo.com |
| 11 | Karianne | Heidenreich | 19 | Nadine_Macejkovic49@hotmail.com |
| 12 | Santino | Toy | 29 | Dagmar83@gmail.com |
| 13 | Skylar | Torphy | 55 | Marguerite58@yahoo.com |
| 14 | Humberto | Nienow-Ernser | 34 | Julian.Nikolaus47@yahoo.com |
| 15 | Golda | Yost | 42 | Axel.Miller@gmail.com |
| 16 | Virginie | Smitham | 60 | Melissa.Krajcik@hotmail.com |
| 17 | Kendra | Kerluke | 42 | Jackson87@yahoo.com |
| 18 | Crystal | Hodkiewicz | 43 | Colten57@gmail.com |
| 19 | Jaycee | Rempel | 39 | Lucia26@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 | Maryann | Kerluke | 38 | Ryder97@yahoo.com | |
| 1 | Ramona | Bode | 40 | Emmanuel.Baumbach33@yahoo.com | |
| 2 | Oliver | Cassin | 41 | Roberto99@gmail.com | |
| 3 | Viviane | Olson | 64 | Dock.Sauer47@gmail.com | |
| 4 | Salma | Zemlak | 34 | Pearl.Weissnat@gmail.com | |
| 5 | Elaine | Christiansen | 40 | Ezra.Yundt@hotmail.com | |
| 6 | Elenor | Bradtke | 56 | Wiley_Walter32@hotmail.com | |
| 7 | Tremayne | Fritsch | 40 | Bettie_Brown45@gmail.com | |
| 8 | Torey | Murazik | 48 | Stuart_Doyle@yahoo.com | |
| 9 | Dillan | Grant | 46 | Leonora92@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} enableRowSelection withScrollArea />
デフォルトの選択された行を設定する
デフォルトの選択された行を設定する場合は、defaultRowSelectionにdataのインデックスをキーとしたオブジェクトを設定します。
| id | firstName | lastName | age | ||
|---|---|---|---|---|---|
| 0 | Dameon | Bode | 41 | Ola99@yahoo.com | |
| 1 | Rodrick | Weber | 45 | Mary10@gmail.com | |
| 2 | Juwan | Schultz | 25 | Ramona_Beer@hotmail.com | |
| 3 | Kimberly | Lowe | 34 | Bria_Collier28@gmail.com | |
| 4 | Brandt | Prohaska | 53 | Kamille97@yahoo.com | |
| 5 | Rollin | Deckow | 39 | Jamar.Beer75@hotmail.com | |
| 6 | Nova | Padberg | 24 | Hugh_Osinski@yahoo.com | |
| 7 | Jaunita | Botsford | 18 | Josiane_Deckow75@gmail.com | |
| 8 | Morton | Wiegand | 47 | Christophe72@gmail.com | |
| 9 | Sincere | Skiles | 49 | Sam26@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableRowSelection
defaultRowSelection={{ 0: true }}
withScrollArea
/>
)
行のクリックで選択を有効にする
行のクリックで選択を有効にする場合は、selectOnClickRowをtrueに設定します。デフォルトは、falseです。
| id | firstName | lastName | age | ||
|---|---|---|---|---|---|
| 0 | Jaime | Brakus | 59 | Esta_Homenick@hotmail.com | |
| 1 | Erica | Jenkins | 54 | Shanon_OHara@yahoo.com | |
| 2 | Antonina | Wilkinson | 30 | Tabitha0@gmail.com | |
| 3 | Jeffrey | Beer | 45 | Sharon84@gmail.com | |
| 4 | Adelia | Yundt | 34 | Stephany.Considine@yahoo.com | |
| 5 | Kim | Raynor | 26 | Anne.Turcotte8@yahoo.com | |
| 6 | Cayla | Goldner | 43 | Michelle.Kub@gmail.com | |
| 7 | Lesly | Kuphal | 57 | Magdalena_Hagenes76@hotmail.com | |
| 8 | Victor | Lind | 40 | Teagan_Schowalter2@hotmail.com | |
| 9 | Jerel | Pagac | 29 | Crystal7@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableRowSelection
selectOnClickRow
withScrollArea
/>
)
チェックボックスを非表示にする
チェックボックスを非表示にする場合は、withCheckboxをfalseに設定します。デフォルトは、trueです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Noemie | Mitchell | 30 | Cara.Labadie@hotmail.com |
| 1 | Foster | Weissnat | 49 | Marlene72@gmail.com |
| 2 | Emanuel | Bode | 34 | Cathrine.Herzog14@yahoo.com |
| 3 | Selina | McLaughlin | 51 | Rosario.Moore@yahoo.com |
| 4 | Kailyn | Gerlach | 47 | Jarred.Barrows1@gmail.com |
| 5 | Georgianna | O'Conner | 42 | Martina.Hansen@gmail.com |
| 6 | Alysa | Effertz-Reichert | 37 | Delia_Conroy95@gmail.com |
| 7 | Max | McDermott-Upton | 18 | Shane76@hotmail.com |
| 8 | Pearline | Bauch | 60 | Morris_Rempel@hotmail.com |
| 9 | Terrance | Hettinger | 37 | Berry.Schuster@yahoo.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableRowSelection
selectOnClickRow
withCheckbox={false}
withScrollArea
/>
)
行を無効にする
行を無効にする場合は、enableRowSelectionに条件の関数を設定します。
| id | firstName | lastName | age | ||
|---|---|---|---|---|---|
| 0 | Karl | Hoeger | 23 | Dexter_Treutel24@hotmail.com | |
| 1 | Hilton | Glover | 28 | Palma47@hotmail.com | |
| 2 | Ollie | Kris | 44 | Aubrey_Upton@yahoo.com | |
| 3 | Ian | Dibbert | 39 | Griffin73@hotmail.com | |
| 4 | Stephanie | Howell | 35 | Jason.Vandervort@gmail.com | |
| 5 | Kamren | Marvin | 48 | Bethel.Corkery47@gmail.com | |
| 6 | Eda | Powlowski | 35 | Jaeden_Koss57@gmail.com | |
| 7 | Javier | Schaden | 48 | Georgiana90@hotmail.com | |
| 8 | Cloyd | Okuneva | 51 | Randi_Wiegand65@hotmail.com | |
| 9 | Pierce | Luettgen | 50 | Cleta_Haag4@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableRowSelection={(row) => row.id !== "1"}
withScrollArea
/>
)
"use client"をファイルの上部に追加する必要があります。行の選択を制御する
| id | firstName | lastName | age | ||
|---|---|---|---|---|---|
| 0 | Woodrow | Harber | 33 | Vallie_Gottlieb5@gmail.com | |
| 1 | Matilde | Mraz | 33 | Lou35@gmail.com | |
| 2 | Darian | Rowe-Schoen | 48 | Hazel_Johnson11@yahoo.com | |
| 3 | Ebony | Davis | 28 | Enos.Boehm@yahoo.com | |
| 4 | Michale | Greenfelder | 64 | Theresia.Bauch-Mante19@yahoo.com | |
| 5 | Randolph | Kling | 53 | Hassie.Haley27@hotmail.com | |
| 6 | Amya | Stiedemann | 24 | Guiseppe72@yahoo.com | |
| 7 | Ulises | Kuhic | 51 | Kay57@yahoo.com | |
| 8 | Merl | Rau-Sanford | 39 | Jairo.Becker@gmail.com | |
| 9 | Bailee | Fritsch | 64 | Kareem73@hotmail.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 | Aletha | Ankunding | 46 | Lavern.Klein@yahoo.com |
| 1 | Helene | Kunde | 26 | Sherry_Rice-Medhurst60@hotmail.com |
| 2 | Trevion | Ratke | 36 | Quinn_Kuvalis39@gmail.com |
| 3 | Stefan | Wehner | 62 | Marty31@gmail.com |
| 4 | Margaret | Mante | 41 | Dulce.McCullough10@hotmail.com |
| 5 | Madyson | Murazik | 39 | Leora_Hilpert2@yahoo.com |
| 6 | Heber | Kemmer | 57 | Adell.Gibson@yahoo.com |
| 7 | Ben | Bernier | 38 | Dannie_Casper15@yahoo.com |
| 8 | Keshaun | Towne | 53 | Leo.Paucek-Johnson@yahoo.com |
| 9 | Tim | Funk | 54 | Greta.Heller@yahoo.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 | |
|---|---|---|---|---|
| 0 | Santiago | Heidenreich | 29 | Ernestina.Leffler36@gmail.com |
| 4 | Lafayette | Kuphal-Shanahan | 26 | Coby_McKenzie@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 | Linnie | Crona | 45 | Wilhelmine.Hahn13@gmail.com |
| 1 | Ibrahim | Rippin | 49 | Rubie7@hotmail.com |
| 2 | Natalia | Daniel | 57 | Dexter79@yahoo.com |
| 3 | Frederic | Brown | 21 | Dawn_OKon69@yahoo.com |
| 4 | Amy | Rath | 26 | Cassandra_Reilly41@gmail.com |
| 5 | Violet | Hermiston | 58 | Stephanie.Larkin@gmail.com |
| 6 | Tressa | Dach | 24 | Marcellus30@yahoo.com |
| 7 | Noah | Cremin | 27 | Dell.Goodwin19@hotmail.com |
| 8 | Shelia | Effertz | 61 | Natasha.Zulauf-Koepp29@hotmail.com |
| 9 | Isac | Conn | 26 | Wilford_Purdy@yahoo.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 | Forrest | Kovacek | 58 | Skye7@hotmail.com |
| 1 | Kailee | Green | 38 | Zoe54@hotmail.com |
| 2 | Mavis | Little | 50 | Hayden16@gmail.com |
| 3 | Duncan | Corkery | 47 | Angelo.Kuvalis@yahoo.com |
| 4 | Anastasia | Sporer | 63 | Cassandra45@hotmail.com |
| 5 | Marietta | McClure | 64 | Maria34@yahoo.com |
| 6 | Kyleigh | Botsford | 20 | Haley.Jones53@hotmail.com |
| 7 | Toy | Cruickshank | 64 | Elwyn_Russel@gmail.com |
| 8 | Ima | Lockman | 35 | Kaylee85@yahoo.com |
| 9 | Jarrett | Weissnat | 62 | Leola26@yahoo.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableColumnResizing
withBorder
withColumnBorders
/>
)
列のサイズ変更の方法を変更する
デフォルトでは、列のサイズ変更のタイミングは、ドラッグしている間に変更されます。ドラッグが終わったときに変更する場合は、columnResizeModeに"onEnd"を設定します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Dortha | Schaden | 27 | Jim33@yahoo.com |
| 1 | Christopher | Dietrich | 50 | Buddy_Donnelly@yahoo.com |
| 2 | Josie | Rodriguez | 44 | Stewart_Mraz@gmail.com |
| 3 | Moshe | Krajcik-Mante | 33 | Cordie_Casper83@yahoo.com |
| 4 | Jaida | Gibson | 62 | Kyra78@gmail.com |
| 5 | Shanelle | Nitzsche | 59 | Syble_Gusikowski@hotmail.com |
| 6 | Marquise | Stark-Langworth | 27 | Lynda.Daniel@hotmail.com |
| 7 | Jess | Moore | 51 | Harmony41@gmail.com |
| 8 | Leilani | Zboncak | 44 | Nadia.Connelly99@yahoo.com |
| 9 | Rhea | Reilly | 59 | Murphy96@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は、データ項目のリストを表示するために使用されます。