⁦Table⁩ و List والمخططات

استبدل الصفوف المكتوبة يدويًا بمكوّن Table قابل للفرز ومخطط لا يغيّر التخطيط أبدًا.

يعمل تطبيق هذا الفصل في وحدة التحكم. افتحها باستخدام ⌘⌥JCtrl+Shift+J⌘⌥KCtrl+Shift+K⌘⌥C (فعّل ميزات المطوّرين أولًا)، ثم جرّبه.
مشاهدة الفصل3:05

في هذا الفصل

  • جدول قابل للفرز
  • مخطط فوق الجدول
  • مزيد من المكوّنات

استبدل الصفوف المكتوبة يدويًا بمكوّنات: <Table> مع التنقل بلوحة المفاتيح والفرز، و <List> مع التمرير الافتراضي، ومخططات مرسومة بكتل من أثمان الخلية ونقاط أرباع الخلية.

جدول قابل للفرز

الأعمدة مصفوفة من الكائنات. يشارك العمود الذي لا يحدد width في المساحة المتبقية حسب grow، ويقارن الفرز قيم value، ويرسم render الخلية.

app/deployments/page.tsx+10-1tsx
المضاف: import { Table, type SortState, type TableColumn } from "@textjs/app";المضاف: المضاف: const COLUMNS: TableColumn<Deployment>[] = [المضاف:   { key: "status", header: "Status", width: 11, render: (d) => <Status status={d.status} /> },المضاف:   { key: "commit", header: "Commit", grow: 2 },المضاف:   { key: "project", header: "Project", width: 10 },المضاف:   { key: "duration", header: "Build", width: 6, align: "right", value: (d) => d.duration, render: (d) => <Text>{`${d.duration}s`}</Text> },المضاف: ];export default function DeploymentsPage() {المضاف:   const [sort, setSort] = useState<SortState | null>(null);  …المحذوف:   return rows.map((d) => …);المضاف:   return <Table columns={COLUMNS} rows={rows} getRowKey={(d) => d.id} sortable sort={sort} onSortChange={setSort} autoFocus />;}

عندما يكون التركيز على الجدول، ينقل ↑ و ↓ التمييز، ويتنقل s بين أعمدة الفرز، ويعكس S الاتجاه، ويستدعي Enter الدالة onSelect. لا تعرض الجداول الطويلة إلا الصفوف المرئية.

مخطط فوق الجدول

يملأ <Sparkline> صندوقه بأحدث النقاط. يحاذي <BarChart> التسميات والقيم.

app/deployments/page.tsx+15tsx
المضاف: import { BarChart, Sparkline } from "@textjs/app";المضاف: المضاف:   const [chart, setChart] = useState<"spark" | "bars">("spark");المضاف:   useInput((e) => {المضاف:     if (e.input === "c") setChart((c) => (c === "spark" ? "bars" : "spark"));المضاف:   });المضاف:   return (    <Box className="flex-col grow gap-1">المضاف:       <Box className="flex-col" height={4}>المضاف:         <Text color="subtle">Build time, last 24 deployments</Text>المضاف:         {chart === "spark" ? (المضاف:           <Sparkline data={buildTimes} height={3} color="accent" />المضاف:         ) : (المضاف:           <BarChart data={byProject} formatValue={(v) => `${v}s`} />المضاف:         )}المضاف:       </Box>      <Table … />    </Box>  );

لصندوق المخطط ارتفاع ثابت، لذا لا يؤدي التبديل بين المخططات إلى تحريك الجدول، ولا يُعاد ترميز صفوفه.

مزيد من المكوّنات

يرد توثيق <List>، و <Tree>، و <Tabs>، و <Select>، و <Input>، و <Modal>، و <Toaster>، و <CommandPalette>، و <ProgressBar>، و <LineChart> وغيرها ضمن المكوّنات.

جرّبه

هذا تطبيق Acme Deploys في نهاية الفصل، يعمل في DevTools. انقر اللوحة، ثم استخدم المفاتيح أدناه.

▼ 07 · ⁦Table⁩ و List والمخططات

فتح وحدة التحكم

⌘⌥J
CtrlShiftJ
⌘⌥K
CtrlShiftK
⌘⌥C

يُعرض التطبيق في DevTools.فعّل أولًا «إظهار الميزات لمطوري الويب» في إعدادات Safari → متقدم. ثم انقر هنا واضغط s.

الفتح على حاسوب مكتبي

يُعرض هذا التطبيق في وحدة تحكم DevTools، التي تتطلب متصفحًا على حاسوب مكتبي.

اختبار

2 سؤالان

أجب عن كل سؤال لإكمال الفصل.

ماذا يفعل s عند تركيز مكوّن Table قابل للفرز؟

 

لماذا يُضبط ارتفاع ثابت لصندوق المخطط؟