Table, List & biểu đồ

Thay các dòng tự viết bằng Table có thể sắp xếp và biểu đồ không bao giờ làm dịch chuyển layout.

Ứng dụng của chương này đang chạy trong console của bạn. Mở console bằng ⌘⌥JCtrl+Shift+J⌘⌥KCtrl+Shift+K⌘⌥C (bật tính năng dành cho nhà phát triển trước), rồi dùng thử.
Xem chương3:05

Trong chương này

  • Bảng có thể sắp xếp
  • Biểu đồ phía trên bảng
  • Thêm component

Thay các dòng tự viết bằng component: <Table> có điều hướng bằng bàn phím và sắp xếp, <List> có cuộn ảo hóa, và biểu đồ vẽ bằng khối một phần tám và chấm phần tư.

Bảng có thể sắp xếp

Các cột là một mảng đối tượng. Cột không có width chia sẻ không gian còn lại theo grow, value là giá trị dùng để so sánh khi sắp xếp, và render vẽ ô.

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

Khi bảng có focus, ↑ ↓ di chuyển vùng tô sáng, s chuyển lần lượt qua các cột sắp xếp, S đảo chiều và Enter gọi onSelect. Bảng dài chỉ vẽ các dòng đang hiển thị.

Biểu đồ phía trên bảng

<Sparkline> lấp đầy hộp của nó bằng các điểm gần đây nhất. <BarChart> căn chỉnh nhãn và giá trị cho bạn.

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

Hộp biểu đồ có chiều cao cố định, nên chuyển đổi biểu đồ không bao giờ làm bảng dịch chuyển, và các dòng của bảng không bị mã hóa lại.

Thêm component

<List>, <Tree>, <Tabs>, <Select>, <Input>, <Modal>, <Toaster>, <CommandPalette>, <ProgressBar>, <LineChart> và nhiều component khác có tài liệu tại Component.

Dùng thử

Đây là Acme Deploys ở cuối chương, đang chạy trong DevTools. Nhấp vào vùng focus, rồi dùng các phím bên dưới.

▼ 07 · Table, List & biểu đồ

Mở console

⌘⌥J
CtrlShiftJ
⌘⌥K
CtrlShiftK
⌘⌥C

Ứng dụng render trong DevTools.Trước tiên bật “Hiển thị tính năng cho nhà phát triển web” trong Cài đặt Safari → Nâng cao. Sau đó nhấp vào đây và nhấn s.

Mở trên máy tính

Ứng dụng này render trong console của DevTools, cần trình duyệt trên máy tính.

Bài trắc nghiệm

2 câu hỏi

Trả lời mọi câu hỏi để hoàn thành chương.

Khi Table có thể sắp xếp đang có tiêu điểm, s làm gì?

 

Vì sao đặt chiều cao cố định cho hộp biểu đồ?