Skip to content

table

介绍

以 element-plus 为例,该组件将其 table 组件,pagination组件进行了整合, 并扩展了一些slot,如:cellSlot(单元格插槽)、columnSlot(列插槽)、customHeaderSlot(自定义表头插槽),可以让开发者灵活的定义。除此之外,该组件还提供了一个 deleteRow 实例方法,用于删除某一行并更新 table 数据。

TIP

使用该组件时,请确保在项目中已经安装并配置好 element-plus 库。

TIP

如果使用 unplugin-vue-components 库对 element-plus 进行按需引入时要注意

因为该组件是通过 component vue 的内置组件渲染 el-table 的,这使得 unplugin-vue-components 不会自动引入 el-table 相关组件相关Issue,因此你需要手动导入组件。如果在使用改组件之前, unplugin-vue-components 已经自动导入了 el-table 的相关组件,则无需手动导入以下配置。

举个例子:

在使用 pin-table 之前你并没有直接使用 el-table 组件,这个时候 components.d.ts 的配置,如下:

ts
// generated by unplugin-vue-components
// We suggest you to commit this file into source control
// Read more: https://github.com/vuejs/core/pull/3399
import '@vue/runtime-core'

export {}

declare module '@vue/runtime-core' {
  export interface GlobalComponents {
    PinFilterGroup: typeof import('pinos-ui')['PinFilterGroup']
  }
}

这个时候你就需要手动引入 el-table 组件及它相关组件(如果你开启了 showPagination, 你还需要手动导入 el-pagination 组件)

  • 新建一个 element-plus 导入文件
ts
// element-plus/index.ts
import {  ElTable ElTableColumn, ElEmpty } from 'element-plus'
import type { App } from 'vue'
import 'element-plus/es/components/table/style/css'
import 'element-plus/es/components/table-column/style/css'
import 'element-plus/es/components/empty/style/css'

export default function (app: App) {
  app.component(ElTable.name, ElTable)
  app.component(ElEmpty.name, ElEmpty)
  app.component(ElTableColumn.name, ElTableColumn)
}

  • 在入口文件中使用该配置
ts
// main.ts

import InstallElementPlus from './element-plus/index'
// ...

createApp(App).use(InstallElementPlus)

背景

在多数的组件库,如:naiveuivexipuiantdv 中都有 table 组件,且它们都有一个共同点,都是通过配置的方式去渲染的。但是 element-plus 中的 table 组件则是通过 el-table-column 组件去渲染每一列,这也就意味着,我们需要写许多次 el-table-column,这样我感觉代码不够简洁和直观。因此封装了这该组件用于解决这个问题。

代码示例

自定义表头

id
我是自定义表头
amount1
我是自定义表头2
amount3
129871221298712212987122129871221298712212987122
Tom
234
3.2
10
12987123
Tom
165
4.43
12
12987124
Tom
324
1.9
9
12987125
Tom
621
2.2
17
12987126
Tom
539
4.1
15
提示配置 customHeaderSlot 属性

展开行

id
Name
amount1
129871221298712212987122129871221298712212987122
Tom
234
12987123
Tom
165
12987124
Tom
324
12987125
Tom
621
12987126
Tom
539

树形数据与懒加载

树形数据

Date
Name
Address
2016-05-02
wangxiaohu
No. 189, Grove St, Los Angeles
2016-05-04
wangxiaohu
No. 189, Grove St, Los Angeles
2016-05-01
wangxiaohu
No. 189, Grove St, Los Angeles
2016-05-03
wangxiaohu
No. 189, Grove St, Los Angeles

懒加载

Date
Name
Address
2016-05-02
wangxiaohu
No. 189, Grove St, Los Angeles
2016-05-04
wangxiaohu
No. 189, Grove St, Los Angeles
2016-05-01
wangxiaohu
No. 189, Grove St, Los Angeles
2016-05-03
wangxiaohu
No. 189, Grove St, Los Angeles

合并行或列

合并行

ID
Name
Amount 1
Amount 2
Amount 3
12987122
234
3.2
10
12987123
Tom
165
4.43
12
12987124
324
1.9
9
12987125
Tom
621
2.2
17
12987126
539
4.1
15

合并列

ID
Name
Amount 1
Amount 2
Amount 3
12987122
Tom
234
3.2
10
Tom
165
4.43
12
12987124
Tom
324
1.9
9
Tom
621
2.2
17
12987126
Tom
539
4.1
15

多级表头并自定义某个单元格的内容

Date
Delivery Info
Name
Address Info
State
City
Address
Zip
2016-05-03
Tom
California
Los Angeles
No. 189, Grove St, Los Angeles

自定义cell CA 90036

2016-05-02
Tom
California
Los Angeles
No. 189, Grove St, Los Angeles

自定义cell CA 90036

2016-05-04
Tom
California
Los Angeles
No. 189, Grove St, Los Angeles

自定义cell CA 90036

2016-05-01
Tom
California
Los Angeles
No. 189, Grove St, Los Angeles

自定义cell CA 90036

2016-05-08
Tom
California
Los Angeles
No. 189, Grove St, Los Angeles

自定义cell CA 90036

2016-05-06
Tom
California
Los Angeles
No. 189, Grove St, Los Angeles

