Table
Tableは、列のソートや行の選択やクリックイベント機能を備えたテーブルのコンポーネントです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Napoleon | Hackett | 58 | Tina44@yahoo.com |
| 1 | Annette | Kuhlman | 21 | Brain22@yahoo.com |
| 2 | Ramon | Morar | 31 | Sabrina_Nienow@yahoo.com |
| 3 | Sue | Larson | 19 | Mariano91@yahoo.com |
| 4 | Desiree | Strosin | 49 | Jeanne.Crist57@gmail.com |
| 5 | Jerrell | Bechtelar | 31 | Angelina.Nicolas@yahoo.com |
| 6 | Fredrick | Daugherty | 19 | Benny_Franecki44@hotmail.com |
| 7 | Rodrick | Walter | 48 | Natalie_Lemke69@hotmail.com |
| 8 | Lindsey | Schimmel | 51 | Helen7@hotmail.com |
| 9 | Eula | Jacobi | 49 | Patti71@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 | Berta | Moen | 41 | Warren95@yahoo.com |
| 1 | Keith | Kling | 48 | Clayton.Wolff@hotmail.com |
| 2 | Elbert | Shanahan | 64 | Annette99@hotmail.com |
| 3 | Raul | Pfannerstill | 47 | Claud.Reichel2@yahoo.com |
| 4 | Sterling | Kuhic | 49 | Stephen.Harber@yahoo.com |
| 5 | Wm | Robel | 25 | Nova_Runolfsdottir@hotmail.com |
| 6 | Antonia | Auer | 38 | Nancy_Fahey@yahoo.com |
| 7 | Darin | Marquardt | 64 | Joy_Schaefer12@hotmail.com |
| 8 | Vita | Carter | 30 | Weston.Gulgowski-Toy@yahoo.com |
| 9 | Rosalie | Gerhold | 39 | Terrance.Huels91@gmail.com |
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Berta | Moen | 41 | Warren95@yahoo.com |
| 1 | Keith | Kling | 48 | Clayton.Wolff@hotmail.com |
| 2 | Elbert | Shanahan | 64 | Annette99@hotmail.com |
| 3 | Raul | Pfannerstill | 47 | Claud.Reichel2@yahoo.com |
| 4 | Sterling | Kuhic | 49 | Stephen.Harber@yahoo.com |
| 5 | Wm | Robel | 25 | Nova_Runolfsdottir@hotmail.com |
| 6 | Antonia | Auer | 38 | Nancy_Fahey@yahoo.com |
| 7 | Darin | Marquardt | 64 | Joy_Schaefer12@hotmail.com |
| 8 | Vita | Carter | 30 | Weston.Gulgowski-Toy@yahoo.com |
| 9 | Rosalie | Gerhold | 39 | Terrance.Huels91@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 | Janet | Shields-Smith | 60 | Kyler.Davis31@hotmail.com |
| 1 | Stone | Lind-Goldner | 42 | Elsie49@gmail.com |
| 2 | Oscar | Ullrich | 41 | Rachael.Walter@gmail.com |
| 3 | Dorcas | McClure | 64 | Hazel_Kub@gmail.com |
| 4 | Karlee | Waters | 61 | Mona.Trantow@hotmail.com |
| 5 | Adolf | Pouros | 41 | Anthony_Hagenes@gmail.com |
| 6 | Ramon | Lesch | 29 | Roland.Yundt@gmail.com |
| 7 | Grant | Mayer | 30 | Jenny_Sauer@yahoo.com |
| 8 | Joshua | Lindgren | 55 | Maureen_Kassulke71@hotmail.com |
| 9 | Francesca | Rohan | 57 | Ivan41@gmail.com |
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Janet | Shields-Smith | 60 | Kyler.Davis31@hotmail.com |
| 1 | Stone | Lind-Goldner | 42 | Elsie49@gmail.com |
| 2 | Oscar | Ullrich | 41 | Rachael.Walter@gmail.com |
| 3 | Dorcas | McClure | 64 | Hazel_Kub@gmail.com |
| 4 | Karlee | Waters | 61 | Mona.Trantow@hotmail.com |
| 5 | Adolf | Pouros | 41 | Anthony_Hagenes@gmail.com |
| 6 | Ramon | Lesch | 29 | Roland.Yundt@gmail.com |
| 7 | Grant | Mayer | 30 | Jenny_Sauer@yahoo.com |
| 8 | Joshua | Lindgren | 55 | Maureen_Kassulke71@hotmail.com |
| 9 | Francesca | Rohan | 57 | Ivan41@gmail.com |
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Janet | Shields-Smith | 60 | Kyler.Davis31@hotmail.com |
| 1 | Stone | Lind-Goldner | 42 | Elsie49@gmail.com |
| 2 | Oscar | Ullrich | 41 | Rachael.Walter@gmail.com |
| 3 | Dorcas | McClure | 64 | Hazel_Kub@gmail.com |
| 4 | Karlee | Waters | 61 | Mona.Trantow@hotmail.com |
| 5 | Adolf | Pouros | 41 | Anthony_Hagenes@gmail.com |
| 6 | Ramon | Lesch | 29 | Roland.Yundt@gmail.com |
| 7 | Grant | Mayer | 30 | Jenny_Sauer@yahoo.com |
| 8 | Joshua | Lindgren | 55 | Maureen_Kassulke71@hotmail.com |
| 9 | Francesca | Rohan | 57 | Ivan41@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 | Brandi | Beer | 38 | Clay.Langosh-Hoeger71@hotmail.com |
| 1 | Doris | Greenfelder | 63 | Maximilian87@gmail.com |
| 2 | Sergio | King | 61 | Eleonore_Jacobi32@yahoo.com |
| 3 | Moshe | Turner | 57 | Bailee_Hansen@yahoo.com |
| 4 | Bill | Collins | 32 | Darrel.Hahn7@hotmail.com |
| 5 | Teri | Maggio | 35 | Estell_Hauck@yahoo.com |
| 6 | Oliver | Stracke | 40 | Marisol_Lemke78@hotmail.com |
| 7 | Wilbur | Turcotte | 42 | Ronald_Macejkovic@yahoo.com |
| 8 | Clemmie | Corwin | 55 | Trever.Little@yahoo.com |
| 9 | Sylvia | Bergstrom | 59 | Hal_Hessel@gmail.com |
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Brandi | Beer | 38 | Clay.Langosh-Hoeger71@hotmail.com |
| 1 | Doris | Greenfelder | 63 | Maximilian87@gmail.com |
| 2 | Sergio | King | 61 | Eleonore_Jacobi32@yahoo.com |
| 3 | Moshe | Turner | 57 | Bailee_Hansen@yahoo.com |
| 4 | Bill | Collins | 32 | Darrel.Hahn7@hotmail.com |
| 5 | Teri | Maggio | 35 | Estell_Hauck@yahoo.com |
| 6 | Oliver | Stracke | 40 | Marisol_Lemke78@hotmail.com |
| 7 | Wilbur | Turcotte | 42 | Ronald_Macejkovic@yahoo.com |
| 8 | Clemmie | Corwin | 55 | Trever.Little@yahoo.com |
| 9 | Sylvia | Bergstrom | 59 | Hal_Hessel@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 | Medhurst | 32 | Raymond.Schmeler@hotmail.com |
| 1 | Neal | Wilkinson | 32 | Jovanny30@hotmail.com |
| 2 | Aric | Runte | 23 | Monique.Schiller@gmail.com |
| 3 | Eldon | Bednar | 37 | Jade77@yahoo.com |
| 4 | Diane | Greenholt | 19 | Leon_Bernhard@hotmail.com |
| 5 | Giovanna | Botsford | 33 | Christelle86@hotmail.com |
| 6 | Renee | Rogahn | 23 | Leola68@hotmail.com |
| 7 | Maximus | Prosacco | 60 | Ed63@gmail.com |
| 8 | Buck | Bergstrom | 61 | Erica.Little80@yahoo.com |
| 9 | Patsy | Barton | 28 | Leland_Lemke13@yahoo.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} withBorder withScrollArea />
列の区切り線を追加する
列の区切り線を追加する場合は、withColumnBordersをtrueにします。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Reymundo | Wehner | 32 | Silvia_Russel99@gmail.com |
| 1 | Savanna | Lueilwitz | 62 | Julia_Ratke45@gmail.com |
| 2 | Vicenta | Bode | 54 | Tierra58@hotmail.com |
| 3 | Karl | Berge | 57 | Pierre_Schiller13@yahoo.com |
| 4 | Toney | Cassin | 30 | Francis.Walker85@gmail.com |
| 5 | Xzavier | Hirthe | 60 | Maryjane.Rowe76@yahoo.com |
| 6 | Asa | Daniel | 25 | Susana3@hotmail.com |
| 7 | Kay | Quigley | 37 | Amparo_Gleichner@yahoo.com |
| 8 | Andrew | Haag | 64 | Enoch57@gmail.com |
| 9 | Marielle | Champlin | 28 | Krystal_Hansen@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} withColumnBorders withScrollArea />
行がホバーされたときにハイライトする
行がホバーされたときにハイライトする場合は、highlightOnHoverをtrueにします。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Regina | Swift | 35 | Torey_Bayer3@hotmail.com |
| 1 | Domingo | Durgan | 54 | Aditya85@gmail.com |
| 2 | Clifton | Zieme | 36 | Scott_Nikolaus@hotmail.com |
| 3 | Wade | Lockman | 39 | Mac56@yahoo.com |
| 4 | Leatha | Cummerata | 27 | Natalia.Beer@yahoo.com |
| 5 | Elisa | Dicki | 24 | Kasey22@yahoo.com |
| 6 | Jeremy | Stanton | 33 | Carroll.Purdy0@yahoo.com |
| 7 | Gus | Hane | 42 | Diana_Hoppe@gmail.com |
| 8 | Lindsey | Hilpert | 35 | Irene.Orn@gmail.com |
| 9 | Bennett | Kihn | 61 | Frances_Friesen72@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} highlightOnHover withScrollArea />
ストライプを使う
ストライプを使う場合は、stripedをtrueにします。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Madeline | DuBuque | 34 | Stanton.Schuppe@gmail.com |
| 1 | Emerald | Wisozk | 41 | Zola.Kovacek74@yahoo.com |
| 2 | Markus | Ortiz | 38 | Damon83@hotmail.com |
| 3 | Orville | Dare | 56 | Naomie.Bednar@yahoo.com |
| 4 | Judith | Ortiz | 41 | Eliezer.Douglas@yahoo.com |
| 5 | Gina | Huels | 53 | Jacey_Will27@hotmail.com |
| 6 | Adolphus | Simonis | 56 | Tomasa.Reilly@yahoo.com |
| 7 | Florence | Hauck | 32 | Dayna.Welch@hotmail.com |
| 8 | Reanna | Jacobson | 41 | Zoila87@yahoo.com |
| 9 | Elisabeth | Hoppe | 19 | Jedidiah96@gmail.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 | Dulce | Fay | 31 | Guillermo_Abshire@yahoo.com | 948.788.4992 x33975 | user | active | 1/21/2026 | 8/10/2025 |
| 1 | Lenny | Haley | 42 | Jaycee47@hotmail.com | 1-880-576-9546 | admin | inactive | 1/7/2026 | 5/20/2026 |
| 2 | Jovanny | Larkin | 48 | Larry31@yahoo.com | 759.679.9367 x8873 | user | inactive | 2/24/2026 | 7/25/2026 |
| 3 | Marsha | Murazik | 64 | Louis_Ratke7@hotmail.com | 691.708.5029 x87145 | user | inactive | 8/16/2025 | 6/8/2026 |
| 4 | Maryann | Hermann | 34 | Dock.Ankunding2@gmail.com | 1-519-741-2226 x838 | admin | active | 11/27/2025 | 5/8/2026 |
| 5 | Judy | Swift | 34 | Rebekah86@yahoo.com | 1-288-374-4160 | admin | active | 12/9/2025 | 6/23/2026 |
| 6 | Antoinette | Hills | 18 | Lucy.Schmeler@hotmail.com | (235) 448-7990 | user | active | 9/30/2025 | 6/26/2026 |
| 7 | Tate | Williamson | 63 | Duane.Schimmel63@gmail.com | (269) 772-3249 x79843 | user | inactive | 7/28/2026 | 3/10/2026 |
| 8 | Annie | Johnston | 60 | Ollie_Schuppe@yahoo.com | 1-557-494-8054 | admin | inactive | 10/1/2025 | 5/23/2026 |
| 9 | Dora | Cummings | 63 | Evan.Gottlieb@yahoo.com | 283-754-5757 x7874 | user | inactive | 7/7/2026 | 9/20/2025 |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columnsFull} data={data} withScrollArea />
ヘッダーグループ
| id | user | |||
|---|---|---|---|---|
| name | age | |||
| firstName | lastName | |||
| 0 | Brenda | Keebler | 37 | Xavier.Moore60@yahoo.com |
| 1 | Neil | Goodwin | 43 | Patricia.Blick77@gmail.com |
| 2 | Everett | Spinka | 53 | Ezequiel_Fritsch87@yahoo.com |
| 3 | Daphney | Schoen | 37 | Geraldine_Steuber99@yahoo.com |
| 4 | Arnaldo | Torp | 20 | Meghan59@gmail.com |
| 5 | Casimer | Turner | 40 | Cornelius.Raynor@gmail.com |
| 6 | Caesar | Ebert | 36 | Adalberto68@yahoo.com |
| 7 | Leona | Dickens | 59 | Anna_Durgan@hotmail.com |
| 8 | Darren | Ortiz | 53 | Roscoe_Block-Goldner@hotmail.com |
| 9 | Meredith | Padberg | 60 | Jeannie.Gislason@yahoo.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 | Jamarcus | Keebler | 60 | Mark_Mante@gmail.com |
| 1 | Reva | Klocko | 65 | Justin.Keeling13@yahoo.com |
| 2 | Brandy | Gerlach | 53 | Adolphus.Vandervort@yahoo.com |
| 3 | Flavio | Wisozk | 65 | Cassandre.Aufderhar@hotmail.com |
| 4 | Traci | Steuber-Nicolas | 49 | Jade_Kuvalis@yahoo.com |
| 5 | Cali | Marks | 56 | Randal23@gmail.com |
| 6 | Reta | O'Keefe | 37 | Andre_Heidenreich@hotmail.com |
| 7 | Ron | Wintheiser | 64 | Ernie_Wolf74@yahoo.com |
| 8 | Renee | Murazik | 32 | Brock29@gmail.com |
| 9 | Savannah | Glover | 39 | Charlene.Jakubowski41@gmail.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 | Natalie | Bartell | 54 | Prudence_Nader@hotmail.com |
| 1 | Crystal | Smith | 44 | Samuel30@yahoo.com |
| 2 | Iris | Bogisich | 44 | Angelina.Satterfield@yahoo.com |
| 3 | Mabel | Heidenreich-Purdy | 61 | Maria_Metz@yahoo.com |
| 4 | Van | Wilkinson | 29 | Georgianna_Bogan95@yahoo.com |
| 5 | Rosie | Effertz | 63 | Chester_Mitchell21@yahoo.com |
| 6 | Nona | Kuphal | 56 | Candace_Weissnat84@hotmail.com |
| 7 | Dale | Glover | 62 | Billy79@yahoo.com |
| 8 | Rosemary | Stark | 28 | Will.Spencer@hotmail.com |
| 9 | Queenie | Little | 40 | Erin99@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 | Annamarie | Kuphal | 51 | Leonor.Kohler@yahoo.com |
| 1 | Dean | Predovic | 56 | Erika54@yahoo.com |
| 2 | Eunice | Schinner | 35 | Glen_Wuckert@hotmail.com |
| 3 | Eduardo | Kovacek | 36 | Payton.Leuschke@hotmail.com |
| 4 | Gerhard | Anderson | 58 | David.Maggio49@hotmail.com |
| 5 | Simon | Heller | 42 | Cody_Stehr@yahoo.com |
| 6 | Santa | Stracke | 52 | Andy33@gmail.com |
| 7 | Lauretta | Hintz | 21 | Ottilie98@gmail.com |
| 8 | Catherine | Hegmann | 18 | Chris_Schoen@yahoo.com |
| 9 | Alvin | Glover | 21 | Leo_OConnell@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 | Laverne | Fisher | 62 | Franklin39@gmail.com |
| 1 | Flora | Hudson | 36 | Ophelia.Collier@gmail.com |
| 2 | Ross | Goyette | 32 | Viola15@yahoo.com |
| 3 | Patty | Jakubowski | 27 | Cielo10@yahoo.com |
| 4 | Merle | Douglas | 49 | Leonardo_Adams17@hotmail.com |
| 5 | Tanya | Weber | 39 | Alvin36@yahoo.com |
| 6 | Paxton | McGlynn | 46 | Braden_Hintz63@yahoo.com |
| 7 | Michelle | Rempel | 43 | Kyla.Leannon@hotmail.com |
| 8 | Alice | McGlynn | 57 | Alvera_McClure46@yahoo.com |
| 9 | Steve | Fritsch | 27 | Selina.Gerhold@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 | Zaria | Beier | 50 | Victoria_Stracke@yahoo.com |
| 1 | Noble | VonRueden | 26 | Damon_Jast29@gmail.com |
| 2 | Kyle | Bogan | 47 | Krystal43@yahoo.com |
| 3 | Estrella | Harris | 37 | Lela_Cartwright69@hotmail.com |
| 4 | Adrain | Brakus | 32 | Jerald49@yahoo.com |
| 5 | Nadine | McGlynn | 31 | Scott_Gorczany60@hotmail.com |
| 6 | Eileen | Osinski | 38 | Hugh.Keeling@gmail.com |
| 7 | Taurean | Schaefer-Stamm | 45 | Tonya.Ward92@hotmail.com |
| 8 | Alyssa | Boyer | 56 | Oliver.Ward@yahoo.com |
| 9 | Leonel | King | 57 | Fernando_Nitzsche95@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
onRowDoubleClick={(row) => console.log(row)}
withScrollArea
/>
)
"use client"をファイルの上部に追加する必要があります。デフォルトのソートを設定する
デフォルトのソートを設定する場合は、defaultSortingに配列を設定します。配列のオブジェクトには、ソートをする列のidと方向を設定します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 3 | Lulu | Lind | 54 | Caroline_Tremblay86@hotmail.com |
| 2 | Lily | Sanford | 51 | Libby.Klocko-Olson0@gmail.com |
| 7 | Kailee | Douglas | 51 | Martine.Kuhic30@hotmail.com |
| 9 | Camylle | Conroy | 51 | Sergio96@yahoo.com |
| 4 | Lila | Stamm | 46 | Seth24@gmail.com |
| 1 | Emanuel | Heller | 35 | Boris.Streich30@hotmail.com |
| 5 | Dewey | Howell | 33 | Griffin_Kessler15@yahoo.com |
| 8 | Alexander | Funk | 29 | Danielle.Johns57@yahoo.com |
| 6 | Eva | Rutherford | 28 | Jim_Runte@hotmail.com |
| 0 | Kenton | O'Connell | 21 | Orville.McClure@gmail.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 | Eldred | Spinka | 56 | Roland_Wilkinson56@hotmail.com |
| 1 | Kenny | Dietrich | 64 | Dominic_Durgan@gmail.com |
| 2 | Elijah | Towne | 55 | Maryam3@hotmail.com |
| 3 | Floy | Medhurst | 26 | Sonja_Lang95@hotmail.com |
| 4 | Hulda | Cassin | 18 | Yasmine_Doyle24@yahoo.com |
| 5 | Alison | Reichert | 46 | Rose.Gutmann@hotmail.com |
| 6 | Florencio | Franey | 34 | Faye_Wiegand@gmail.com |
| 7 | Rhiannon | Purdy | 25 | Ellen_McClure-Thompson@gmail.com |
| 8 | Sallie | Grimes | 62 | Franklin.Bins44@hotmail.com |
| 9 | Shirley | Bauch | 22 | Bert99@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table columns={columns} data={data} enableSorting={false} withScrollArea />
)
複数列のソートを無効にする
複数列のソートを無効にする場合は、enableMultiSortをfalseに設定します。デフォルトは、trueです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Cameron | Okuneva | 45 | Mable_Erdman36@yahoo.com |
| 1 | Marty | Ullrich | 21 | Herbert98@gmail.com |
| 2 | Wm | Berge | 30 | Caitlyn_Blanda@yahoo.com |
| 3 | Cheryl | Beatty | 63 | Carrie_Halvorson@yahoo.com |
| 4 | Eva | Berge | 47 | Enos_Hodkiewicz61@yahoo.com |
| 5 | Winston | Kozey | 41 | Maddison.Bednar59@hotmail.com |
| 6 | Oral | Bailey | 59 | Lori_Predovic@yahoo.com |
| 7 | Wade | MacGyver | 59 | Idella_Cronin80@yahoo.com |
| 8 | Garrett | Flatley | 38 | Timothy35@hotmail.com |
| 9 | Angela | Dare | 35 | Rosemarie67@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table columns={columns} data={data} enableMultiSort={false} withScrollArea />
)
最大のソート可能な列数を設定する
最大のソート可能な列数を設定する場合は、maxMultiSortColCountに数値を設定します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Antwan | Carroll | 40 | Omar_Lang57@gmail.com |
| 1 | Devante | Doyle | 37 | Peggy36@yahoo.com |
| 2 | Chaim | Green | 44 | Kellen_Smitham@gmail.com |
| 3 | Russel | Harris | 36 | Andreanne.Ziemann2@yahoo.com |
| 4 | Larue | Cummerata-Bradtke | 48 | Vivian83@hotmail.com |
| 5 | Marcelino | Grimes | 45 | Angelica56@gmail.com |
| 6 | Ernestine | Langworth | 54 | Kennith61@hotmail.com |
| 7 | Aurore | Weissnat | 55 | Claud48@hotmail.com |
| 8 | Earnest | Torphy | 38 | Dock26@gmail.com |
| 9 | Chaz | Stanton | 42 | Aryanna10@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
maxMultiSortColCount={2}
withScrollArea
/>
)
手動のソートを使う
手動のソートを使う場合は、manualSortingをtrueに設定します。デフォルトは、falseです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Lisa | Crooks | 41 | Doris.Koch@hotmail.com |
| 1 | Anabel | Ankunding | 28 | Zita21@hotmail.com |
| 2 | Gilbert | Buckridge | 50 | Amanda_Schroeder@yahoo.com |
| 3 | Sherri | Johnston-Dickens | 40 | Santos39@gmail.com |
| 4 | Nettie | Nader | 46 | Jordi_Murray@hotmail.com |
| 5 | Cecilia | Ullrich | 49 | Abdullah_Christiansen64@hotmail.com |
| 6 | Shari | Stroman | 39 | Julio_Beahan@gmail.com |
| 7 | Angelina | Torp | 21 | Audra1@hotmail.com |
| 8 | Chyna | Glover | 50 | Frances_Jacobi25@yahoo.com |
| 9 | Burnice | Paucek | 21 | Stephanie.Bergnaum94@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 | Desiree | Mayert | 36 | Jerome20@gmail.com |
| 1 | Dorothea | Bednar | 23 | Lisette99@hotmail.com |
| 2 | Nicolas | Hackett | 32 | Joany88@yahoo.com |
| 3 | Nels | Zboncak | 42 | Joy.Rice@yahoo.com |
| 4 | Vernie | Stokes | 62 | Bennie.Wehner@hotmail.com |
| 5 | Olaf | Keebler | 30 | Courtney_Bogisich@hotmail.com |
| 6 | Jake | Prohaska | 44 | Kylee_Paucek@yahoo.com |
| 7 | Lukas | Abshire | 24 | Cory76@gmail.com |
| 8 | Parker | Brown | 26 | Adonis_Botsford4@yahoo.com |
| 9 | Christop | O'Reilly | 52 | Edwardo_Zboncak@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} sortDescFirst withScrollArea />
ソートを制御する
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Saul | Considine | 44 | Kendra90@hotmail.com |
| 1 | Sigmund | Schultz | 39 | Crystal53@gmail.com |
| 2 | Stewart | Mayer | 62 | Regina_Raynor65@hotmail.com |
| 3 | Ross | Kirlin-Rosenbaum | 42 | Opal.Cormier@hotmail.com |
| 4 | Brad | Rosenbaum | 18 | Nettie_Halvorson38@hotmail.com |
| 5 | Norene | Stehr | 19 | Kiana.King-Waters@gmail.com |
| 6 | Clifford | Kirlin | 37 | Sally_Gislason44@yahoo.com |
| 7 | Salvatore | Kovacek | 21 | Tyler.Emard98@gmail.com |
| 8 | Sharon | Wunsch | 42 | Matilde27@hotmail.com |
| 9 | Ofelia | Pacocha | 45 | Isom.Christiansen8@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 | Drew | Mueller | 25 | Janessa.Daniel-Wuckert98@gmail.com |
| 1 | Janie | Gleichner | 24 | Karla32@hotmail.com |
| 2 | Saul | Dickens | 25 | Gwendolyn69@gmail.com |
| 3 | Hassie | Breitenberg | 24 | Marguerite_Nitzsche53@gmail.com |
| 4 | Leo | Lebsack | 44 | Thelma_Hintz@yahoo.com |
| 5 | Sherman | Keebler | 36 | Roy.Cormier@hotmail.com |
| 6 | Deven | Romaguera | 55 | Ivy32@hotmail.com |
| 7 | Flavio | Hackett | 25 | Clara0@hotmail.com |
| 8 | Diana | Hirthe | 25 | Toni_Rath@yahoo.com |
| 9 | Agnes | Zemlak | 33 | Donny_Bayer90@gmail.com |
| 10 | Angelo | Schulist | 64 | Caden79@hotmail.com |
| 11 | Bryant | Gottlieb | 59 | Alfonso_McClure31@gmail.com |
| 12 | Clarabelle | Moore | 27 | Susan60@yahoo.com |
| 13 | Alma | Gottlieb | 52 | Tricia_Cummerata@hotmail.com |
| 14 | Fannie | Funk | 22 | Manuel_Gusikowski@hotmail.com |
| 15 | Glenn | Hand | 56 | Doyle_Marquardt@gmail.com |
| 16 | Bertha | Moore | 31 | Amber.Kassulke81@gmail.com |
| 17 | Darion | Conn | 52 | Dedric.Rowe93@hotmail.com |
| 18 | Clifton | Lemke | 29 | Sydney_Mayer@yahoo.com |
| 19 | Adolphus | Wintheiser | 56 | Carli_Waelchi@gmail.com |
const { t } = useI18n("table")
const data = useMemo<TableData[]>(() => createTableData(40), [])
return (
<VStack>
<Table
columns={columns}
data={data}
enablePagination
footer={(table) => {
const page = table.getState().pagination.pageIndex + 1
const pageSize = table.getState().pagination.pageSize
const total = table.getPageCount()
return (
<Grid templateColumns="1fr 1fr 1fr" w="full">
<Pagination.Root
size={{ base: "sm", sm: "xs" }}
gridColumn="2 / 3"
page={page}
total={total}
onChange={(page) => table.setPageIndex(page - 1)}
/>
<Select.Root
size={{ base: "sm", sm: "xs" }}
aria-label={t("Page size")}
items={[
{ label: "10", value: "10" },
{ label: "20", value: "20" },
{ label: "30", value: "30" },
{ label: "40", value: "40" },
{ label: "50", value: "50" },
]}
value={pageSize.toString()}
rootProps={{ justifySelf: "end", w: "5xs" }}
onChange={(value) => table.setPageSize(Number(value))}
/>
</Grid>
)
}}
withScrollArea
/>
</VStack>
)
"use client"をファイルの上部に追加する必要があります。デフォルトのページインデックスとページサイズを設定する
デフォルトのページインデックスとページサイズを設定する場合は、defaultPaginationにオブジェクトを設定します。オブジェクトには、pageIndexとpageSizeを設定します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 10 | Darin | Pfannerstill | 34 | Carroll51@yahoo.com |
| 11 | Stephen | Gutmann | 61 | Ian_Borer@yahoo.com |
| 12 | Karolann | Hammes | 19 | Willis.Turcotte68@gmail.com |
| 13 | Lori | Gibson | 30 | Rico91@hotmail.com |
| 14 | Jayson | Glover-Ritchie | 58 | Trycia83@yahoo.com |
| 15 | Sadie | O'Reilly | 47 | Francisco.Kuvalis34@gmail.com |
| 16 | Ross | Miller | 28 | Nelda6@gmail.com |
| 17 | Gordon | Swift | 64 | Vincenza42@hotmail.com |
| 18 | Kara | Steuber | 51 | Derek44@hotmail.com |
| 19 | Christian | Kiehn | 23 | Esther_Ward21@hotmail.com |
const { t } = useI18n("table")
const data = useMemo<TableData[]>(() => createTableData(20), [])
return (
<VStack>
<Table
columns={columns}
data={data}
enablePagination
defaultPagination={{ pageIndex: 1, pageSize: 10 }}
footer={(table) => {
const page = table.getState().pagination.pageIndex + 1
const pageSize = table.getState().pagination.pageSize
const total = table.getPageCount()
return (
<Grid templateColumns="1fr 1fr 1fr" w="full">
<Pagination.Root
size={{ base: "sm", sm: "xs" }}
gridColumn="2 / 3"
page={page}
total={total}
onChange={(page) => table.setPageIndex(page - 1)}
/>
<Select.Root
size={{ base: "sm", sm: "xs" }}
aria-label={t("Page size")}
items={[
{ label: "10", value: "10" },
{ label: "20", value: "20" },
{ label: "30", value: "30" },
{ label: "40", value: "40" },
{ label: "50", value: "50" },
]}
value={pageSize.toString()}
rootProps={{ justifySelf: "end", w: "5xs" }}
onChange={(value) => table.setPageSize(Number(value))}
/>
</Grid>
)
}}
withScrollArea
/>
</VStack>
)
"use client"をファイルの上部に追加する必要があります。手動のページネーションを使う
手動のページネーションを使う場合は、manualPaginationをtrueに設定します。デフォルトは、falseです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Holly | Lind | 24 | Roosevelt_Krajcik@gmail.com |
| 1 | Marcos | Dietrich | 28 | Elbert_Walsh@gmail.com |
| 2 | Anissa | Shields | 33 | Molly29@gmail.com |
| 3 | Matilde | Kertzmann | 18 | Della62@yahoo.com |
| 4 | Cynthia | Kertzmann | 51 | Annamae.Prohaska@gmail.com |
| 5 | Cecil | Boyle | 61 | Lucille_Abbott@yahoo.com |
| 6 | Johanna | Grant | 39 | Rene_Murphy@yahoo.com |
| 7 | Jeannette | Hoppe | 18 | Florence.Wuckert-Watsica39@gmail.com |
| 8 | Ned | Nader | 19 | Remington51@yahoo.com |
| 9 | Lyle | Armstrong | 37 | Darron.Hahn11@yahoo.com |
| 10 | Stefan | Franecki | 61 | Abe_Stanton7@yahoo.com |
| 11 | Llewellyn | Kling | 29 | Deanna96@yahoo.com |
| 12 | Erick | Davis | 58 | Denis_Christiansen-Hodkiewicz@yahoo.com |
| 13 | Darin | Bednar | 62 | Henrietta.Reynolds@gmail.com |
| 14 | Rhea | Heller | 56 | Brendan10@gmail.com |
| 15 | Rebekah | Kihn | 31 | Julia73@yahoo.com |
| 16 | Latoya | Beatty | 62 | Berniece88@gmail.com |
| 17 | Moises | Dicki | 65 | Bart.Gleichner0@hotmail.com |
| 18 | Beatrice | Wilkinson-Conroy | 23 | Sammy.Grant52@yahoo.com |
| 19 | Milo | Nicolas | 18 | Iva51@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 | Bernie | Jakubowski | 26 | Sabrina30@hotmail.com |
| 1 | Shari | Prosacco | 62 | Marina40@gmail.com |
| 2 | Patricia | Schroeder | 43 | Tod82@gmail.com |
| 3 | Hannah | Schmidt | 27 | Leif_Langworth6@yahoo.com |
| 4 | Alden | Huel | 48 | Corrine68@gmail.com |
| 5 | Sammy | Heidenreich | 35 | Maymie24@gmail.com |
| 6 | Augustus | Will | 50 | Jayson.Nicolas55@gmail.com |
| 7 | Madonna | Gusikowski | 58 | Cornell_Heidenreich@gmail.com |
| 8 | Marge | McClure | 42 | Maryjane47@hotmail.com |
| 9 | Lydia | Powlowski | 58 | Nedra.Lindgren@yahoo.com |
| 10 | Beth | Hauck | 52 | Marjolaine.Reichert96@hotmail.com |
| 11 | Blake | Herman | 62 | Marilyn.Bailey@gmail.com |
| 12 | Greg | Buckridge | 58 | Carroll14@yahoo.com |
| 13 | Mattie | Wunsch | 65 | Liliane19@yahoo.com |
| 14 | Alphonso | Kozey | 51 | Orlo64@hotmail.com |
| 15 | Alexis | Treutel | 30 | Isaac_Hirthe82@yahoo.com |
| 16 | Glen | Leannon | 40 | Cesar.Rogahn1@yahoo.com |
| 17 | Melvina | O'Reilly | 62 | Hildegard_Dickens36@yahoo.com |
| 18 | Marta | Haley | 32 | Haven25@gmail.com |
| 19 | Sasha | Greenfelder | 23 | Tyrese_Gerhold@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 | Emma | Little-Hauck | 31 | Kyle45@yahoo.com | |
| 1 | Linnie | Turcotte | 61 | Devante_Beer@yahoo.com | |
| 2 | Martha | Roberts | 54 | Carolyne.Lemke@hotmail.com | |
| 3 | Felix | Ebert | 21 | Alfredo56@hotmail.com | |
| 4 | Toni | Graham-Grady | 46 | Kenny30@yahoo.com | |
| 5 | Retha | Frami | 31 | Mercedes.Kuhn@gmail.com | |
| 6 | Efrain | McLaughlin | 63 | Javier16@yahoo.com | |
| 7 | Spencer | Kulas | 56 | Gwendolyn58@gmail.com | |
| 8 | Bennett | VonRueden | 46 | Joe_Huel-Baumbach15@gmail.com | |
| 9 | Aric | Hirthe | 23 | Rafaela.Fritsch31@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return <Table columns={columns} data={data} enableRowSelection withScrollArea />
デフォルトの選択された行を設定する
デフォルトの選択された行を設定する場合は、defaultRowSelectionにdataのインデックスをキーとしたオブジェクトを設定します。
| id | firstName | lastName | age | ||
|---|---|---|---|---|---|
| 0 | Della | Reilly | 49 | Anita_Hoeger@gmail.com | |
| 1 | Dayne | Christiansen | 41 | Vickie.Emard@hotmail.com | |
| 2 | Gaston | Hoeger | 21 | Shyann48@hotmail.com | |
| 3 | Hugo | Raynor | 33 | Sarah42@gmail.com | |
| 4 | Ralph | Hintz | 62 | Lydia.Hoppe@gmail.com | |
| 5 | Eunice | Johns | 46 | Olaf.Runte@yahoo.com | |
| 6 | Bobby | Price | 26 | Frederik93@yahoo.com | |
| 7 | Maud | Mueller | 39 | Maxine.Wisozk-Cronin@hotmail.com | |
| 8 | Opal | Blick | 55 | Vernon.VonRueden20@hotmail.com | |
| 9 | Sabryna | Grady | 48 | Lelia4@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 | Maymie | Leannon | 63 | Ryder.Reilly77@yahoo.com | |
| 1 | Carol | Kuphal | 47 | Krystal_Schultz@yahoo.com | |
| 2 | Polly | Brown | 65 | Bertram25@hotmail.com | |
| 3 | Howell | Abernathy | 25 | Kelsi.Block@hotmail.com | |
| 4 | Hershel | Thompson | 24 | Ian_Kohler@hotmail.com | |
| 5 | Kaylah | Ebert | 62 | Fatima_Larkin@gmail.com | |
| 6 | Junior | Ondricka | 43 | Emerald83@hotmail.com | |
| 7 | Emmitt | Klocko | 42 | Audrey.Mraz@yahoo.com | |
| 8 | Jairo | Kutch | 35 | Alfonzo_Price@hotmail.com | |
| 9 | Megane | Stamm | 55 | Rolando94@yahoo.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableRowSelection
selectOnClickRow
withScrollArea
/>
)
チェックボックスを非表示にする
チェックボックスを非表示にする場合は、withCheckboxをfalseに設定します。デフォルトは、trueです。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Kenton | Crist | 52 | Chris_Brekke29@yahoo.com |
| 1 | Timmothy | O'Conner | 46 | Tony55@yahoo.com |
| 2 | Moses | Ullrich | 18 | Tanner_Schuppe@hotmail.com |
| 3 | Pete | Aufderhar | 60 | Edna_Bartoletti73@gmail.com |
| 4 | Leo | Reinger | 44 | Clifton61@gmail.com |
| 5 | Gregoria | Kling | 33 | Sigmund34@yahoo.com |
| 6 | Marian | Dicki | 29 | Alysson.Fay29@yahoo.com |
| 7 | Nathaniel | Langworth | 18 | Tanya_Cormier-Yundt@hotmail.com |
| 8 | Kelsi | Beier | 33 | Martha.Nolan75@gmail.com |
| 9 | Minerva | Goodwin | 59 | Ramon_Bednar16@hotmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableRowSelection
selectOnClickRow
withCheckbox={false}
withScrollArea
/>
)
行を無効にする
行を無効にする場合は、enableRowSelectionに条件の関数を設定します。
| id | firstName | lastName | age | ||
|---|---|---|---|---|---|
| 0 | Owen | Maggio | 48 | Lenora.Harris@hotmail.com | |
| 1 | Stephanie | Conroy | 28 | Bryana.Balistreri@hotmail.com | |
| 2 | Jay | Jenkins | 59 | Milford10@yahoo.com | |
| 3 | Audrey | Konopelski | 22 | Weldon_Ondricka91@hotmail.com | |
| 4 | Noel | Stark | 36 | Randolph_Hudson19@yahoo.com | |
| 5 | Jacob | McCullough | 42 | Geoffrey_Considine21@yahoo.com | |
| 6 | Jessica | Glover | 49 | Theo.Stanton@yahoo.com | |
| 7 | Bert | Connelly | 30 | Burnice73@yahoo.com | |
| 8 | Karianne | Franecki | 59 | Frank.Fahey@gmail.com | |
| 9 | Vilma | Graham | 27 | Lori_Schmeler@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 | Furman | Will | 38 | Justin_Ritchie29@hotmail.com | |
| 1 | Cicero | Bogisich | 51 | Whitney.Becker81@yahoo.com | |
| 2 | Dane | Buckridge | 35 | Maggie.Fisher14@hotmail.com | |
| 3 | Pedro | Fisher | 55 | Guy91@gmail.com | |
| 4 | Ferne | Littel | 55 | Hanna_Fadel-Kris36@hotmail.com | |
| 5 | Lavern | Lemke | 54 | Benny59@yahoo.com | |
| 6 | Leonard | Schmeler | 26 | Eino_Romaguera63@gmail.com | |
| 7 | Becky | Prohaska | 37 | Toby.Hoppe@gmail.com | |
| 8 | Luis | Bode | 46 | Lewis.Casper6@yahoo.com | |
| 9 | Milton | Gleason | 57 | Frankie_Walsh@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 | Kelli | Barton-Brown | 19 | Marcus35@gmail.com |
| 1 | Fletcher | MacGyver | 32 | Timmy.Gislason43@hotmail.com |
| 2 | Imogene | Swift | 39 | Laisha93@yahoo.com |
| 3 | Wilbur | Schmitt | 47 | Stevie_Braun-Jenkins@hotmail.com |
| 4 | Maxine | Murphy | 18 | Ayla_Spencer21@yahoo.com |
| 5 | Danny | Carter-Feil | 64 | Jacob_Conroy29@gmail.com |
| 6 | Glenda | Pouros | 37 | Jaylon_Cummerata69@yahoo.com |
| 7 | Onie | O'Kon | 38 | Cory_Rau78@yahoo.com |
| 8 | Schuyler | Ryan | 65 | Myrtie.Deckow@yahoo.com |
| 9 | Todd | Schimmel | 23 | Candace.Jacobs@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<VStack>
<Table
columns={columns}
data={data}
header={(table) => {
const value =
(table.getColumn("email")?.getFilterValue() as string | undefined) ??
""
return (
<InputGroup.Root>
<InputGroup.Element>
<SearchIcon />
</InputGroup.Element>
<Input
placeholder="Filter emails"
value={value}
onChange={(ev) =>
table.getColumn("email")?.setFilterValue(ev.target.value)
}
/>
</InputGroup.Root>
)
}}
withScrollArea
/>
</VStack>
)
"use client"をファイルの上部に追加する必要があります。デフォルトのフィルターを設定する
デフォルトのフィルターを設定する場合は、defaultColumnFiltersに配列を設定します。配列のオブジェクトには、フィルターする列のidと値を設定します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 1 | Damon | Wehner | 53 | Devan_Cruickshank@gmail.com |
| 7 | Grayce | Roberts | 64 | Ginger51@gmail.com |
| 9 | Cordelia | Gorczany | 65 | Camille.Runolfsdottir-Kunze63@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 | Natalia | Ziemann | 61 | Lucio84@yahoo.com |
| 1 | Sonia | Parker | 19 | Rowland_Kautzer64@gmail.com |
| 2 | Carlos | Douglas | 37 | Winfield_Ritchie53@yahoo.com |
| 3 | Bernice | Stark | 60 | Janie77@yahoo.com |
| 4 | Providenci | Collins | 65 | Ike_Hessel5@hotmail.com |
| 5 | Cornelius | Koss | 18 | Wilma.Murphy88@gmail.com |
| 6 | Constantin | Yost-Volkman | 23 | Eric_OConnell32@gmail.com |
| 7 | Nathaniel | Hyatt | 32 | Nicole.Stanton@yahoo.com |
| 8 | Ubaldo | Johnson | 36 | Glenda93@gmail.com |
| 9 | Cedric | Powlowski | 49 | Jena39@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 | Jillian | Medhurst | 38 | Ella_Morissette@hotmail.com |
| 1 | Ryan | Terry | 47 | Jason50@yahoo.com |
| 2 | Omari | Hermann | 24 | Duane75@gmail.com |
| 3 | Delores | Will | 58 | Bethel.Waters@hotmail.com |
| 4 | Clifford | Smitham | 18 | Daryl68@yahoo.com |
| 5 | Kenneth | Heathcote | 54 | Lorene78@hotmail.com |
| 6 | Esta | Heller | 23 | Edward57@yahoo.com |
| 7 | Lindsey | Halvorson | 65 | Darin_Wolff49@gmail.com |
| 8 | Danny | Stokes | 18 | Alta_Schamberger@yahoo.com |
| 9 | Ronald | Powlowski-Goyette | 28 | Donna_Cronin@gmail.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableColumnResizing
withBorder
withColumnBorders
/>
)
列のサイズ変更の方法を変更する
デフォルトでは、列のサイズ変更のタイミングは、ドラッグしている間に変更されます。ドラッグが終わったときに変更する場合は、columnResizeModeに"onEnd"を設定します。
| id | firstName | lastName | age | |
|---|---|---|---|---|
| 0 | Allie | Rippin-Padberg | 48 | Viva.Von@yahoo.com |
| 1 | Grover | King | 58 | Myles82@gmail.com |
| 2 | Zoie | Hane | 40 | Claudia.Beer@yahoo.com |
| 3 | Christophe | Schowalter | 39 | Elissa_OConnell5@yahoo.com |
| 4 | Karina | Jenkins-McCullough | 53 | Elijah.Rippin64@gmail.com |
| 5 | Frank | Jacobi | 41 | Bryon_Trantow@gmail.com |
| 6 | Jimmy | Wolf | 61 | Dustin_Heidenreich64@yahoo.com |
| 7 | Mindy | Goodwin | 38 | Andres43@yahoo.com |
| 8 | Lewis | Cruickshank | 33 | Velma.Kris64@gmail.com |
| 9 | Jared | Collins | 48 | Angelina60@yahoo.com |
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
enableColumnResizing
columnResizeMode="onEnd"
withBorder
withColumnBorders
/>
)
Props
アクセシビリティ
Tableは、アクセシビリティに関してWAI-ARIA - Table Patternに従います。
tablePropsにaria-labelを設定すると、スクリーンリーダーによって読み上げられます。
const data = useMemo<TableData[]>(() => createTableData(), [])
return (
<Table
columns={columns}
data={data}
tableProps={{ "aria-label": "User list" }}
/>
)
キーボード操作
| キー | 説明 | 状態 |
|---|---|---|
ArrowLeft | フォーカスを左のセルに1つ移動します。行の一番左のセルにフォーカスがある場合、フォーカスは移動しません。 | - |
ArrowRight | フォーカスを右のセルに1つ移動します。行の一番右のセルにフォーカスがある場合、フォーカスは移動しません。 | - |
ArrowUp | フォーカスを上のセルに1つ移動します。列の一番上のセルにフォーカスがある場合、フォーカスは移動しません。 | - |
ArrowDown | フォーカスを下のセルに1つ移動します。列の一番下のセルにフォーカスがある場合、フォーカスは移動しません。 | - |
Home | フォーカスのある行の最初のセルにフォーカスを移動します。 | - |
End | フォーカスのある行の最後のセルにフォーカスを移動します。 | - |
PageUp | 前のページに移動します。 | enablePagination={true} |
PageDown | 次のページに移動します。 | enablePagination={true} |
ARIAロールと属性
| 要素 | ロールと属性 | 使い方 |
|---|---|---|
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は、データ項目のリストを表示するために使用されます。