Table 表格

用于展示多条结构类似的数据,可对数据进行排序、筛选、对比等操作。

基础表格

基础的表格展示用法。

通过给 el-table 传入 data 对象数组后,在 el-table-column 中用 prop 属性来对应对象中的键名即可填入数据,用 label 属性来定义表格的列名。 还可以使用 width 属性来定义列宽。

带斑马纹表格

使用带斑马纹的表格,可以更容易区分出不同行的数据。

stripe 属性接受一个 Boolean 值。 如果为 true,表格将会带有斑马纹。

带边框表格

默认情况下,表格没有垂直边框。 如果你需要它,你可以设置 border 属性为 true

带状态的表格

您可以高亮显示您的表格内容,以区分“成功、信息、警告、危险”和其他状态。

el-table 中使用 row-class-name 为某一行添加自定义类。 之后,你就可以使用自定义类来设置样式了。

超出部分显示 Tooltip 的表格

当内容过长时,它会折行显示,你可以使用 show-overflow-tooltip 属性来保持其单行显示。

show-overflow-tooltip 属性,它接受一个 Boolean 值。 设置为 true 时,当鼠标悬停在单元格上时,额外的内容将显示在工具提示中。

固定表头的表格

当行数太多时,可以使用固定表头。

通过设置 el-tableheight 属性,你可以固定表格的表头,而无需任何其他代码。

固定列的表格

当列数太多时,可以固定其中一些列。

el-table-column 中的 fixed 属性,它接受一个 Boolean 值。 如果为 true,该列将固定在左侧。 它还接受两个字符串字面量:'left' 和 'right',都表示该列将固定在相应的方向。

固定列和表头的表格

当需要将大量数据放入表格时,可以同时固定表头和列。

通过结合以上两个示例,可以同时固定列和表头。

流体高度表格与固定表头(和列)

当数据动态变化时,你可能希望表格有一个最大高度而不是固定高度,并在需要时显示滚动条。

通过设置 el-tablemax-height 属性,可以固定表格的表头。 仅当行的高度超过最大高度值时,表格主体才会滚动。

多级表头

当数据结构复杂时,可以使用多级表头来显示数据层次结构。

只需要将 el-table-column 嵌套在另一个 el-table-column 中,就可以实现多级表头。

固定多级表头的表格

支持固定的多级表头

多级表头的 fixed 属性由最外层的 el-table-column 决定。

单选

支持单行选择。

表格支持单行选择。 你可以通过添加 highlight-current-row 属性来激活它。 当行选择发生变化时,将触发一个名为 current-change 的事件,其参数是此更改之前和之后的行:currentRowoldCurrentRow。 如果你需要显示行索引,可以添加一个新的 el-table-column,并将其 type 属性设置为 index,你将看到从 1 开始的索引。

多选

你也可以选择多行。

2.8.3 之后,toggleRowSelection 支持第三个参数 ignoreSelectable 来决定是否忽略 selectable 属性。

激活多选很简单:只需添加一个 el-table-column,并将其 type 设置为 selection

排序

对数据进行排序以快速查找或比较数据。

在某一列中设置属性 sortable,即可基于该列对数据进行排序。它接受一个 Boolean 值,默认为 false。设置表格属性 default-sort 来确定默认的排序列和顺序。要应用您自己的排序规则,请使用 sort-methodsort-by。如果您需要从后端进行远程排序,请将 sortable 设置为 custom,并监听表格上的 sort-change 事件。在事件处理程序中,您可以访问排序列和排序顺序,以便从 API 获取排序后的表格数据。在此示例中,我们使用另一个名为 formatter 的属性来格式化某些列的值。它接受一个函数,该函数有两个参数:rowcolumn。您可以根据自己的需要进行处理。

筛选

筛选表格以查找所需数据。

