Skip to content

表格与列表体系 ​

本文说明 art-design-pro-x-ui 中列表页的通用实现方式。它适合在新增管理页面、调整分页字段、排查列表刷新或复用列配置能力时阅读。

核心文件 ​

文件作用
src/hooks/core/useTable.ts列表页数据请求、分页、搜索、刷新、缓存和错误状态管理
src/hooks/core/useTableColumns.ts表格列显示、隐藏、排序、更新与重置
src/utils/table/tableConfig.ts表格响应字段和分页请求字段的全局映射
src/utils/table/tableCache.ts基于请求参数的列表缓存、过期清理和缓存失效策略
src/utils/table/tableUtils.ts响应适配、分页同步、防抖搜索和错误处理工具
src/store/modules/table.ts表格相关的全局状态

这套能力的目标是让标准列表页只关注业务字段、接口函数和页面交互,不在每个页面重复处理分页、加载状态、响应适配和列管理。

标准列表页主链路 ​

一个标准列表页通常按下面的链路运行:

mermaid
flowchart TD
  A["页面定义搜索表单和列配置"] --> B["调用 useTable"]
  B --> C["执行 apiFn(searchParams)"]
  C --> D["响应适配与数据提取"]
  D --> E["同步 data 和 pagination"]
  E --> F["渲染表格与分页"]
  F --> G["搜索、重置、新增、编辑、删除后刷新"]

useTable 会维护 data、loading、error、searchParams、pagination 等状态,并根据配置决定是否立即请求、是否启用缓存、是否使用自定义响应适配器。

分页字段映射 ​

默认请求分页字段来自 tableConfig.paginationKey:

ts
paginationKey: {
  current: 'current',
  size: 'size'
}

默认响应字段会按优先级识别:

类型默认候选字段
列表数据list、data、records、items、result、rows
总条数total、count
当前页current、page、pageNum
每页数量size、pageSize、limit

如果后端接口返回格式与默认约定不一致,优先在 useTable 的 transform.responseAdapter 中适配单个页面;只有当多个页面都使用同一套格式时,再调整 tableConfig.ts。

列配置管理 ​

需要动态列时,在 useTable 中传入 columnsFactory,内部会调用 useTableColumns 生成列配置:

ts
const {
  data,
  loading,
  pagination,
  columns,
  columnChecks,
  getData,
  search,
  resetSearch
} = useTable({
  core: {
    apiFn: fetchUserList,
    columnsFactory: () => [
      { prop: 'username', label: '用户名' },
      { prop: 'email', label: '邮箱' },
      { prop: 'status', label: '状态' }
    ]
  }
})

useTableColumns 支持:

能力说明
toggleColumn显示或隐藏单列、批量列
updateColumn更新列标题、宽度、渲染配置等
reorderColumns调整列顺序
addColumn / removeColumn按运行时条件增删列
resetColumns回到 columnsFactory 的初始列结构

特殊列 selection、expand、index 会被统一转换为内部 key,避免和业务字段冲突。

缓存策略 ​

useTable 默认不启用缓存。列表数据变动频率低、查询条件稳定、接口成本较高时,可以开启:

ts
useTable({
  core: {
    apiFn: fetchLogList
  },
  performance: {
    enableCache: true,
    cacheTime: 5 * 60 * 1000,
    maxCacheSize: 50
  }
})

缓存 key 基于请求参数生成,缓存项会记录访问次数、最后访问时间和标签。常见失效策略包括:

策略适用场景
CLEAR_ALL新增、批量导入、影响整批数据的操作
CLEAR_CURRENT只影响当前查询条件下的单条数据
CLEAR_PAGINATION数据顺序或总数变化,但搜索条件不变
KEEP_ALL只读操作,不需要刷新缓存

启用缓存后,新增、编辑、删除等操作完成后要主动选择刷新策略,否则页面可能继续展示旧数据。

新增列表页建议 ​

新增一个列表页时,推荐按下面顺序处理:

  1. 在 src/api 中封装接口函数,并按接口权限约定补充 permissionCode。
  2. 在 src/types/api 中补充接口类型,避免页面直接写松散对象。
  3. 在页面中定义搜索参数、列配置和操作按钮。
  4. 使用 useTable 接入请求、分页、搜索、刷新。
  5. 如果需要列显示控制,再接入 columnChecks 和列设置 UI。
  6. 如果接口返回结构特殊,先在当前页面写 responseAdapter,不要直接改全局配置。

常见问题 ​

列表有数据但表格为空 ​

优先检查接口返回中的列表字段是否能被 tableConfig.recordFields 识别。如果字段名不一致,为当前页面增加 responseAdapter。

分页总数不对 ​

检查响应里的总数字段是否在 tableConfig.totalFields 中,或检查接口是否返回了分页对象嵌套结构。

搜索后页码没有回到第一页 ​

检查页面是否调用了 search 或统一封装的搜索方法。手动改 searchParams 后直接调用 getData,可能不会执行搜索场景下的页码重置逻辑。

编辑后数据没有刷新 ​

如果启用了缓存,检查编辑成功后的缓存失效策略;如果没有启用缓存,检查是否调用了列表刷新方法。

相关阅读 ​

根据 MIT 许可证发布