Éléments
Table
Un Table dispose quelques lignes que l’application écrit comme enfants (factures, récapitulatif, comparaison) et expose aux lecteurs d’écran un tableau : le tableau lui-même, des groupes de lignes, des lignes, des en-têtes de colonne et des cellules, chacun avec son rôle. Ses parties sont TableHeader, TableBody et TableFooter (groupes de lignes), TableRow (ses cellules côte à côte), TableHead (la cellule d’en-tête d’une colonne), TableCell et TableCaption. L’apparence appartient à l’application : aucune partie n’a de couleurs, de bordures, de marges intérieures ni de largeurs propres, et chacune reçoit les class et style de l’application. Pour de nombreuses lignes, le tri, la sélection et des colonnes redimensionnables, DataTable est le tableau qu’il vous faut.
import { mount, Text, View } from "nsh";
import { Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow } from "nsh/base";
import { size, Stage, ui } from "./palette";
// A few rows the app writes out: the parts give screen readers a table, the
// classes and the palette give it its look.
const invoices = [
{ id: "INV001", status: "Paid", method: "Card", amount: 250 },
{ id: "INV002", status: "Pending", method: "Transfer", amount: 150 },
{ id: "INV003", status: "Unpaid", method: "Card", amount: 350 },
{ id: "INV004", status: "Paid", method: "Cash", amount: 450 },
];
const widths = ["w-24", "flex-1", "w-24", "w-24"];
function Cell(props: { i: number; head?: boolean; end?: boolean; children: string }) {
const style = { fontSize: size.label, color: props.head ? ui().muted : ui().text, fontWeight: props.head ? ("500" as const) : ("400" as const) };
const Part = props.head ? TableHead : TableCell;
return (
<Part class={`${widths[props.i]} px-3 py-2.5`}>
<Text style={{ ...style, textAlign: props.end ? "right" : "left" }}>{props.children}</Text>
</Part>
);
}
function App() {
const line = { borderBottomWidth: 1, borderColor: ui().line };
const total = invoices.reduce((sum, i) => sum + i.amount, 0);
return (
<Stage width={520}>
<View style={{ ...ui().card, borderRadius: 12, overflow: "hidden" }}>
<Table accessibilityLabel="Recent invoices">
<TableHeader>
<TableRow style={line}>
{["Invoice", "Status", "Method", "Amount"].map((title, i) => (
<Cell i={i} head end={i === 3}>
{title}
</Cell>
))}
</TableRow>
</TableHeader>
<TableBody>
{invoices.map((inv) => (
<TableRow style={line}>
<Cell i={0}>{inv.id}</Cell>
<Cell i={1}>{inv.status}</Cell>
<Cell i={2}>{inv.method}</Cell>
<Cell i={3} end>{`$${inv.amount.toFixed(2)}`}</Cell>
</TableRow>
))}
</TableBody>
<TableFooter>
<TableRow>
<Cell i={0} head>Total</Cell>
<Cell i={1}>{""}</Cell>
<Cell i={2}>{""}</Cell>
<Cell i={3} end>{`$${total.toFixed(2)}`}</Cell>
</TableRow>
</TableFooter>
<TableCaption class="px-3 py-2">
<Text style={{ fontSize: size.detail, color: ui().muted }}>A list of your recent invoices.</Text>
</TableCaption>
</Table>
</View>
</Stage>
);
}
mount(App);use nsh_base::{table, table_body, table_cell, table_head, table_header, table_row, theme};
use nsh_core::prelude::*;
fn invoices() -> impl IntoElement {
let cell = |label: &'static str| table_cell().w(px(120.0)).px_3().py_2().child(text(label));
table()
.accessibility_label("Recent invoices")
.child(
table_header().child(
table_row()
.border_b_1()
.border_color(move || theme().border)
.child(table_head().w(px(120.0)).px_3().py_2().child(text("Invoice")))
.child(table_head().w(px(120.0)).px_3().py_2().child(text("Amount"))),
),
)
.child(table_body().child(table_row().child(cell("INV001")).child(cell("$250.00"))))
}import { mount, Text } from "nsh";
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "nsh/base";
function App() {
return (
<Table accessibilityLabel="Recent invoices">
<TableHeader>
<TableRow class="border-b border-border">
<TableHead class="w-32 px-3 py-2"><Text>Invoice</Text></TableHead>
<TableHead class="w-32 px-3 py-2"><Text>Amount</Text></TableHead>
</TableRow>
</TableHeader>
<TableBody>
<TableRow>
<TableCell class="w-32 px-3 py-2"><Text>INV001</Text></TableCell>
<TableCell class="w-32 px-3 py-2"><Text>$250.00</Text></TableCell>
</TableRow>
</TableBody>
</Table>
);
}
mount(App);Table et ses parties proviennent de nsh/base, le crate nsh-base en Rust, où table(), table_header(), table_body(), table_footer(), table_row(), table_head(), table_cell() et table_caption() les créent, avec les méthodes de style typées et .child(..). Une ligne dispose ses cellules côte à côte ; l’application donne leurs largeurs aux cellules, de sorte que les colonnes sont alignées.
#Props
| Prop | Rust | Type | Défaut | Description |
|---|---|---|---|---|
accessibilityLabel | .accessibility_label(..) | string | aucun | Table uniquement : le nom que les lecteurs d’écran donnent au tableau. |
children | .child(..) | JSX.Element | aucun | Ce que contient la partie : des groupes et une légende dans un Table, des lignes dans un groupe, des cellules dans une ligne, du contenu dans une cellule. |
class, style | méthodes de style | string, StyleProp<ViewStyle> | aucun | L’apparence et la mise en page de la partie. |
#Parties
| Partie | Dans | Rôle pour les lecteurs d’écran |
|---|---|---|
Table | table | |
TableHeader | Table | groupe de lignes : les lignes d’en-têtes de colonne |
TableBody | Table | groupe de lignes : les lignes de données |
TableFooter | Table | groupe de lignes : totaux, ligne de récapitulatif |
TableRow | un groupe, ou Table | ligne ; ses cellules côte à côte |
TableHead | un TableRow de l’en-tête | en-tête de colonne |
TableCell | TableRow | cellule |
TableCaption | Table | contenu que l’application affiche à propos du tableau |
Chaque plateforme transmet les rôles à son lecteur d’écran : rôles de table, de ligne, de cellule et d’en-tête de colonne sur Linux (AT-SPI), le web (ARIA), Android et le backend GPUI ; grilles et groupes sur macOS et Windows ; en-têtes en tant qu’en-têtes sur iOS.
#Voir aussi
- DataTable : un tableau d’un nombre quelconque de lignes et de colonnes, avec sélection, tri et colonnes redimensionnables et déplaçables.
- Accessibilité : les valeurs de
accessibilityRole,table,row,cell,columnheaderetrowgroup, entre autres.