Skip to content

Fast-Table 快速表格

基于 query-panel pagination table 及表单组件聚合而成的快速表格模板,用以支持快速业务开发

组件概述

Fast-Table 用于把“搜索表单 + 数据表格 + 分页”这类高频业务页面抽象成统一模板,减少列表页开发中的重复拼装工作。

它更适合这几类场景:

  • 标准查询列表页,需要快速完成搜索、请求、分页和表格展示。
  • 列配置、排序、批量选择等表格能力需要统一处理的业务页面。
  • 接口形态相对稳定,但又希望保留插槽扩展能力的中后台页面。

组件本身主要提供这些能力:

  • 聚合 EzQueryPanelEzTableEzPagination,统一列表页搭建方式。
  • 通过 apicolumnsparams 等配置驱动数据请求和表格展示。
  • 支持表格上方区域、查询表单区域和数据列插槽,便于做业务扩展。
  • 对常见分页请求场景做统一封装,同时保留对自定义业务参数的兼容。

基础用法

INFO

如果你的业务基础请求和当前组件的分页处理不一致,你可以抽取公共方法,转换成新的 Promise 来适配该组件,同时你也可以处理除分页参数以外的其他业务参数。

组合使用

请求适配

INFO

你可以使用 header 插槽快速获取选择项,row-key 的值默认是 id, 在处理选择项这个是非常有必要指定的。

页面状态

INFO

#error 插槽提供了 retry 方法,可以在错误状态下重新发起请求。stage 参数表明错误发生在哪个阶段(beforeSearchtransformParamsapiresponseAdapter)。

完整 CRUD 页面模式

推荐的组合方式

  1. 标准 CRUD 查询区:优先使用 EzQueryPanel + 原生 el-form / el-form-item,保证页面结构直观、可读、易维护
  2. 数据模型:统一使用 QueryParams<T> 作为查询参数类型,包含 current / size / asc / desc 基础字段
  3. 参数回填:从 URL 或外部状态回填参数后,调用 captureInitialParams() 记录为新基线
  4. 批量操作:通过 #header 插槽获取 selectIdsselectList,实现批量删除、导出等能力
  5. 编辑弹窗:使用 EzDialog + EzDynamicForm 组合,统一表单配置风格
  6. 页面状态:通过 #empty#error 插槽自定义空数据和错误状态展示

如果查询区字段存在局部复用需求,优先抽取 el-form-item 级别的字段片段或字段工厂,而不是把整个查询区提升为配置化模型。

数据流最佳实践

  • 参数同步:通过 v-model:params 实现查询参数的双向绑定,表单和分页状态自动同步
  • 列配置输入:始终显式传入 columns;如果需要响应列管理工具带来的列配置变化,再配合 v-model:columns
  • 固定列约束:当存在 fixed: 'left'/'right' 列时,建议其余数据列显式声明 widthmin-width,避免窄屏和滚动场景下的表头/表体错位
  • 重置基线:组件挂载时自动记录初始参数,reset() 恢复到该基线
  • 外部回填:从路由或缓存回填参数后,调用 captureInitialParams() 更新基线
  • 查询时机:新增/编辑成功后调用 search() 重置到第一页,删除后调用 query() 保持当前页

TypeScript 模板类型建议

如果页面里需要依赖表格列插槽的强类型 row / column 推断,推荐通过 createTypedFastTable<T, P>() 创建一个带显式泛型的组件别名,再在模板中使用它。

ts
import { createTypedFastTable } from 'ez-ui'
import type { QueryParams } from 'ez-ui'

interface Item {
	id: string
	name: string
}

const TypedFastTable = createTypedFastTable<Item, QueryParams<Partial<Item>>>()

这样在 #operations#status 等数据列插槽里,row 会稳定保持为 Item,更适合严格 TypeScript 场景。

列表页操作约定

  • 新增/编辑成功:关闭弹窗后调用 search(),让列表回到第一页并重新拉取最新数据
  • 删除成功:优先调用 query(),保持当前页语义,避免无必要地重置分页
  • 批量删除:默认也沿用 query() 语义;如果你的业务要求删除后回到第一页,再显式改为 search()
  • 弹窗关闭时机:建议在提交成功后再关闭弹窗,提交失败时保留表单上下文,便于用户修正

属性

属性说明类型默认值
api快速的接口服务Promise<Response>-
before-search查询前副作用钩子,会拿到当前查询参数(params) => Promise<void>-
transform-params请求参数转换钩子,返回值会作为 api 最终入参(params) => QueryParams | Promise<QueryParams>当前 params 的深拷贝
response-adapter响应适配钩子,将接口返回转换为分页结构(response) => Page | Promise<Page>内置兼容 { code, data: { records, total } }
columns / v-model:columns表格列配置,columns 为必传;如需监听列管理工具回写可使用 v-model:columnsTable-Columns-
v-model:loading异步请求状态booleanfalse
v-model:params表单的查询参数,同分页信息双向绑定QueryParams{ current: 1, size: 10 }
row-key行数据的唯一标识字段enum'id'
column-tool是否显示列配置工具按钮booleantrue
border是否显示表格边框booleantrue
...其他属性,直接传递给 ez-table--