el-table-column 中设置 filtersfilter-method 属性可以使该列可筛选。filters 是一个数组,而 filter-method 是一个决定显示哪些行的函数。它有三个参数:valuerowcolumn

自定义列模板

自定义表格列,以便与其他组件集成。

通过插槽,您可以访问以下数据:row、column、$index 和 store (Table 的状态管理)。

自定义表头的表格

自定义表头,使其更加个性化。

您可以通过表头插槽来自定义表头的外观。

可展开行

当行内容太长且您不想显示水平滚动条时,可以使用可展开行功能。

2.9.7 之后,添加了 preserve-expanded-content 来控制折叠时是否在 DOM 中保留已展开行的内容。

通过添加 type="expand" 和插槽来激活可展开行。el-table-column 的模板将作为展开行的内容呈现,您可以访问与在自定义列模板中使用 slot 时相同的属性。

切换父级边框
切换子级边框
保留展开内容

树形数据与懒加载

您可以显示树形结构的数据。当行包含 children 字段时,它被视为嵌套数据。为了渲染嵌套数据,row-key 属性是必需的。此外,子行数据可以异步加载。将表格的 lazy 属性设置为 true 并设置 load 函数。在行中指定 hasChildren 属性以确定哪一行包含子节点。childrenhasChildren 都可以通过 tree-props 进行配置。

可选中的树形表格 2.8.0

treeProps.checkStrictly 为 true 时,父子节点的选中状态不再关联,即选中父节点时,其子节点不会被选中;当 treeProps.checkStrictly 为 false 时,父子节点的选中状态将与子节点的选中状态关联,即选中父节点时,其所有子节点都会被选中。

合计行

对于数字表格,您可以在表格页脚添加一个额外的行来显示每列的总和。

您可以通过将 show-summary 设置为 true 来添加合计行。默认情况下,对于合计行,第一列不进行任何求和,而是始终显示“合计”(您可以使用 sum-text 来配置显示的文本),而其他列则对该列中的每个数字进行求和并显示它们。您当然可以定义自己的求和行为。为此,请将一个方法传递给 summary-method,该方法返回一个数组,返回数组的每个元素将显示在合计行的列中,它可以是一个 VNode 或字符串。此示例的第二个表格是一个详细的演示。

行和列合并

配置 rowspan 和 colspan 允许您合并单元格

使用 span-method 属性来配置 rowspan 和 colspan。它接受一个方法,并向该方法传递一个对象,包括当前行 row、当前列 column、当前行索引 rowIndex 和当前列索引 columnIndex。该方法应返回一个包含两个数字的数组,第一个数字是 rowspan,第二个是 colspan。它也可以返回一个带有 rowspancolspan 属性的对象。

自定义索引

您可以在 type=index 的列中自定义行索引。

要自定义行索引,请在 type=indexel-table-column 上使用 index 属性。如果它被赋值为一个数字,所有索引都将具有该数字的偏移量。它还接受一个方法,以每个索引(从 0 开始)作为参数,返回值将作为索引显示。

表格布局

table-layout 属性设置用于布局表格单元格、行和列的算法。

Tooltip 格式化函数 2.9.4

您可以使用 tooltip-formatter 来自定义 tooltip 的内容。

Table API

Table 属性

