Giao diện
CTable — sắp xếp và phân trang
Cả hai đều chạy ở backend. CTable phát sự kiện @change; useTable nhận, cập nhật truy vấn rồi tải lại dữ liệu.
Sắp xếp
ts
const columns = [
{ title: 'Mã đơn', dataIndex: 'code', key: 'code', sorter: true },
{ title: 'Giá trị', dataIndex: 'amount', key: 'amount', sorter: true, align: 'right' },
]sorter: true bật chỉ báo sắp xếp trên header. Khi người dùng bấm, bảng phát @change với sorter:
| Người dùng bấm | sortField | sortOrder |
|---|---|---|
| Lần 1 | dataIndex của cột | ascend |
| Lần 2 | dataIndex của cột | descend |
| Lần 3 | undefined | undefined |
useTable quy đổi sẵn, fetcher chỉ việc đọc query.sortField / query.sortOrder và gửi theo đúng tên tham số của backend — xem useApi và fetcher.
dataIndexlồng (['owner', 'name']) được nối thànhowner.name.- Sắp xếp nhiều cột (
sorter: { multiple: n }) thìuseTablechỉ gửi cột đầu, vìTableQuerygiữ một cột. - Đừng sắp xếp tại chỗ trên
dataSource: nó chỉ đúng trong trang hiện tại và sai ngay khi sang trang thứ hai.
Phân trang
vue
<CTable :pagination="pagination" @change="onChange" />pagination từ useTable gồm current, pageSize, total, showSizeChanger. CTable gộp thêm mặc định của framework:
| Khoá | Mặc định | Ghi chú |
|---|---|---|
showTotal | Tổng số dòng N | Ghi đè bằng hàm riêng nếu muốn |
showSizeChanger | true | Cho đổi số dòng mỗi trang |
size | default | antd tự thu nhỏ theo size của bảng |
Trang ghi đè từng khoá:
vue
<CTable :pagination="{ ...pagination, showSizeChanger: false, pageSizeOptions: ['10', '20'] }" />Tắt hẳn phân trang (bảng con ngắn, bảng trong drawer):
vue
<CTable :pagination="false" />total phải là tổng số bản ghi khớp điều kiện, không phải số dòng của trang hiện tại — sai chỗ này thì thanh phân trang hiện sai số trang.
Tự viết @change
Khi không dùng useTable, khai kiểu tối thiểu cho tham số thay vì import kiểu từ ant-design-vue (ESLint chặn import trực tiếp):
ts
interface ChangePagination { current?: number, pageSize?: number }
interface ChangeSorter {
field?: string | number | readonly (string | number)[]
order?: 'ascend' | 'descend' | null
}
function onChange(pag: ChangePagination, filters: unknown, sorter: ChangeSorter | ChangeSorter[]) {
// ...
}Đây cũng là cách useTable của @tasco/composables làm.
Sắp xếp mặc định
Hai nguồn, theo thứ tự ưu tiên:
- Thiết lập của người dùng (drawer ⚙, lưu theo
settings-key) — xem Thiết lập bảng. defaultSortOrderkhai trên cột — áp dụng khi người dùng chưa đặt gì.
Dùng thiết lập thì truyền cùng khoá cho useTable để lần tải đầu đã đúng thứ tự, không phải tải hai lần:
ts
const TABLE_KEY = 'orders'
useTable(fetchOrders, { settingsKey: TABLE_KEY })vue
<CTable :settings-key="TABLE_KEY" show-column-setting />Quên settingsKey ở useTable thì bảng vẫn hiện chỉ báo sắp xếp nhưng dữ liệu lần đầu chưa được sắp xếp — một lỗi rất khó nhận ra khi nhìn màn hình.
Liên quan
useTable— truy vấn và tải lại.- Thiết lập bảng — sắp xếp mặc định của người dùng.
- Hợp đồng dữ liệu —
TableQueryvàPaginated.