Table
Tableは、列のソートや行の選択やクリックイベント機能を備えたテーブルのコンポーネントです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Verna | Tremblay | 27 | Audie.Collins@yahoo.com |
| 1 | Jessie | Kiehn | 51 | Anissa.Quigley21@yahoo.com |
| 2 | Dortha | Stroman | 46 | Josh8@hotmail.com |
| 3 | Wanda | Ward | 18 | Earnest55@gmail.com |
| 4 | Alfred | Hane | 37 | Gino33@yahoo.com |
| 5 | Zoie | Jerde | 34 | Kailee_Rogahn44@hotmail.com |
| 6 | Deondre | Turcotte | 42 | Minerva51@yahoo.com |
| 7 | Kaya | O'Reilly | 40 | Rowan_Goodwin@hotmail.com |
| 8 | Jennings | Cummerata | 62 | Cyril.Zulauf91@hotmail.com |
| 9 | Louis | Orn | 33 | Rasheed44@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 | Rasheed | Kessler | 48 | Hillard70@yahoo.com |
| 1 | Dangelo | Fisher | 56 | Ilene18@yahoo.com |
| 2 | Victor | Wilkinson | 43 | Tyson24@gmail.com |
| 3 | Kurtis | Boyle | 45 | Al_Casper@gmail.com |
| 4 | Reece | Hagenes | 62 | August58@gmail.com |
| 5 | Edmond | Rempel | 53 | Gerhard.Sauer23@hotmail.com |
| 6 | Kallie | Hills-Schulist | 39 | Arlo.Schinner@yahoo.com |
| 7 | Kennedy | Dietrich | 39 | Russ.Shields-Balistreri56@yahoo.com |
| 8 | Orval | Effertz-Welch | 52 | Daniela_Smith@hotmail.com |
| 9 | Layla | Greenholt | 62 | Vern.Tromp16@gmail.com |
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Rasheed | Kessler | 48 | Hillard70@yahoo.com |
| 1 | Dangelo | Fisher | 56 | Ilene18@yahoo.com |
| 2 | Victor | Wilkinson | 43 | Tyson24@gmail.com |
| 3 | Kurtis | Boyle | 45 | Al_Casper@gmail.com |
| 4 | Reece | Hagenes | 62 | August58@gmail.com |
| 5 | Edmond | Rempel | 53 | Gerhard.Sauer23@hotmail.com |
| 6 | Kallie | Hills-Schulist | 39 | Arlo.Schinner@yahoo.com |
| 7 | Kennedy | Dietrich | 39 | Russ.Shields-Balistreri56@yahoo.com |
| 8 | Orval | Effertz-Welch | 52 | Daniela_Smith@hotmail.com |
| 9 | Layla | Greenholt | 62 | Vern.Tromp16@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<VStack>
<For each={["line", "outline"]}>
{(variant, index) => (
<Table
key={index}
variant={variant}
columns={columns}
data={data}
withScrollArea
/>
)}
</For>
</VStack>
)
サイズを変更する
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Annabell | Feest | 31 | Roma24@gmail.com |
| 1 | Herminia | Goldner | 23 | Lauren_Gerlach@gmail.com |
| 2 | Jamal | Denesik | 20 | Wendell67@gmail.com |
| 3 | Paige | Nolan | 64 | Natalie_Gibson@yahoo.com |
| 4 | Edmond | Donnelly | 40 | Helene84@yahoo.com |
| 5 | Kaleigh | Kovacek | 35 | Rahul.Kovacek9@gmail.com |
| 6 | Caterina | Wolf | 49 | Salvatore.Wiza@gmail.com |
| 7 | Joshuah | Corkery | 46 | Pablo_Swift-Kunde@hotmail.com |
| 8 | Jamaal | Lowe | 46 | Arlie.Morar@hotmail.com |
| 9 | Laurine | McClure | 22 | Dayna.Hickle14@gmail.com |
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Annabell | Feest | 31 | Roma24@gmail.com |
| 1 | Herminia | Goldner | 23 | Lauren_Gerlach@gmail.com |
| 2 | Jamal | Denesik | 20 | Wendell67@gmail.com |
| 3 | Paige | Nolan | 64 | Natalie_Gibson@yahoo.com |
| 4 | Edmond | Donnelly | 40 | Helene84@yahoo.com |
| 5 | Kaleigh | Kovacek | 35 | Rahul.Kovacek9@gmail.com |
| 6 | Caterina | Wolf | 49 | Salvatore.Wiza@gmail.com |
| 7 | Joshuah | Corkery | 46 | Pablo_Swift-Kunde@hotmail.com |
| 8 | Jamaal | Lowe | 46 | Arlie.Morar@hotmail.com |
| 9 | Laurine | McClure | 22 | Dayna.Hickle14@gmail.com |
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Annabell | Feest | 31 | Roma24@gmail.com |
| 1 | Herminia | Goldner | 23 | Lauren_Gerlach@gmail.com |
| 2 | Jamal | Denesik | 20 | Wendell67@gmail.com |
| 3 | Paige | Nolan | 64 | Natalie_Gibson@yahoo.com |
| 4 | Edmond | Donnelly | 40 | Helene84@yahoo.com |
| 5 | Kaleigh | Kovacek | 35 | Rahul.Kovacek9@gmail.com |
| 6 | Caterina | Wolf | 49 | Salvatore.Wiza@gmail.com |
| 7 | Joshuah | Corkery | 46 | Pablo_Swift-Kunde@hotmail.com |
| 8 | Jamaal | Lowe | 46 | Arlie.Morar@hotmail.com |
| 9 | Laurine | McClure | 22 | Dayna.Hickle14@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<VStack>
<For each={["sm", "md", "lg"]}>
{(size, index) => (
<Table
key={index}
size={size}
columns={columns}
data={data}
withScrollArea
/>
)}
</For>
</VStack>
)
カラースキームを変更する
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Greyson | Franecki | 45 | Velva_Mayer18@gmail.com |
| 1 | Lucious | Ratke | 60 | Foster.Bednar@yahoo.com |
| 2 | Skye | Cummerata | 45 | Caroline70@hotmail.com |
| 3 | Pink | Vandervort | 34 | Phil58@hotmail.com |
| 4 | Jameson | Walsh | 26 | Kendra86@hotmail.com |
| 5 | Albert | Trantow | 24 | Becky29@yahoo.com |
| 6 | Danyka | Okuneva | 18 | Elijah_Cormier68@gmail.com |
| 7 | Brielle | Ernser | 31 | Coty_Funk@gmail.com |
| 8 | Nona | Kuphal | 56 | Pablo.Dare@yahoo.com |
| 9 | Reinhold | O'Hara | 52 | Enos.Bogisich89@yahoo.com |
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Greyson | Franecki | 45 | Velva_Mayer18@gmail.com |
| 1 | Lucious | Ratke | 60 | Foster.Bednar@yahoo.com |
| 2 | Skye | Cummerata | 45 | Caroline70@hotmail.com |
| 3 | Pink | Vandervort | 34 | Phil58@hotmail.com |
| 4 | Jameson | Walsh | 26 | Kendra86@hotmail.com |
| 5 | Albert | Trantow | 24 | Becky29@yahoo.com |
| 6 | Danyka | Okuneva | 18 | Elijah_Cormier68@gmail.com |
| 7 | Brielle | Ernser | 31 | Coty_Funk@gmail.com |
| 8 | Nona | Kuphal | 56 | Pablo.Dare@yahoo.com |
| 9 | Reinhold | O'Hara | 52 | Enos.Bogisich89@yahoo.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<VStack>
<For each={["green", "orange"]}>
{(colorScheme, index) => (
<Table
key={index}
colorScheme={colorScheme}
variant="outline"
columns={columns}
data={data}
withScrollArea
/>
)}
</For>
</VStack>
)
外枠の区切り線を追加する
外枠の区切り線を追加する場合は、withBorderをtrueにします。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Sadye | Hoeger | 39 | Ernestina_Skiles@hotmail.com |
| 1 | Pablo | Wiegand | 64 | Golda.Crist28@hotmail.com |
| 2 | Suzanne | Morissette | 33 | Kiera.Bashirian4@hotmail.com |
| 3 | Omer | Okuneva | 27 | Craig_Jacobson81@yahoo.com |
| 4 | Edd | Osinski | 31 | Brannon_Greenholt72@hotmail.com |
| 5 | Abigale | McClure | 56 | Jamey45@gmail.com |
| 6 | Jabari | Fay | 48 | Fannie87@gmail.com |
| 7 | Clementine | Pagac | 42 | Jazmyne21@hotmail.com |
| 8 | Shaun | Runte | 28 | Heaven58@yahoo.com |
| 9 | Ansley | Pfannerstill | 60 | Dominique.Ankunding89@yahoo.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} withBorder withScrollArea />
列の区切り線を追加する
列の区切り線を追加する場合は、withColumnBordersをtrueにします。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Damien | Schiller | 45 | Marilyne.Reilly54@hotmail.com |
| 1 | Arthur | Franecki | 63 | Vernie.Harris42@yahoo.com |
| 2 | Kristian | Brakus | 43 | May.Koss70@hotmail.com |
| 3 | Lucia | O'Conner | 51 | Major.Jones-Hills64@gmail.com |
| 4 | Diamond | Daugherty | 42 | Ottilie40@hotmail.com |
| 5 | Lessie | Wyman | 50 | Noemi.Conn@hotmail.com |
| 6 | Haylie | Tremblay | 37 | Kyle62@gmail.com |
| 7 | Daisha | Lockman-Dach | 28 | Hattie17@yahoo.com |
| 8 | Delfina | Davis | 22 | Marsha_Stanton@gmail.com |
| 9 | Melany | Nitzsche | 22 | Manley_Heller@yahoo.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} withColumnBorders withScrollArea />
行がホバーされたときにハイライトする
行がホバーされたときにハイライトする場合は、highlightOnHoverをtrueにします。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Joyce | Huels | 39 | Ken_Zboncak60@gmail.com |
| 1 | Floy | Marvin-Ziemann | 18 | Alanis_Moore@yahoo.com |
| 2 | Elbert | Veum | 61 | Stephan.Kerluke@yahoo.com |
| 3 | Stephon | Crist | 49 | Baron.Parisian71@yahoo.com |
| 4 | Kacey | Schulist | 60 | Sydnie7@yahoo.com |
| 5 | Jany | Greenfelder | 63 | Friedrich.Bergnaum@hotmail.com |
| 6 | Mattie | Orn | 52 | Karli_Kihn49@yahoo.com |
| 7 | Heber | Stiedemann | 42 | Carlo73@gmail.com |
| 8 | Christian | Casper | 24 | Gladyce.Prohaska30@hotmail.com |
| 9 | Carmine | Jast | 39 | Tessie.Wisoky@yahoo.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} highlightOnHover withScrollArea />
ストライプを使う
ストライプを使う場合は、stripedをtrueにします。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Mikayla | Hessel | 44 | Betty_Kuhn@hotmail.com |
| 1 | Alene | Langosh | 27 | Eldon.Dach99@yahoo.com |
| 2 | Thora | Price | 18 | Charlene36@yahoo.com |
| 3 | Nathanael | Strosin-Abernathy | 22 | Jerrold.OConnell@hotmail.com |
| 4 | Jacqueline | Schmidt | 22 | Sherri.Parisian73@hotmail.com |
| 5 | King | Hegmann | 41 | Calvin94@hotmail.com |
| 6 | Cornell | Mann | 24 | Raleigh.Nienow54@hotmail.com |
| 7 | Jess | Price | 61 | Bette70@yahoo.com |
| 8 | Ludwig | Wisoky | 55 | Jensen.Langosh45@gmail.com |
| 9 | Ronald | Veum | 31 | Faith88@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 | Odie | McKenzie | 44 | Lennie43@hotmail.com | 1-424-645-3808 x956 | user | active | 3/21/2026 | 5/6/2026 |
| 1 | Zena | Shanahan | 51 | Jaylan.Russel@hotmail.com | 503.562.7538 x335 | admin | active | 6/27/2026 | 10/3/2026 |
| 2 | Josue | Schoen | 48 | Camden_Schaefer69@hotmail.com | 838.439.7981 | admin | active | 8/21/2026 | 2/19/2026 |
| 3 | Candace | Lindgren | 53 | Julius7@gmail.com | 764.894.9693 x066 | admin | active | 8/25/2026 | 7/29/2026 |
| 4 | Constance | Anderson | 61 | Edgar80@yahoo.com | (514) 390-0677 x33757 | user | inactive | 9/30/2026 | 8/20/2026 |
| 5 | Eddie | Okuneva | 33 | Eleanora_Bechtelar13@yahoo.com | (284) 952-3058 x418 | admin | active | 4/11/2026 | 9/18/2026 |
| 6 | Nettie | Friesen | 30 | Josefa23@hotmail.com | 699.838.4809 | user | active | 6/22/2026 | 3/7/2026 |
| 7 | Daron | Cassin | 53 | Kip39@yahoo.com | 1-802-787-0378 x719 | user | active | 1/13/2026 | 5/18/2026 |
| 8 | Alta | Moen | 45 | Makenzie.Steuber95@yahoo.com | 804.784.3231 | user | inactive | 10/13/2026 | 10/15/2026 |
| 9 | Saul | Mills | 22 | Jude_Grant@yahoo.com | 1-283-818-0804 x2064 | admin | inactive | 10/1/2026 | 11/10/2025 |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columnsFull} data={data} withScrollArea />
ヘッダーグループ
| id | user | |||
|---|---|---|---|---|
| name | age | |||
| firstName | lastName | |||
| 0 | Jaycee | Schulist | 38 | Concepcion.Wunsch@hotmail.com |
| 1 | Joy | Goodwin | 56 | Marilou75@gmail.com |
| 2 | Wellington | Prohaska | 48 | Fern_Rosenbaum@hotmail.com |
| 3 | Telly | Langworth | 56 | Rocky.Pouros57@hotmail.com |
| 4 | Laverne | Brekke | 34 | Vita.Emard81@gmail.com |
| 5 | Caden | Bednar | 46 | Ericka_Rath-Shields48@yahoo.com |
| 6 | Jessie | Stanton | 47 | Scot18@hotmail.com |
| 7 | Malika | Schmitt | 23 | Osborne.Olson@gmail.com |
| 8 | Branson | Quigley | 63 | Cynthia_Jacobs@hotmail.com |
| 9 | Judson | Leffler | 49 | Destiny_Towne-Roob@gmail.com |
const columns = useMemo(
() => [
columnHelper.accessor("id", {
footer: (info) => info.column.id,
cellProps: { numeric: true },
}),
columnHelper.group({
id: "user",
columns: [
columnHelper.group({
id: "name",
columns: [
columnHelper.accessor("firstName", {
footer: (info) => info.column.id,
lineClamp: 1,
}),
columnHelper.accessor("lastName", {
footer: (info) => info.column.id,
lineClamp: 1,
}),
],
footer: (info) => info.column.id,
header: (info) => info.column.id,
}),
columnHelper.accessor("age", {
footer: (info) => info.column.id,
cellProps: { numeric: true },
}),
columnHelper.accessor("email", {
footer: (info) => info.column.id,
lineClamp: 1,
}),
],
footer: (info) => info.column.id,
header: (info) => info.column.id,
}),
],
[],
)
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
withBorder
withColumnBorders
withScrollArea
/>
)
フッターグループ
| id | user | |||
|---|---|---|---|---|
| name | age | |||
| firstName | lastName | |||
| 0 | Janelle | Boyer | 41 | Meta.Marvin91@hotmail.com |
| 1 | Audreanne | Ward | 33 | Della_Mitchell75@gmail.com |
| 2 | Miriam | Bechtelar | 26 | Halie_Gerlach@yahoo.com |
| 3 | Ronald | Windler | 18 | Emerson.Collins@yahoo.com |
| 4 | Beryl | Nienow | 43 | Amber_Brekke@gmail.com |
| 5 | Keira | Bergnaum | 31 | Jamie.Mraz62@hotmail.com |
| 6 | Markus | Brakus | 25 | Abbey_Gibson66@hotmail.com |
| 7 | Mercedes | Reichel | 33 | Sidney.Cartwright58@yahoo.com |
| 8 | Ashleigh | Gerlach | 42 | Kevin26@gmail.com |
| 9 | Ira | Sawayn-Morissette | 45 | Elna.Yundt17@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<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
withBorder
withColumnBorders
withFooterGroups
withScrollArea
/>
)
キーボードナビゲーションを無効にする
キーボードナビゲーションを無効にする場合は、enableKeyboardNavigationをfalseに設定します。デフォルトは、trueです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Natasha | Walsh | 41 | Amalia.Tillman@hotmail.com |
| 1 | Jacky | Rosenbaum | 19 | Oma_Breitenberg11@hotmail.com |
| 2 | Jonatan | Boyle | 49 | King_Kris-Muller@gmail.com |
| 3 | Yessenia | Fay | 39 | Willard_Dietrich6@yahoo.com |
| 4 | Isadore | Steuber | 18 | Sigmund.Reichel@gmail.com |
| 5 | Santino | Kunze | 47 | Orie24@yahoo.com |
| 6 | Chaya | Swaniawski | 25 | Hilario_Langworth94@hotmail.com |
| 7 | Jerrod | Shanahan | 36 | Royal59@yahoo.com |
| 8 | Roman | Purdy | 57 | Kaden_Green@yahoo.com |
| 9 | Milford | Boyer | 65 | Everette16@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 | Izaiah | Orn | 62 | Nelson_Schimmel87@yahoo.com |
| 1 | Vivianne | Adams | 39 | Kelly_Cronin33@hotmail.com |
| 2 | Shaylee | Block | 43 | Regina.Deckow65@gmail.com |
| 3 | Frida | Cremin | 20 | Adah_Powlowski12@gmail.com |
| 4 | August | Ferry | 55 | Tanner_Bartell@hotmail.com |
| 5 | Lavada | Kerluke | 36 | Harry_Schaefer16@yahoo.com |
| 6 | Edyth | Bailey | 51 | Alf.Kiehn@yahoo.com |
| 7 | Stacey | Douglas | 64 | Abdullah_Mante@gmail.com |
| 8 | Tad | Conn | 60 | Preston.Bosco@hotmail.com |
| 9 | Lilyan | Conroy | 57 | Hallie_Hauck@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
initialFocusableCell={{ colIndex: 1, rowIndex: 0 }}
withScrollArea
/>
)
行のクリックイベントをハンドルする
行のクリックイベントをハンドルする場合は、onRowClickを使用します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Gretchen | Raynor-Flatley | 40 | Dorcas27@hotmail.com |
| 1 | Ed | Lubowitz | 50 | Raven36@hotmail.com |
| 2 | Guiseppe | Champlin | 52 | Bartholome.Skiles11@hotmail.com |
| 3 | Omer | Prosacco | 35 | Jenifer77@gmail.com |
| 4 | Nadine | Jacobs | 31 | Laury_Herman36@yahoo.com |
| 5 | Granville | Powlowski | 57 | Broderick_Senger@gmail.com |
| 6 | Ivah | Rippin | 26 | Shyanne.Runte@gmail.com |
| 7 | Henrietta | Hammes | 23 | Sheri77@gmail.com |
| 8 | Theodore | Brakus | 41 | Ladarius.Veum71@gmail.com |
| 9 | Aubrey | Dooley | 45 | Ivan79@yahoo.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
onRowClick={(row) => console.log(row)}
withScrollArea
/>
)
"use client"をファイルの上部に追加する必要があります。行のダブルクリックイベントをハンドルする
行のダブルクリックイベントをハンドルする場合は、onRowDoubleClickを使用します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Dandre | Beier | 40 | Niko98@yahoo.com |
| 1 | Ruthe | Rosenbaum | 57 | Sean84@yahoo.com |
| 2 | Karen | Spencer | 26 | Troy_Trantow@hotmail.com |
| 3 | Robb | Satterfield | 26 | Shanon.McGlynn40@gmail.com |
| 4 | Salma | Adams | 36 | Anne84@gmail.com |
| 5 | Lina | Sawayn | 36 | Herbert.Dibbert28@yahoo.com |
| 6 | Cathy | Parker-D'Amore | 58 | Mildred_Kris@yahoo.com |
| 7 | Marsha | Schoen | 26 | Micah.Hodkiewicz4@gmail.com |
| 8 | Reilly | Rolfson | 35 | Todd.Senger43@yahoo.com |
| 9 | Domenica | Marvin | 32 | Walker.Oberbrunner@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 | |
|---|---|---|---|---|
| 8 | Joe | Hilll | 65 | Cheyenne.Harris@hotmail.com |
| 9 | Georgia | Donnelly | 52 | Devan.Torphy88@yahoo.com |
| 5 | Khalil | Schumm | 49 | Kiara_Bahringer40@gmail.com |
| 3 | Guadalupe | Jacobson | 48 | Lonnie_Cruickshank@hotmail.com |
| 2 | Griffin | Purdy | 38 | Roman.Baumbach47@hotmail.com |
| 4 | Terrance | Ortiz-Johnson | 35 | Belinda59@gmail.com |
| 1 | Emmie | Johnston | 27 | Christiana.Keebler47@hotmail.com |
| 0 | Richie | Harber | 21 | Troy29@gmail.com |
| 6 | Jaida | Gottlieb | 20 | Rozella.Runte@hotmail.com |
| 7 | Guido | Wilderman | 19 | Santiago98@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
defaultSorting={[{ id: "age", desc: true }]}
withScrollArea
/>
)
ソートを無効にする
ソートを無効にする場合は、enableSortingをfalseに設定します。デフォルトは、trueです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | River | Bruen | 62 | Missouri25@hotmail.com |
| 1 | Cathryn | Wolff | 57 | Mittie.Renner97@yahoo.com |
| 2 | Frederik | Lockman | 35 | Columbus5@gmail.com |
| 3 | Lisa | Nitzsche | 38 | Sadie57@gmail.com |
| 4 | Kurt | Turcotte | 26 | Wilford.Considine48@gmail.com |
| 5 | Garry | Schulist-Wunsch | 24 | Wade_Emmerich@hotmail.com |
| 6 | Candida | Reynolds | 37 | Elizabeth90@gmail.com |
| 7 | Tanner | Glover | 57 | Eula59@gmail.com |
| 8 | Dasia | Shanahan | 25 | Anya33@hotmail.com |
| 9 | Pamela | Stiedemann | 44 | Sammie49@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table columns={columns} data={data} enableSorting={false} withScrollArea />
)
複数列のソートを無効にする
複数列のソートを無効にする場合は、enableMultiSortをfalseに設定します。デフォルトは、trueです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Melvina | Koss | 34 | Reese.Hirthe@hotmail.com |
| 1 | Alva | Ziemann | 30 | Arch47@yahoo.com |
| 2 | Thomas | Kris | 36 | Laurel.Witting39@hotmail.com |
| 3 | Troy | Maggio | 49 | Rebecca_Mosciski13@hotmail.com |
| 4 | Ethan | Reichel | 18 | Mayra_Metz@gmail.com |
| 5 | Shaylee | Feil-Bruen | 51 | Tammy.Runolfsson69@gmail.com |
| 6 | Alford | Labadie | 60 | Karlie.Von77@yahoo.com |
| 7 | Guillermo | Mante | 36 | Tianna_Gutkowski@gmail.com |
| 8 | Clark | Boehm | 53 | Penelope.Bergstrom36@yahoo.com |
| 9 | Harry | Legros-Lueilwitz | 61 | Nya62@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table columns={columns} data={data} enableMultiSort={false} withScrollArea />
)
最大のソート可能な列数を設定する
最大のソート可能な列数を設定する場合は、maxMultiSortColCountに数値を設定します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Albina | Rolfson | 37 | Rosemary_Lemke1@gmail.com |
| 1 | Madisyn | Walker | 32 | Bruce.Schoen87@hotmail.com |
| 2 | Kaci | Wunsch | 57 | Kaelyn.Hettinger-Moore@yahoo.com |
| 3 | Emilio | Keebler | 32 | Christophe_Littel11@yahoo.com |
| 4 | Jannie | McLaughlin | 65 | Kailey.Gorczany@gmail.com |
| 5 | Telly | Welch | 29 | Davin46@yahoo.com |
| 6 | Ebony | O'Hara | 37 | Arjun_Huel@hotmail.com |
| 7 | Sam | Bahringer | 37 | Maureen.Schroeder40@yahoo.com |
| 8 | Elza | Schumm | 32 | Dolores72@gmail.com |
| 9 | Emmet | Mayert | 44 | Thelma36@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
maxMultiSortColCount={2}
withScrollArea
/>
)
手動のソートを使う
手動のソートを使う場合は、manualSortingをtrueに設定します。デフォルトは、falseです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Claudine | Schaden | 59 | Shanie.Goyette59@hotmail.com |
| 1 | Reynold | Wolff | 51 | Rafaela.Hilll37@yahoo.com |
| 2 | Jeannie | Sporer | 20 | Dominick_Romaguera@gmail.com |
| 3 | Kali | Schneider | 32 | Watson.Boehm10@hotmail.com |
| 4 | Savannah | Hoppe | 56 | Eula.Runolfsson@gmail.com |
| 5 | Giovani | Cruickshank | 41 | Anya58@hotmail.com |
| 6 | Sofia | Green | 18 | Ludwig_Swaniawski-Will70@gmail.com |
| 7 | Martin | Murazik | 30 | Destany.Franecki@yahoo.com |
| 8 | Ernestine | Marvin | 62 | Emmet62@hotmail.com |
| 9 | Margarette | Hettinger | 47 | Joaquin.Torp29@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 | Mariam | Moore | 30 | Katlynn.Powlowski96@gmail.com |
| 1 | Effie | Metz | 24 | Anahi95@yahoo.com |
| 2 | Arielle | D'Amore | 33 | Darien88@gmail.com |
| 3 | Crystel | Doyle-Waters | 51 | Theresa_Glover-Reichert@yahoo.com |
| 4 | Afton | Simonis | 36 | Kaylin.Emard@yahoo.com |
| 5 | Meda | Dicki | 40 | Hellen_Erdman@yahoo.com |
| 6 | Sheila | Schiller | 63 | Curtis_Ankunding10@yahoo.com |
| 7 | Xavier | Halvorson | 60 | Helena.Kulas@yahoo.com |
| 8 | Assunta | Kris | 39 | Pierre.Hyatt@gmail.com |
| 9 | Edd | Berge | 27 | Mozell.Langosh@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} sortDescFirst withScrollArea />
ソートを制御する
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Bernita | Mills | 41 | Kaylee_Hoppe55@hotmail.com |
| 1 | Arlie | Schimmel | 29 | Weston.Ledner@gmail.com |
| 2 | Elmore | Hirthe | 30 | Brannon.Lowe37@yahoo.com |
| 3 | Stan | Ullrich | 58 | Clifton_Quitzon38@hotmail.com |
| 4 | Kadin | Stroman | 23 | Liana_Veum66@gmail.com |
| 5 | Stella | Stoltenberg | 61 | Hobart97@hotmail.com |
| 6 | Drew | Lang | 53 | Inez.Dibbert@hotmail.com |
| 7 | Adelia | O'Kon | 23 | Dina13@yahoo.com |
| 8 | Jaylon | Cassin | 57 | Dallas.Kshlerin68@hotmail.com |
| 9 | Royce | Towne | 45 | Jarrell.Botsford@yahoo.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 | Darron | Schuster | 45 | Eli.Halvorson@gmail.com |
| 1 | Noel | Keeling | 44 | Michel96@gmail.com |
| 2 | Erma | Legros | 53 | Madge41@gmail.com |
| 3 | Nathanael | Dare | 41 | Alden.Fay2@gmail.com |
| 4 | Albin | Powlowski | 42 | Hailee.Crona98@gmail.com |
| 5 | Amiya | Collins | 57 | Sidney_Cummings73@yahoo.com |
| 6 | Brayan | Flatley | 50 | Francesco.Rath50@yahoo.com |
| 7 | Sammie | Rowe | 42 | Abraham.Jakubowski23@gmail.com |
| 8 | Marcos | Blick | 23 | Shaniya.Rempel58@gmail.com |
| 9 | Jaren | Murazik-Bosco | 51 | Brennon_Gislason@gmail.com |
| 10 | Yoshiko | Satterfield-Cremin | 40 | Dane_Aufderhar8@hotmail.com |
| 11 | Adell | Hilll | 24 | Cedric36@yahoo.com |
| 12 | Kristen | Runte | 31 | Fannie.Kuhlman@hotmail.com |
| 13 | Amie | Turcotte | 61 | Emelia28@yahoo.com |
| 14 | Wilbur | Brekke | 51 | Janessa_Goodwin51@gmail.com |
| 15 | Garnet | Romaguera | 28 | Brooklyn.Durgan@yahoo.com |
| 16 | Pattie | Tromp | 30 | Kaycee_Legros32@gmail.com |
| 17 | Tate | O'Connell | 33 | Ebba.Collins-Gerhold@gmail.com |
| 18 | Audrey | Weimann | 55 | Micaela_Volkman@hotmail.com |
| 19 | Leopold | MacGyver | 45 | Janelle_Shanahan85@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 | Zelda | Trantow | 56 | Demond.Ullrich28@yahoo.com |
| 11 | Don | Kshlerin | 43 | Asa49@yahoo.com |
| 12 | Sandrine | Runte | 23 | Leanne_Hartmann0@hotmail.com |
| 13 | Enos | Kuvalis | 19 | Alexanne_Labadie@gmail.com |
| 14 | Alena | Lemke | 37 | Arianna4@yahoo.com |
| 15 | Owen | Jacobson | 38 | Pete_Senger6@hotmail.com |
| 16 | Blaise | Runte | 54 | Stevie.Stroman29@gmail.com |
| 17 | Jeannie | Swift | 49 | Deonte_Rolfson@hotmail.com |
| 18 | Gus | King | 58 | Adolph_Gerhold61@gmail.com |
| 19 | Lenore | Feil | 47 | Lew_Hilpert80@gmail.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 | Arthur | Durgan | 30 | Adolph.Hyatt@hotmail.com |
| 1 | Naomie | Kohler | 65 | Micah_Pacocha@gmail.com |
| 2 | Jazmyne | Mohr | 30 | Jody.Mann16@yahoo.com |
| 3 | Sue | Jacobson | 19 | Shayne_Waters97@hotmail.com |
| 4 | Grover | Marquardt | 34 | Alessandro8@yahoo.com |
| 5 | Orpha | Turner | 19 | Yasmin_Beer@gmail.com |
| 6 | Myrtie | Block | 61 | Abner_Lakin@yahoo.com |
| 7 | Coty | Rutherford-Effertz | 63 | Catharine.Kreiger-Wolff92@hotmail.com |
| 8 | Micheal | Littel | 30 | Rafael71@yahoo.com |
| 9 | Orlo | Gutmann-Wisozk | 18 | Elvera26@hotmail.com |
| 10 | Dorris | Zboncak-Hodkiewicz | 53 | Polly.Powlowski21@yahoo.com |
| 11 | Cedric | Muller-Runolfsdottir | 48 | Maurice26@gmail.com |
| 12 | Donny | Kerluke | 21 | Sven84@hotmail.com |
| 13 | Vincenzo | Leffler | 59 | Humberto.Welch@gmail.com |
| 14 | Alonzo | Dickens | 31 | Emerson.Hoeger94@gmail.com |
| 15 | Justice | Schumm | 21 | Mae34@hotmail.com |
| 16 | Baron | Bartoletti | 25 | Jett_Lowe@gmail.com |
| 17 | Susana | Prosacco | 35 | Uriah29@hotmail.com |
| 18 | Treva | Haag | 50 | Matthew49@hotmail.com |
| 19 | Jayda | Stark | 36 | Kristen_Dickinson@yahoo.com |
const { t } = useI18n("table")
const [pagination, setPagination] = useState<PaginationState>({
pageIndex: 0,
pageSize: 20,
})
const rowCount = 40
const defaultData = useMemo<TableData[]>(() => createTableData(rowCount), [])
const data = useMemo<TableData[]>(
() =>
defaultData.slice(
pagination.pageIndex * pagination.pageSize,
(pagination.pageIndex + 1) * pagination.pageSize,
),
[defaultData, pagination],
)
return (
<VStack>
<Table
columns={columns}
data={data}
enablePagination
manualPagination
pagination={pagination}
rowCount={rowCount}
onPaginationChange={setPagination}
footer={(table) => {
const page = table.getState().pagination.pageIndex + 1
const pageSize = table.getState().pagination.pageSize
const total = table.getPageCount()
return (
<Grid templateColumns="1fr 1fr 1fr" w="full">
<Pagination.Root
size={{ base: "sm", sm: "xs" }}
gridColumn="2 / 3"
page={page}
total={total}
onChange={(page) => table.setPageIndex(page - 1)}
/>
<Select.Root
size={{ base: "sm", sm: "xs" }}
aria-label={t("Page size")}
items={[
{ label: "10", value: "10" },
{ label: "20", value: "20" },
{ label: "30", value: "30" },
{ label: "40", value: "40" },
{ label: "50", value: "50" },
]}
value={pageSize.toString()}
rootProps={{ justifySelf: "end", w: "5xs" }}
onChange={(value) => table.setPageSize(Number(value))}
/>
</Grid>
)
}}
withScrollArea
/>
</VStack>
)
"use client"をファイルの上部に追加する必要があります。ページネーションを制御する
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Freddie | Little-Klein | 49 | Savanna.Ullrich61@hotmail.com |
| 1 | Marjolaine | Swift | 48 | Mathias_Bayer@gmail.com |
| 2 | Brannon | MacGyver | 23 | Loy_Purdy@gmail.com |
| 3 | Norberto | Halvorson | 53 | Dannie76@yahoo.com |
| 4 | Velva | Kohler | 23 | Vincenza57@gmail.com |
| 5 | Muriel | Spencer | 29 | Ollie.Bednar-Torp19@yahoo.com |
| 6 | Darrick | Paucek | 64 | Caleb.Ward21@gmail.com |
| 7 | Nestor | Cruickshank | 47 | Jovani_Wolf49@hotmail.com |
| 8 | Colleen | Rogahn | 58 | Jessyca16@yahoo.com |
| 9 | Darion | Reinger | 29 | Shaniya.Balistreri71@hotmail.com |
| 10 | Melyssa | Schulist | 59 | Erick_Halvorson@yahoo.com |
| 11 | Regina | Stanton-Ernser | 19 | Araceli.Boehm@yahoo.com |
| 12 | Jaylin | Hills | 33 | Tyrell31@hotmail.com |
| 13 | Bryce | Schumm | 62 | Mossie_Farrell10@hotmail.com |
| 14 | Jasen | Turner | 30 | Clarabelle_Cronin46@gmail.com |
| 15 | Heber | Jenkins | 51 | Muhammad.Walter@hotmail.com |
| 16 | Briana | Greenfelder | 47 | Leta.Kessler87@yahoo.com |
| 17 | Ronald | Gerlach-Littel | 34 | Damon_Sipes@hotmail.com |
| 18 | Naomie | Schroeder | 34 | Elijah_Tillman46@hotmail.com |
| 19 | Daphnee | Carroll | 62 | Rusty_Walter58@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 | Elian | Daugherty | 40 | Alton_Schimmel-Morissette@hotmail.com | |
| 1 | Dario | Casper | 61 | Myrtie_Armstrong90@yahoo.com | |
| 2 | Murray | Dibbert | 38 | Jerel_Bosco20@gmail.com | |
| 3 | Jamar | Strosin | 36 | Lukas49@yahoo.com | |
| 4 | Lew | Barton | 54 | Giovani.Stark2@yahoo.com | |
| 5 | Hoyt | Kunde | 40 | Judge_Waters@gmail.com | |
| 6 | Bell | Hand | 25 | Deshawn_Tromp@hotmail.com | |
| 7 | Aubree | Robel | 31 | Damaris_Gusikowski@hotmail.com | |
| 8 | Peggy | Miller | 41 | Chyna.Langworth20@gmail.com | |
| 9 | Stanley | Torp | 63 | Jacynthe13@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} enableRowSelection withScrollArea />
デフォルトの選択された行を設定する
デフォルトの選択された行を設定する場合は、defaultRowSelectionにdataのインデックスをキーとしたオブジェクトを設定します。
| id | firstName | lastName | age | ||
|---|---|---|---|---|---|
| 0 | Jesse | Goldner | 52 | Laury.Schamberger18@gmail.com | |
| 1 | Pedro | Bartoletti | 53 | Zoie.Yost73@hotmail.com | |
| 2 | Michele | Metz | 18 | Mireille.Johnston75@hotmail.com | |
| 3 | Nigel | Cole | 36 | Rebeca_Fadel@hotmail.com | |
| 4 | Porter | Torp | 63 | Spencer29@hotmail.com | |
| 5 | Kenya | Crooks | 49 | Tressa.Cruickshank45@gmail.com | |
| 6 | Rosamond | Maggio | 28 | Nikko_Von@yahoo.com | |
| 7 | Weston | Douglas-Cummerata | 45 | Garfield_Kertzmann79@yahoo.com | |
| 8 | Enrico | Flatley-Bruen | 53 | Ervin.Bartell80@gmail.com | |
| 9 | Dannie | Mitchell | 44 | Sheldon97@yahoo.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 | Rupert | Mueller | 36 | Luella_Wiza@hotmail.com | |
| 1 | Harley | Kozey | 58 | Marisa_Littel@yahoo.com | |
| 2 | Elenora | Cronin | 22 | Jaylin30@yahoo.com | |
| 3 | Lynda | Denesik-Sipes | 51 | Brett_Kilback@hotmail.com | |
| 4 | Jaime | Fisher | 60 | Fidel.Veum16@yahoo.com | |
| 5 | Kevin | Hermann | 62 | Jenna.Hills29@hotmail.com | |
| 6 | Grayce | Ullrich | 18 | Frederick.Goodwin@yahoo.com | |
| 7 | Mallory | Volkman | 56 | Helga.McLaughlin@gmail.com | |
| 8 | Betty | Gerlach | 32 | Major_Lind55@yahoo.com | |
| 9 | Meta | Morissette | 23 | Mara_Hayes36@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableRowSelection
selectOnClickRow
withScrollArea
/>
)
チェックボックスを非表示にする
チェックボックスを非表示にする場合は、withCheckboxをfalseに設定します。デフォルトは、trueです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Hayden | Hermann | 34 | Carlotta.Purdy59@gmail.com |
| 1 | Sherri | Schoen | 26 | Estella33@hotmail.com |
| 2 | Moshe | Effertz | 46 | Ramona67@gmail.com |
| 3 | Jaden | Kovacek | 37 | Lera52@yahoo.com |
| 4 | Deven | Paucek | 40 | Charlie20@yahoo.com |
| 5 | Emie | Bosco | 42 | Bailey_Gottlieb33@gmail.com |
| 6 | Jodie | Bartell | 43 | Britney_Grimes20@hotmail.com |
| 7 | Shaylee | Nicolas | 19 | Lonzo29@hotmail.com |
| 8 | Favian | Greenfelder | 56 | Americo47@gmail.com |
| 9 | Dillan | Beatty | 64 | Wade_Tillman77@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableRowSelection
selectOnClickRow
withCheckbox={false}
withScrollArea
/>
)
行を無効にする
行を無効にする場合は、enableRowSelectionに条件の関数を設定します。
| id | firstName | lastName | age | ||
|---|---|---|---|---|---|
| 0 | Quentin | Kreiger | 61 | Duncan.Welch18@yahoo.com | |
| 1 | Aron | Zieme | 49 | Brandy_Jacobi79@hotmail.com | |
| 2 | Lysanne | Dicki | 65 | Arely85@hotmail.com | |
| 3 | Mackenzie | DuBuque | 24 | Isai47@yahoo.com | |
| 4 | Alva | Koepp | 22 | Rosalee24@gmail.com | |
| 5 | Ayla | Kub | 29 | Gabriella86@yahoo.com | |
| 6 | Yvonne | Sawayn | 65 | Ellsworth99@yahoo.com | |
| 7 | Dwayne | Abernathy | 22 | Verona_Osinski@gmail.com | |
| 8 | Myles | Gutkowski | 44 | Walton.Osinski@hotmail.com | |
| 9 | Chelsey | Dooley | 59 | Zelma_Baumbach-Bartell@yahoo.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableRowSelection={(row) => row.id !== "1"}
withScrollArea
/>
)
"use client"をファイルの上部に追加する必要があります。行の選択を制御する
| id | firstName | lastName | age | ||
|---|---|---|---|---|---|
| 0 | Miriam | Schaefer | 54 | Bradly.Stiedemann@yahoo.com | |
| 1 | Jaylon | Murphy | 18 | Elenor.Feil@yahoo.com | |
| 2 | Stacy | Dickinson | 54 | Demarco_Jenkins@hotmail.com | |
| 3 | Katelin | Predovic | 18 | Geraldine_Dickinson21@yahoo.com | |
| 4 | Denise | Lemke | 45 | Denis5@yahoo.com | |
| 5 | Judith | Ritchie | 35 | Reece.Bartell@yahoo.com | |
| 6 | Jaime | Koss | 65 | Rylan_Torphy10@hotmail.com | |
| 7 | Gracie | Hessel | 53 | King.Lesch33@yahoo.com | |
| 8 | Brycen | Ullrich | 29 | Loyce.Ortiz@hotmail.com | |
| 9 | Rey | Schumm | 44 | Saige_Spinka@gmail.com |
const [rowSelection, setRowSelection] = useState<RowSelectionState>({})
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableRowSelection
rowSelection={rowSelection}
onRowSelectionChange={setRowSelection}
withScrollArea
/>
)
"use client"をファイルの上部に追加する必要があります。フィルターを使う
フィルターを使う場合は、フィルターをコントロールするコンポーネントをheaderまたはfooterに設定します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Carolanne | Sporer | 50 | Carlo.Ward96@gmail.com |
| 1 | Ivan | Kuhlman | 19 | Gregg.Kessler@yahoo.com |
| 2 | Marlon | Kulas | 54 | Nils_Moen93@hotmail.com |
| 3 | Dana | Medhurst | 64 | Rosamond_Paucek@yahoo.com |
| 4 | Tremaine | Leffler | 24 | Anna78@gmail.com |
| 5 | Yvonne | Stanton | 35 | Domenic14@hotmail.com |
| 6 | Alyson | Morar | 47 | Amely41@yahoo.com |
| 7 | Morris | Franecki-Wunsch | 20 | Katlynn.Sauer56@hotmail.com |
| 8 | Dora | Braun | 46 | Buford.Zulauf95@yahoo.com |
| 9 | Susana | Kilback | 30 | Oliver_Hintz@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<VStack>
<Table
columns={columns}
data={data}
header={(table) => {
const value =
(table.getColumn("email")?.getFilterValue() as string | undefined) ??
""
return (
<InputGroup.Root>
<InputGroup.Element>
<SearchIcon />
</InputGroup.Element>
<Input
placeholder="Filter emails"
value={value}
onChange={(ev) =>
table.getColumn("email")?.setFilterValue(ev.target.value)
}
/>
</InputGroup.Root>
)
}}
withScrollArea
/>
</VStack>
)
"use client"をファイルの上部に追加する必要があります。デフォルトのフィルターを設定する
デフォルトのフィルターを設定する場合は、defaultColumnFiltersに配列を設定します。配列のオブジェクトには、フィルターする列のidと値を設定します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 4 | Sean | Powlowski | 62 | Wyman.Huels16@gmail.com |
| 6 | Nathaniel | Pfeffer | 21 | Lamar86@gmail.com |
| 8 | Kenneth | Greenholt | 51 | Bret.Borer80@gmail.com |
| 9 | Jeanie | Kuvalis | 41 | Aleen.OKon4@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 | Jose | Borer-Prohaska | 27 | Pedro_Raynor@gmail.com |
| 1 | Ulises | Kautzer | 34 | Wade73@hotmail.com |
| 2 | Alba | Kilback | 36 | Rosie_DAmore17@gmail.com |
| 3 | Adriel | Johnston | 20 | Leilani_Grant@hotmail.com |
| 4 | Laisha | Pfeffer | 28 | Howell_Metz51@yahoo.com |
| 5 | Aidan | Sanford | 32 | Dena_Gulgowski62@hotmail.com |
| 6 | Leticia | Okuneva | 41 | Reggie_Rodriguez@yahoo.com |
| 7 | Wesley | Beahan | 53 | Kay88@hotmail.com |
| 8 | Karlie | Stark | 25 | Connie_Berge@yahoo.com |
| 9 | Lora | Hand | 39 | Mafalda.Carroll@gmail.com |
const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([
{ id: "email", value: "" },
])
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<VStack>
<Table
columns={columns}
data={data}
columnFilters={columnFilters}
onColumnFiltersChange={setColumnFilters}
header={(table) => {
const value =
(table.getColumn("email")?.getFilterValue() as string | undefined) ??
""
return (
<InputGroup.Root>
<InputGroup.Element>
<SearchIcon />
</InputGroup.Element>
<Input
placeholder="Filter emails"
value={value}
onChange={(ev) =>
table.getColumn("email")?.setFilterValue(ev.target.value)
}
/>
</InputGroup.Root>
)
}}
withScrollArea
/>
</VStack>
)
"use client"をファイルの上部に追加する必要があります。列のサイズ変更を有効にする
列のサイズ変更を有効にする場合は、enableColumnResizingをtrueに設定します。デフォルトは、falseです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Garrick | Kautzer | 19 | Selena.Kilback@gmail.com |
| 1 | Ara | Mayert | 62 | Scarlett.Schmidt@hotmail.com |
| 2 | Rebeka | O'Reilly | 18 | Dwight.Beer5@yahoo.com |
| 3 | Christa | Graham | 38 | Spencer.Torp40@hotmail.com |
| 4 | Luella | Feeney | 57 | Shanon_Balistreri@hotmail.com |
| 5 | Judson | Jacobs | 48 | Ismael.Roob@yahoo.com |
| 6 | Caesar | Crona | 37 | Garry_Gleason@yahoo.com |
| 7 | Maudie | Keebler | 39 | Layla.Lind@hotmail.com |
| 8 | Gustavo | Wisozk | 26 | Dena_Shanahan-Hessel@hotmail.com |
| 9 | Bernardo | Kessler | 61 | John_DAmore9@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableColumnResizing
withBorder
withColumnBorders
/>
)
列のサイズ変更の方法を変更する
デフォルトでは、列のサイズ変更のタイミングは、ドラッグしている間に変更されます。ドラッグが終わったときに変更する場合は、columnResizeModeに"onEnd"を設定します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Ian | Leffler | 23 | Ryann.Klocko32@yahoo.com |
| 1 | Sonya | Olson | 58 | Jermey_Will@yahoo.com |
| 2 | Alisha | Heaney | 55 | Mariela71@hotmail.com |
| 3 | Willie | Towne | 63 | Tyreek.Will42@yahoo.com |
| 4 | Abdiel | Schamberger | 51 | Fanny.Kuhlman-Herman32@gmail.com |
| 5 | Lauren | Bins | 52 | Aliza85@yahoo.com |
| 6 | Lorraine | Murazik | 30 | Jay.Schmidt55@yahoo.com |
| 7 | Colleen | Moen | 58 | Aubrey.Fritsch@yahoo.com |
| 8 | Lydia | Watsica | 24 | Pierce.Ankunding63@gmail.com |
| 9 | Janessa | Grimes | 28 | Rubie60@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableColumnResizing
columnResizeMode="onEnd"
withBorder
withColumnBorders
/>
)
Props
アクセシビリティ
Tableは、アクセシビリティに関してWAI-ARIA - Table Patternに従います。
tablePropsにaria-labelを設定すると、スクリーンリーダーによって読み上げられます。
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
tableProps={{ "aria-label": "User list" }}
/>
)
キーボード操作
| キー | 説明 | 状態 |
|---|---|---|
ArrowLeft | フォーカスを左のセルに1つ移動します。行の一番左のセルにフォーカスがある場合、フォーカスは移動しません。 | - |
ArrowRight | フォーカスを右のセルに1つ移動します。行の一番右のセルにフォーカスがある場合、フォーカスは移動しません。 | - |
ArrowUp | フォーカスを上のセルに1つ移動します。列の一番上のセルにフォーカスがある場合、フォーカスは移動しません。 | - |
ArrowDown | フォーカスを下のセルに1つ移動します。列の一番下のセルにフォーカスがある場合、フォーカスは移動しません。 | - |
Home | フォーカスのある行の最初のセルにフォーカスを移動します。 | - |
End | フォーカスのある行の最後のセルにフォーカスを移動します。 | - |
PageUp | 前のページに移動します。 | enablePagination={true} |
PageDown | 次のページに移動します。 | enablePagination={true} |
ARIAロールと属性
| 要素 | ロールと属性 | 使い方 |
|---|---|---|
table.ui-native-table__root | role="grid" | グリッドであることを示します。 |
aria-rowcount | テーブルの行数を示します。 | |
aria-colcount | テーブルの列数を示します。 | |
aria-multiselectable | enableRowSelectionが設定されている場合は"true"を設定します。 | |
thead.ui-native-table__thead | role="rowgroup" | 行グループであることを示します。 |
tr.ui-native-table__tr | role="row" | 行であることを示します。 |
aria-rowindex | 行がテーブルの何行目であるかを示します。 | |
aria-disabled | enableRowSelectionを関数で設定し、falseの行には"true"を設定します。 | |
aria-selected | 行が選択されている場合は"true"を設定し、未選択の場合は"false"を設定します。 | |
th.ui-native-table__th | role="columnheader" | カラムヘッダーであることを示します。 |
aria-rowindex | 行がテーブルの何行目であるかを示します。 | |
aria-colindex | 列がテーブルの何列目であるかを示します。 | |
aria-sort | 列が昇順の場合は"ascending"を設定し、降順の場合は"descending"を設定、指定がない場合は"none"を設定します。 | |
tbody.ui-native-table__tbody | role="rowgroup" | 行グループであることを示します。 |
td.ui-native-table__td | role="gridcell" | グリッドセルであることを示します。 |
aria-colindex | 列がテーブルの何列目であるかを示します。 | |
aria-rowindex | 行がテーブルの何行目であるかを示します。 | |
tfoot.ui-native-table__tfoot | role="rowgroup" | 行グループであることを示します。 |
label.ui-checkbox__root > input | aria-label | ヘッダーの場合は"すべての行を選択する"、それ以外の行の場合は"行を選択する"を設定します。 |
th.ui-native-table__th > button | aria-label | 列が昇順の場合は"昇順でソートする"を設定し、降順の場合は"降順でソートする"を設定、指定がない場合は"ソートを解除する"を設定します。 |
類似のコンポーネント
NativeTable
NativeTableは、データを効率的に整理して表示するコンポーネントです。
Stat
Statは、数値やデータをボックス内に表示するために使用されます。
AreaChart
AreaChartは、複数のデータを比較するためのエリアチャートを描画するコンポーネントです。
Badge
Badgeは、アイテムのステータスを強調表示して、すぐに認識できるようにするコンポーネントです。
BarChart
BarChartは、複数のデータを比較するための棒グラフを描画するコンポーネントです。
Bubble
Bubbleは、会話の内容をメッセージの吹き出しで表示するコンポーネントです。
Card
Cardは、関連する情報をグループ化して表示するコンポーネントです。デフォルトでは、article要素をレンダリングします。
ComposedChart
ComposedChartは、複数のデータを比較するための複合チャートを描画するコンポーネントです。