INFO

fast-table 其他属性传递给 ez-table,最后传递到 el-table

INFO

如果接口参数需要二次加工,优先使用 transformParams。它接收当前 params 的深拷贝,你可以在里面做字段裁剪、时间范围拆分、空值清理、字段重命名等处理,返回值会作为 api 的最终入参,不会污染页面上的查询模型。

beforeSearch 更适合做查询前副作用,比如外部埋点、权限判断、补充一些页面状态。

INFO

如果你的接口返回不是 { code, data: { records, total } } 这一类结构,优先通过 responseAdapter 做响应适配,而不是在页面里手动包一层假响应。

INFO

远程排序不再兼容 sortable: 'custom' 这个隐式约定。请直接在列上声明 sortMode: 'remote',并在需要时通过 sortField 指定真实排序字段名。

QueryParams

属性名说明类型是否必须默认值
current当前页数,同分页配置双向绑定number1
size每页显示条目个数,同分页配置双向绑定number10
desc自定义排序中降序排序字段string-
asc自定义排序中升序排序字段string-
...其他属性,自有业务参数Record-

排序设计建议

场景列配置方式行为
本地排序sortable: true 或自定义 sortMethod仅在当前表格数据上本地排序,不触发 FastTable 查询
远程排序sortMode: 'remote',可选 sortFieldFastTable 会写入 asc/desc 并重新查询

WARNING

当前 FastTable 的本地排序只作用于当前页表格数据。如果你的数据是远程分页返回的,这种本地排序并不是全量数据排序。全量排序应优先使用远程排序,或者由业务层先完成本地排序后再分页。

插槽

插槽名说明类型
${prop}数据列插槽,同 ez-tableobject
form查询区内容插槽object
header表格上方区域object
freeArea搜索表单与表格之间的自由区域object
empty空数据状态插槽-
error错误状态插槽object

事件

事件名说明参数
update:columns监听列配置变更,通常由列管理工具触发Function
update:loading监听异步请求状态Function
update:params监听查询参数变更Function
changePage分页大小或当前页变更,可根据值判断变更类型Function
reset重置按钮点击事件Function
query查询完成事件Function
...其他事件,直接传递给 ez-table-

INFO

fast-table 其他事件传递给 ez-table,最后传递到 el-table

方法

方法名说明类型
getTableRef获取 el-table 实例Function
query直接触发 api 调用Function
search触发 api 调用,会重置current = 1Function
patchParams局部更新查询参数Function
replaceParams完整替换查询参数Function
reset重置到当前基线参数并重新查询Function
captureInitialParams将当前参数记录为新的重置基线Function
doLayout重新布局表格Function
clearError清除错误状态Function
getErrorState获取当前错误状态Function

INFO

reset() 会恢复到当前记录的初始查询参数,再触发一次查询。组件首次挂载时会自动记录一次基线;如果你在页面外部回填了查询条件,可以手动调用 captureInitialParams() 作为新的重置基线。

INFO

formfreeArea 插槽现在会提供统一作用域,你可以直接在插槽内部调用 search()reset()query(),或者在回填查询条件后调用 captureInitialParams()

INFO

如果只是修改部分查询条件,优先用 patchParams();如果是从路由、缓存或外部状态整体回填一组参数,优先用 replaceParams()。这比直接改 params 更适合承接后续的分页重置、基线同步等统一规则。

INFO

FastTable 现在默认采用“最后一次请求生效”的并发策略。连续触发查询、分页或远程排序时,旧请求即使后返回,也不会覆盖最新结果。

INFO

#empty 插槽用于自定义空数据状态的展示内容。由于其本质上复用的是 el-table 的 empty 插槽,这里不额外提供作用域参数;如果你需要在空状态下重新查询,建议直接调用组件 expose 或页面上的外部方法。

#error 插槽用于自定义错误状态的展示内容,插槽作用域提供 error(错误对象)、stage(错误阶段)、params(发生错误时的参数)和 retry(重试方法)。

错误态默认是“保留当前表格数据并额外展示错误提示”的模式,而不是直接替换整个表格内容区。这意味着如果上一次查询成功、本次查询失败,页面会继续显示旧数据,直到下一次成功查询覆盖它。

当存在错误状态时,#empty 不会同时展示;只有“当前无数据且无错误”时才会进入空状态展示。

基于 MIT 许可发布