# API 参考
# 全局注册与默认配置
通过 Vue 插件注册组件。所有选项均可省略;传入的默认值只在表格对象未配置对应属性时生效。
import Vue from 'vue'
import ElementUI from 'element-ui'
import agelTable from 'agel-table'
Vue.use(ElementUI)
Vue.use(agelTable, {
table: { border: true, size: 'small' },
page: { height: 45, pageSizes: [10, 20, 50, 100] },
column: { align: 'left' },
menu: { width: 140 },
queryProps: {
currentPage: 'page',
pageSize: 'size',
orderColumn: 'sortField',
order: (value) => ['sortOrder', value === 'descending' ? 'desc' : 'asc']
},
slotEmpty(h) {
return h('el-empty', { props: { description: '暂无数据' } })
}
})
| 全局选项 | 说明 |
|---|---|
| table | Element UI 表格的默认属性。页面表格对象中的同名属性优先。 |
| page | 分页组件的默认属性;单个表格仍需设置 page.enable 开启分页。 |
| column | 所有列共享的默认属性;单列配置优先。 |
| menu | 操作列默认属性;可在全局设定宽度、按钮和回调。 |
| queryProps | 将内置查询字段映射为后端接口字段。 |
| slotEmpty | 全局空数据内容渲染函数,参数为 Vue createElement 函数 h。 |
# 表格配置对象
组件通过 value 接收配置对象;在模板中通常使用 v-model 绑定。
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| data | Array | [] | 表格数据。 |
| columns | Array or Object | [] | 列定义,支持嵌套列和对象形式。 |
| loading | Boolean | false | Element UI loading 指令的开关。 |
| height | Number or String | — | 表格容器高度;数字按 px 处理,也可传 CSS 高度。 |
| query | Object | {} | 查询参数。组件会补充分页和排序字段。 |
| request | Function | — | 接口请求代理。服务端分页使用 request(query, done, fail)。 |
| queryProps | Object | 全局/内置映射 | 当前表格的查询字段映射,优先级高于全局设置。 |
| defaultSort | Object | — | Element UI 默认排序,如 { prop: 'name', order: 'ascending' }。 |
| page | Object | — | 分页选项,见下文。 |
| menu | Object | — | 操作列选项,见下文。 |
| merge | Object | — | 单元格合并选项,见下文。 |
| virtual | Object | — | 固定行高虚拟滚动选项,见下文。 |
| resize | Object | — | 容器自适应高度选项,见下文。 |
| on | Object | {} | Element UI 表格/分页事件回调。 |
其余受支持的表格属性会传递给 Element UI Table,包括条纹、边框、行样式、合计行和树形数据等。属性名称兼容驼峰和短横线写法。具体行为请参阅 Element UI Table 文档 (opens new window)。
# 列配置
数组形式的列定义最常用;对象形式以字段名为键,组件会将键转换为 prop。
columns: [
{ prop: 'name', label: '姓名', minWidth: 120 },
{
label: '联系信息',
children: [
{ prop: 'phone', label: '电话', width: 140 },
{ prop: 'email', label: '邮箱', minWidth: 180 }
]
}
]
| agel-table 扩展属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| display | Boolean or Function | true | 是否显示该列。函数应返回 Boolean,不接收参数。 |
| children | Array | [] | 子列定义,用于多级表头。 |
| slotColumn | String or Function | — | 自定义单元格。字符串对应具名作用域插槽;函数签名为 slotColumn(h, scope)。 |
| slotHeader | String or Function | — | 自定义表头。字符串对应具名作用域插槽;函数签名为 slotHeader(h, scope)。 |
| slotExpand | String | — | 展开列内容的具名作用域插槽别名。 |
| merge | Boolean | false | merge.auto 未开启时,指定此列参与自动合并。 |
其他列属性使用 Element UI Table-column 属性,例如 type、index、width、fixed、sortable、formatter、align 和 filters。可通过全局 column 默认值统一设置列属性。
# 插槽
具名作用域插槽通过列配置中的 slotColumn 或 slotHeader 引用。作用域对象与 Element UI 列插槽一致,常用字段为 row、column、$index。
<agel-table v-model="table">
<template slot="status" slot-scope="{ row }">
<el-tag>{{ row.status }}</el-tag>
</template>
<template slot="statusHeader">
当前状态
</template>
<template slot="empty">
暂无匹配记录
</template>
</agel-table>
columns: [
{
prop: 'status',
label: '状态',
slotColumn: 'status',
slotHeader: 'statusHeader'
}
]
还支持 Element UI 的 append 插槽。没有局部 empty 插槽时,组件使用全局 slotEmpty 配置(如果已配置)。
# attach 外部属性
attach 可将父组件中的响应式属性同步到表格配置对象,适合拆分既有的数据和列状态:
<agel-table
v-model="table"
:attach="{ data, columns, height }"
/>
attach 只同步传入的顶层属性,并覆盖 table 对象中的同名值。若需要更明确的数据流,优先直接把 data、columns 和 height 放在 table 对象中。
# request 与 queryProps
# 服务端请求
使用分页或服务端排序时,推荐通过三参数请求代理:
request(query, done, fail) {
api.list(query)
.then((response) => {
done({
data: response.data.records,
total: response.data.total
})
})
.catch(fail)
}
成功时 done 接收数据数组,或 { data, total } 对象;分页开启时请提供 total。失败时调用 fail(error)。回调代理会管理 loading 和最新请求回填;组件不会在浏览器端切分完整数据。
分页、pageSize 改变以及 sortable: 'custom' 列排序会触发请求。客户端分页需要由业务代码自行切分数据,不由该分页组件自动完成。
请求以函数声明参数个数区分回调代理:声明两个或更多形参时,组件以 request(query, done, fail) 调用;零到一个形参时,组件直接调用 request() 并返回其返回值,不自动解析返回数据。需要组件管理 loading 和数据回填时,请使用三参数形式。
调用 table.getData(options) 可主动刷新。传入 currentPage 或 pageSize 可重置分页;也可以传入 queryProps 映射后的字段名。
# 查询字段映射
内置映射为:
| 语义 | 默认字段 |
|---|---|
| 当前页 | currentPage |
| 每页条数 | pageSize |
| 排序字段 | orderColumn |
| 排序方向 | order |
可使用字符串改名,也可用函数同时改名和转换值:
queryProps: {
currentPage: 'page',
pageSize: 'size',
orderColumn: 'sortField',
order: (value) => ['sortOrder', value === 'descending' ? 'desc' : 'asc']
}
映射函数接收 Element UI 的排序方向(ascending 或 descending),返回 [查询字段名, 查询值]。
# 分页 page
分页属性会传递给 Element UI Pagination;分页事件通过 table.on 配置。
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| enable | Boolean | false | 是否渲染分页组件。 |
| currentPage | Number | 1 | 当前页。 |
| pageSize | Number | 20 | 每页条数。 |
| pageSizes | Array | [10, 20, 50, 100] | 每页条数选项。 |
| total | Number | 0 | 数据总数。 |
| layout | String | total, sizes, prev, pager, next, jumper | Pagination 布局。 |
| height | Number | 45 | 分页区域高度,表格设置 height 时用于计算表格高度。 |
| justify | String | flex-end | 分页区域的水平对齐方式。 |
其他属性参见 Element UI Pagination 文档 (opens new window)。
# 操作列 menu
设置 enable 开启操作列。操作回调接收 Element UI 列作用域对象。
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| enable | Boolean | false | 是否显示操作列。 |
| label | String | 操作 | 列标题。 |
| width | Number | 100 | 列宽。 |
| align | String | center | 对齐方式。 |
| fixed | Boolean or String | — | 可使用 Element UI 固定列设置。 |
| insertIndex | Number | — | 插入位置;从 0 开始。不设置时追加到末尾。 |
| onEdit | Function | — | 编辑按钮回调;设置后显示默认编辑按钮。 |
| onDel | Function | — | 删除按钮回调;设置后显示默认删除按钮。 |
| editRender | Function | — | 自定义编辑按钮,参数为 { h, clickEvent }。 |
| delRender | Function | — | 自定义删除按钮,参数为 { h, clickEvent }。 |
| menuRender | Function | — | 自定义额外内容,参数为 { h, menu, scope }。 |
# 单元格合并 merge
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| enable | Boolean | false | 是否启用合并。 |
| auto | Boolean | false | 自动合并所有具有 prop 且非特殊类型的列。 |
| direction | String | vertical | vertical 按行合并;horizontal 按列合并。 |
未开启 auto 时,可在要合并的列上设置 merge: true。合并根据相邻单元格值是否相同计算。
# 虚拟滚动 virtual
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| enable | Boolean | false | 是否启用虚拟滚动。 |
| rowHeight | Number | — | 固定行高,单位 px;启用时必须提供正数。 |
虚拟模式只渲染视口附近的行,适用于固定行高的大型平面列表。支持固定列、序号列、选择列和客户端排序。以下功能不能与虚拟模式组合使用:
- 可变行高、树形数据或懒加载。
- Element UI 表格筛选、展开行或单元格合并。
- 会改变行高的换行文本、未固定尺寸的图片或自定义样式。
数据首次进入 Vue 响应式系统的成本仍然存在。若每行包含大量深层对象,可优先减少无关字段或按需加载数据。
# 高度自适应 resize
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| enable | Boolean | false | 是否监听窗口尺寸并自适应高度。 |
| relative | String or Element | table.offsetParent | 参照选择器或 DOM 元素。 |
| offset | Number or Function | 0 | 额外扣除的像素高度;函数返回 Number。 |
计算结果为参照元素高度减去 offset 及表格顶部间距。布局变化后可调用 table.resizeTable() 主动重新计算。
# 事件 on
表格与分页事件统一写在 table.on 对象中。事件名称使用 Element UI 的事件名。
| 事件 | 参数 | 说明 |
|---|---|---|
| selection-change | selection | 选择项变化。 |
| select | selection, row | 选择或取消一行。 |
| select-all | selection | 点击全选框。 |
| sort-change | { column, prop, order } | 排序变化。 |
| current-change | currentRow, oldCurrentRow | 表格当前行变化。 |
| page-change | currentPage | 分页页码变化。用于区分页码事件和表格 current-change。 |
| size-change | pageSize | 每页条数变化。 |
其他传递给 el-table 或 el-pagination 的事件可放入 on。分页内部维护 currentPage 和 pageSize;服务端查询所需参数会同步写入 query。
# 实例方法
以下方法会挂载到绑定的 table 对象上:
| 方法 | 参数 | 说明 |
|---|---|---|
| getRef(name = 'table') | 'table' 或 'page' | 获取内部 Element UI 表格或分页组件实例。 |
| getCol(prop) | 字段名 | 获取对应的扁平列配置。 |
| getData(options) | 可选分页参数 | 触发回调式 request;该方法仅在回调式请求配置时注入。 |
| resizeTable() | — | 重新计算自适应高度;resize 配置存在时注入。 |
| getVirtualRowIndex(index) | 可见窗口内的 0 起始下标 | 转换为完整数据中的 0 起始下标;虚拟配置存在时注入。 |
| virtualScrollToRow(indexOrRow) | 0 起始下标或原始行对象 | 滚动到指定数据行附近;虚拟配置存在时注入。 |
table.getRef() 可调用 Element UI Table 自身公开的方法,例如 clearSelection、toggleRowSelection 或 sort。