العناصر
Table
يعرض Table بضعة صفوف يكتبها التطبيق على هيئة عناصر فرعية (فواتير، ملخص، مقارنة)، ويمنح قارئات الشاشة جدولاً كاملاً: الجدول نفسه، ومجموعات الصفوف، والصفوف، ورؤوس الأعمدة، والخلايا، لكل منها دوره. أجزاؤه هي
TableHeader وTableBody وTableFooter (مجموعات الصفوف)، وTableRow (خلاياه جنباً إلى جنب)، وTableHead (خلية رأس
العمود)، وTableCell وTableCaption. المظهر يحدده التطبيق: لا يملك أي جزء ألواناً أو حدوداً أو هوامش داخلية أو
عروضاً خاصة به، ويقبل كل جزء class وstyle الخاصين بالتطبيق. أما للصفوف الكثيرة والفرز والتحديد والأعمدة القابلة لتغيير الحجم،
فإن DataTable هو الجدول المناسب.
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 وأجزاؤه من nsh/base، وهي حزمة nsh-base في Rust، حيث تنشئها table() و
table_header() وtable_body() وtable_footer() وtable_row() وtable_head() وtable_cell() و
table_caption()، مع دوال الأنماط المصنّفة بالأنواع و.child(..). يعرض الصف خلاياه جنباً إلى جنب؛ ويحدد
التطبيق عروض الخلايا، فتصطف الأعمدة.
#الخصائص
| الخاصية | Rust | النوع | الافتراضي | الوصف |
|---|---|---|---|---|
accessibilityLabel | .accessibility_label(..) | string | لا شيء | في Table فقط: الاسم الذي تنطق به قارئات الشاشة للجدول. |
children | .child(..) | JSX.Element | لا شيء | ما يحتويه الجزء: مجموعات وتعليق توضيحي في Table، وصفوف في المجموعة، وخلايا في الصف، ومحتوى في الخلية. |
class، style | دوال الأنماط | string، StyleProp<ViewStyle> | لا شيء | مظهر الجزء وتخطيطه. |
#الأجزاء
| الجزء | داخل | الدور لدى قارئات الشاشة |
|---|---|---|
Table | جدول | |
TableHeader | Table | مجموعة صفوف: صفوف رؤوس الأعمدة |
TableBody | Table | مجموعة صفوف: صفوف البيانات |
TableFooter | Table | مجموعة صفوف: الإجماليات، صف ملخص |
TableRow | مجموعة، أو Table | صف؛ خلاياه جنباً إلى جنب |
TableHead | TableRow في الرأس | رأس عمود |
TableCell | TableRow | خلية |
TableCaption | Table | محتوى يعرضه التطبيق حول الجدول |
تمنح كل منصة الأدوار لقارئ الشاشة الخاص بها: أدوار الجدول والصف والخلية ورأس العمود على Linux (AT-SPI) والويب (ARIA) وAndroid وواجهة GPUI الخلفية؛ والشبكات والمجموعات على macOS وWindows؛ والرؤوس بوصفها رؤوساً على iOS.
#انظر أيضاً
- DataTable: جدول بأي عدد من الصفوف والأعمدة، مع التحديد والفرز وأعمدة قابلة لتغيير الحجم والنقل.
- إمكانية الوصول: قيم
accessibilityRoleوtableوrowوcellوcolumnheaderوrowgroupمن بينها.