名称描述类型默认值
data表格数据array[]
高度表格的高度。默认情况下,它的高度是 auto。如果它的值是一个数字,高度以像素为单位;如果它的值是一个字符串,该值将被赋给元素的 style.height,高度受外部样式影响。string / number
max-height表格的最大高度。合法值为数字或 px 为单位的高度string / number
条纹表格是否为带斑马纹booleanfalse
边框表格是否有垂直边框booleanfalse
size表格的尺寸枚举
fit列的宽度是否自动适应其容器booleantrue
show-header表格的表头是否可见booleantrue
highlight-current-row当前行是否高亮booleanfalse
current-row-key当前行的 key,一个仅可设置的属性string / number
row-class-name返回行的自定义类名的函数,或为每一行分配类名的字符串Function / string
row-style返回行的自定义样式的函数,或为每一行分配自定义样式的对象Function / object
单元格类名返回单元格自定义类名的函数,或为每个单元格分配类名的字符串Function / string
cell-style返回单元格自定义样式的函数,或为每个单元格分配自定义样式的对象Function / object
header-row-class-name返回表头中行的自定义类名的函数,或为表头中每行分配类名的字符串Function / string
header-row-style返回表头中行的自定义样式的函数,或为表头中每行分配自定义样式的对象Function / object
header-cell-class-name返回表头中单元格自定义类名的函数,或为表头中每个单元格分配类名的字符串Function / string
header-cell-style返回表头中单元格自定义样式的函数,或为表头中每个单元格分配自定义样式的对象Function / object
row-key行数据的 key,用于优化渲染。如果 reserve-selection 开启或显示树形数据,则为必填项。当其类型为字符串时,支持多级访问,例如 user.info.id,但不支持 user.info[0].id,这种情况下应使用 Functionfunction / string
empty-text数据为空时显示的文本。您可以使用 #empty 自定义该区域string无数据
default-expand-all是否默认展开所有行,当表格包含 type="expand" 的列或包含树形结构数据时生效booleanfalse
expand-row-keys通过此属性设置展开的行,属性值为展开行的 key。在使用此属性前应设置 row-key。object
default-sort设置默认的排序列和顺序。属性 prop 用于设置默认排序列,属性 order 用于设置默认排序顺序object如果设置了 prop,而未设置 order,则 order 默认为升序
tooltip-effect溢出提示的 effect枚举暗黑模式
tooltip-options 2.2.28溢出提示的选项,参见以下 tooltip 组件objectobject
append-filter-panel-to 2.8.4筛选面板附加到的元素string
show-summary是否显示合计行booleanfalse
sum-text合计行第一列显示的文本string合计
summary-method自定义合计方法Function
span-method返回 rowspan 和 colspan 的方法Function
select-on-indeterminate控制多选表格中主复选框在仅部分行被选中(但非全部)时的行为。如果为 true,则所有行将被选中,否则取消选中booleantrue
indent树形数据的水平缩进number16
lazy是否懒加载数据booleanfalse
load加载子行数据的方法,仅在 lazy 为 true 时生效Function
tree-props渲染嵌套数据的配置objectobject
table-layout设置用于布局表格单元格、行和列的算法枚举fixed
scrollbar-always-on总是显示滚动条booleanfalse
show-overflow-tooltip当鼠标悬停在单元格上时,是否隐藏额外内容并以工具提示显示。它将影响所有表格列,请参考表格的 tooltip-optionsboolean / object 2.3.7
flexible 2.2.1确保主轴的最小尺寸不跟随内容booleanfalse
scrollbar-tabindex 2.8.3主体滚动条的包裹容器的 tabindexstring / number
allow-drag-last-column 2.9.2是否允许拖动最后一列booleantrue
tooltip-formatter 2.9.4在使用 show-overflow-tooltip 时自定义工具提示内容Function
preserve-expanded-content 2.9.7折叠时是否在 DOM 中保留已展开行的内容booleanfalse
native-scrollbar 2.10.5是否使用原生滚动条booleanfalse

Table 事件

名称描述类型
select当用户点击行中的复选框时触发Function
select-all当用户点击表头中的复选框时触发Function
selection-change当选择项发生变化时触发Function
cell-mouse-enter当鼠标悬停进入单元格时触发Function
cell-mouse-leave当鼠标悬停离开单元格时触发Function
cell-click当点击单元格时触发Function
cell-dblclick当双击单元格时触发Function
cell-contextmenu当用户右键点击单元格时触发Function
row-click当点击行时触发Function
row-contextmenu当用户右键点击行时触发Function
row-dblclick当双击行时触发Function
header-click当点击列头时触发Function
header-contextmenu当用户右键点击列头时触发Function
sort-change当表格的排序发生变化时触发Function
filter-change当表格的筛选发生变化时触发Function
current-change当当前行发生变化时触发Function
header-dragend在通过拖动列头的边框改变列宽后触发Function
expand-change当用户展开或折叠一行时触发(对于可展开表格,第二个参数是 expandedRows;对于树形表格,第二个参数是 expanded)Function
scroll 2.9.0滚动后调用Function