自定义cell CA 90036

2016-05-07
Tom
California
Los Angeles
No. 189, Grove St, Los Angeles

自定义cell CA 90036

提示通过配置嵌套 tableColumnProps 和 cellSlot 来实现

索引(默认会根据分页自动累加)

序号
id
Name
amount1
amount2
amount3
1
129871221298712212987122129871221298712212987122
Tom
234
3.2
10
2
12987123
Tom
165
4.43
12
共 5 条
  • 1
  • 2
  • 3
前往
提示组件内部已经默认配置了相关逻辑,因此用户无需额外配置index属性

事件绑定

绑定了 row-click 事件, 请点击某一行,试试效果

id
Name
amount1
amount2
amount3
129871221298712212987122129871221298712212987122
Tom
234
3.2
10
12987123
Tom
165
4.43
12
12987124
Tom
324
1.9
9
12987125
Tom
621
2.2
17
12987126
Tom
539
4.1
15
提示配置tableEvent

空插槽

id
Name
amount1
amount2
amount3
自定义数据为空的内容

空插槽(prop配置的形式),该配置的应用场景一般配合 config-provide 使用,用于配置全局的空状态

id
Name
amount1
amount2
amount3

暂无数据

提示empty 插槽的优先级会比该选项高

删除某一列

当总页数小于等于 1 时,不会调用刷新函数,而是直接删除当前列。当总页数大于 1 且非最后一页时,则会自动请求接口来更新列表

序号
id
Name
amount1
amount2
amount3
操作
1
129871221298712212987122129871221298712212987122
Tom
234
3.2
10
2
12987123
Tom
165
4.43
12
共 5 条
  • 1
  • 2
  • 3
前往

config-provide 全局配置table组件

id
Name
amount1
amount2
amount3
129871221298712212987122129871221298712212987122
Tom
234
3.2
10
12987123
Tom
165
4.43
12
12987124
Tom
324
1.9
9
12987125
Tom
621
2.2
17
12987126
Tom
539
4.1
15
提示该用例全局配置了table的border属性和数据为空时的渲染组件

综合使用

如果配置了 update-methods 属性,在分页触发 size-change 和 current-change 时会自动调用 table 的更新数据方法

id
Name
amount1
amount2
amount3
自定义cell
操作
129871221298712212987122129871221298712212987122
Tom
234
3.2
10

展示当前完整的数据

{ "id": "129871221298712212987122129871221298712212987122", "name": "Tom", "amount1": "234", "amount2": "3.2", "amount3": 10 }

12987123
Tom
165
4.43
12

展示当前完整的数据

{ "id": "12987123", "name": "Tom", "amount1": "165", "amount2": "4.43", "amount3": 12 }

12987124
Tom
324
1.9
9

展示当前完整的数据

{ "id": "12987124", "name": "Tom", "amount1": "324", "amount2": "1.9", "amount3": 9 }

12987125
Tom
621
2.2
17

展示当前完整的数据

{ "id": "12987125", "name": "Tom", "amount1": "621", "amount2": "2.2", "amount3": 17 }

12987126
Tom
539
4.1
15

展示当前完整的数据

{ "id": "12987126", "name": "Tom", "amount1": "539", "amount2": "4.1", "amount3": 15 }

共 100 条
  • 1
  • 2
  • 3
  • 4
  • 5
前往
提示该事例包含了列插槽和单元格插槽的用例

Table 属性

属性名说明类型必传默认值是否可以全局配置
tableDatatable绑定的数据any[][]
tablePropstable组件的props 以 elementPlus 配置为例object{}
tableEventstable组件的事件配置 以 elementPlus 配置为例object{}
tableColumnKey渲染列表的key默认是数组下标,但是如果存在对列的新增和删除,为了有良好的性能,可以传入一个基于 tableData 的唯一的key值string''
tableColumnPropstable列的props 以 elementPlus 配置为例TableColumnProps[][]
showPagination是否展示分页booleantrue
currentPage / v-model:current-page分页的 currentPagenumber1
pageSize / v-model:page-size分页的 pageSizenumber20
total / v-model:total分页的 totalnumber0
paginationOptionspagination的props 以 elementPlus 配置为例object{}
updateMethods分页触发的更新table数据的函数function-
emptyRender数据为空时的渲染函数, empty 插槽的优先级会比该选项高(即empty插槽会覆盖该选项)() => VNode[]h('span', '暂无数据')
componentsConfig配置 table 组件,tableColumn 组件,pagination 组件的组件名objectpagination: 'el-pagination', table: 'el-table', tableColumn: 'el-table-column'

TableColumnProps

该属性在 tableColumn 的 props 配置的基础上扩展了以下几个属性:

属性名说明类型必传默认值
cellSlot单元格的插槽名string-
columnSlottable列的插槽名string-
customHeaderSlot自定义表头的插槽名string-
tableColumnProps嵌套 tableColumn 的配置项(多用于多级表头)TableColumnProps[]-

Table 插槽

插槽名说明
empty当数据为空时自定义的内容

Table 组件实例方法

方法名说明参数默认值返回值
deleteRow删除某一行list: MaybeRef<T[]>, index: number-void