Skip to content

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ấmsortFieldsortOrder
Lần 1dataIndex của cộtascend
Lần 2dataIndex của cộtdescend
Lần 3undefinedundefined

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.

  • dataIndex lồng (['owner', 'name']) được nối thành owner.name.
  • Sắp xếp nhiều cột (sorter: { multiple: n }) thì useTable chỉ gửi cột đầu, vì TableQuery giữ 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 địnhGhi chú
showTotalTổng số dòng NGhi đè bằng hàm riêng nếu muốn
showSizeChangertrueCho đổi số dòng mỗi trang
sizedefaultantd 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:

  1. Thiết lập của người dùng (drawer ⚙, lưu theo settings-key) — xem Thiết lập bảng.
  2. defaultSortOrder khai 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 settingsKeyuseTable 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