Table 插槽

名称描述子标签
default自定义默认内容Table-column
append在最后一行后插入的内容。如果您想为表格实现无限滚动,可能需要此插槽。如果存在合计行,此插槽将显示在合计行上方。
empty您可以自定义数据为空时的内容。

Table 暴露的方法

方法描述类型
clearSelection用于多选表格,清除用户的选择Function
getSelectionRows返回当前选中的行Function
toggleRowSelection用于多选表格,切换某一行是否被选中。使用第二个参数,您可以直接设置该行是否被选中Function
toggleAllSelection用于多选表格,切换全选和全不选Function
toggleRowExpansion用于可展开表格或树形表格,切换某一行是否展开。使用第二个参数,您可以直接设置该行是展开还是折叠Function
setCurrentRow用于单选表格,设置某行为选中行。如果不带任何参数调用,将清除选择Function
clearSort清除排序,将数据恢复到原始顺序Function
clearFilter清除传入 columnKey 的列的筛选器。如果没有参数,则清除所有筛选器Function
doLayout刷新表格的布局。当表格的可见性发生变化时,您可能需要调用此方法以获得正确的布局Function
sort手动对表格进行排序。属性 prop 用于设置排序列,属性 order 用于设置排序顺序Function
scrollTo滚动到一组特定坐标Function
setScrollTop设置垂直滚动位置Function
setScrollLeft设置水平滚动位置Function
columns 2.7.6获取表格列的上下文。array
updateKeyChildren 2.8.4用于懒加载表格,必须设置 rowKey,更新 key 的子节点Function

Table-column API

Table-column 属性

名称描述类型默认值
type列的类型。如果设置为 selection,该列将显示复选框。如果设置为 index,该列将显示行的索引(从 1 开始)。如果设置为 expand,该列将显示展开图标枚举default
index为每行自定义索引,在 type=index 的列上生效number / Function
label列标签string
column-key列的 key。如果您需要使用 filter-change 事件,需要此属性来识别哪个列正在被筛选string
prop字段名。您也可以使用它的别名:propertystring
width列宽string / number''
min-width列的最小宽度。带有 width 的列具有固定宽度,而带有 min-width 的列的宽度是按比例分配的string / number''
fixed列是否固定在左侧/右侧。如果为 true,则固定在左侧enum / booleanfalse
render-header此列表头的渲染函数Function
sortable列是否可以排序。通过将此属性设置为 'custom' 并监听表格的 sort-change 事件可以实现远程排序boolean / stringfalse
sort-method排序方法,在 sortabletrue 时生效。应返回一个数字,就像 Array.sort 一样Function
sort-by指定按哪个属性排序,在 sortabletruesort-method 未定义时生效。如果设置为数组,当上一个属性相等时,该列将按下一个属性顺序排序Function / string / object
sort-orders对数据进行排序时使用的排序策略的顺序,在 sortabletrue 时生效。接受一个数组,当用户点击表头时,该列将按数组中元素的顺序进行排序object['ascending', 'descending', null]
resizable列宽是否可以调整大小,在 el-tablebordertrue 时生效booleantrue
格式化程序格式化单元格内容的函数函数
show-overflow-tooltip当鼠标悬停在单元格上时,是否隐藏额外内容并以工具提示显示boolean / object 2.2.28undefined
align对齐方式枚举left
header-align表头的对齐方式。如果省略,将应用上述 align 属性的值枚举left
class-name列中单元格的类名string
label-class-name此列标签的类名string
selectable确定某一行是否可选的函数,在 type 为 'selection' 时生效Function
reserve-selection数据刷新后是否保留选择,在 type 为 'selection' 时生效。请注意,这需要设置 row-key 才能工作booleanfalse
filters数据筛选选项的数组。对于此数组中的每个元素,textvalue 是必需的array
filter-placement筛选下拉菜单的位置枚举
filter-class-name 2.5.0筛选下拉菜单的 classNamestring
filter-multiple数据筛选是否支持多选booleantrue
filter-method数据筛选方法。如果 filter-multiple 开启,此方法将对每一行调用多次,如果其中一次调用返回 true,则显示该行函数
filtered-value选中数据的筛选值,当表头使用 render-header 渲染时可能有用object
tooltip-formatter 2.9.4在使用 show-overflow-tooltip 时自定义工具提示内容Function

Table-column 插槽

名称描述类型
default表格列的自定义内容object
header表头的自定义内容object
filter-icon 2.7.8筛选图标的自定义内容object
expand 2.10.0展开列的自定义内容object

类型声明

显示声明
ts
interface Sort {
  prop: string
  order: 'ascending' | 'descending'
  init?: any
  silent?: any
}

interface TreeNode {
  expanded?: boolean
  loading?: boolean
  noLazyChildren?: boolean
  indent?: number
  level?: number
  display?: boolean
}

type DefaultRow = Record<PropertyKey, any>

type TableColumnCtx<T extends DefaultRow = DefaultRow> = {
  id: string
  realWidth: number | null
  type: string
  label: string
  className: string
  labelClassName: string
  property: string
  prop: string
  width?: string | number
  minWidth: string | number
  renderHeader: (data: CI<T>) => VNode
  sortable: boolean | string
  sortMethod: (a: T, b: T) => number
  sortBy: string | ((row: T, index: number, array?: T[]) => string) | string[]
  resizable: boolean
  columnKey: string
  rawColumnKey: string
  align: string
  headerAlign: string
  showOverflowTooltip?: boolean | TableOverflowTooltipOptions
  tooltipFormatter?: TableOverflowTooltipFormatter<T>
  fixed: boolean | string
  formatter: (
    row: T,
    column: TableColumnCtx<T>,
    cellValue: any,
    index: number
  ) => VNode | string
  selectable: (row: T, index: number) => boolean
  reserveSelection: boolean
  filterMethod: FilterMethods<T>
  filteredValue: string[]
  filters: Filters
  filterPlacement: string
  filterMultiple: boolean
  filterClassName: string
  index: number | ((index: number) => number)
  sortOrders: (TableSortOrder | null)[]
  renderCell: (data: any) => VNode | VNode[]
  colSpan: number
  rowSpan: number
  children?: TableColumnCtx<T>[]
  level: number
  filterable: boolean | FilterMethods<T> | Filters
  order: TableSortOrder | null
  isColumnGroup: boolean
  isSubColumn: boolean
  columns: TableColumnCtx<T>[]
  getColumnIndex: () => number
  no: number
  filterOpened?: boolean
  renderFilterIcon?: (scope: any) => VNode
  renderExpand?: (scope: any) => VNode
}

常见问题

如何在表格中使用图片预览?

vue
<template>
  <el-table-column width="180">
    <template #default="scope">
      <el-image preview-teleported :preview-src-list="srcList" />
    </template>
  </el-table-column>
</template>

为什么使用 DOM 模板时列未渲染?

典型问题: #5046 #5862 #6919

这是因为 HTML 规范只允许少数特定元素省略闭合标签,最常见的是 <input><img>。对于所有其他元素,如果省略闭合标签,原生的 HTML 解析器会认为您从未终止过开始标签。

更多详情请参考 vue 文档

来源

组件样式文档

贡献者