vxe-table 一个全功能的 Vue 表格,满足绝大部分对 Table 的一切需求,与任意组件库完美兼容
因为公司项目需求,需要跟大数据还有表格汇总打交道,刚开始用的是组件element-ui,随着项目需求的增加,element-ui无法满足我所需要的,这个时候 vxe-table 进入了我的视线,接触了之后才发现他的功能是真的强大。
基础类型(大概的属性跟性能)
1、表格的边框(有三种形式)
<vxe-table :data="tableData" border=true></vxe-table>
border=none 去掉外部边框
border=false 只显示外边框
border=true 显示所有边框
不设置默认 border=false 只显示外边框 这三种样式可以解决大部分表格边框的样式需求
2、每一列文字的方向 (居左、居中、居右)
<vxe-table :align="allAlign" :data="tableData"></vxe-table>
设置 属性 align “left”“center”“right”
3、序号 、列宽 、表格高度
序号
系统设置序号 type=seq 开启序号列
<vxe-table :data="tableData" type=seq>
<vxe-table-column type="seq" width="60"></vxe-table-column>
</vxe-table>
自定义起始序号 :seq-config="{startIndex: 100}"
<vxe-table :seq-config="{startIndex: 100}" :data="tableData">
<vxe-table-column type="seq" title="序号" width="60"></vxe-table-column>
</vxe-table>
自定义方法 :seq-config="{seqMethod: seqMethod}"
<vxe-table :seq-config="{seqMethod: seqMethod}" :data="tableData">
<vxe-table-column type="seq" title="序号" width="60"></vxe-table-column>
</vxe-table>
在vue的method 写一个seqMethod 方法
列宽
通过设置 width 参数,支持固定像素、百分比、自适应等,如果不设置则全部均匀分配
(注:不应该全部都使用固定像素,应该当所有列加起来的宽度小于表格宽度时,就会出现空白区,可以配合 “%” 或 “min-width” 实现等比例缩放) 不设置宽度即为自适应
通过设置 vxe-table的resizable 属性启用列宽拖动功能
当一个表格高度需要自适应的时候可以设置为最大高度 vxe-table 设置 max-height=“200” 如果设置 max-height,当内容为达到最大高度时会自适应 max-height=“100%” 也可以设置相对于父容器的百分比
4、每一个单元格内容放不下时显示 此为 vxe-table-column 的属性
当内容或表头超过隐藏时显示为省略号,show-overflow 和 show-header-overflow
ellipsis 当内容超过时显示为省略号
title 当内容超过时显示为省略号并用原生 title 显示
tooltip 当内容超过隐藏时显示为省略号并用 tooltip 显示
还可以通过 enterable 开启鼠标是否可进入到 tooltip 中
有点类似与 element-ui 但vxe-table显示的形式较多
5、斑马线条纹 (注:在可编辑表格场景下,临时插入的数据不会有斑马纹样式)、高亮
<vxe-table stripe highlight-current-row highlight-hover-row :data="tableData"></vxe-table>
缺点:没有element-ui 可以自定义斑马线的颜色 高亮的颜色
高亮
highlight-hover-row 鼠标移到行是否要高亮显示 boolean 布尔值
highlight-current-row 是否要高亮当前行 boolean 布尔值
highlight-hover-column 鼠标移到列是否要高亮显示 boolean 布尔值
highlight-current-column 是否要高亮当前列 boolean 布尔值
使用 highlight-current-row 显示高亮行;用户操作点击选项时会触发事件 current-change
6、单元格的样式
行的样色、单元格样式,表头的样式、表尾的样式、全部都可以完全自定义
(注:当自定义样式之后可能会覆盖表格的样式,比如选中行…等,记得自行处理好相关样式)
vxe-table的属性
:header-cell-class-name 表头的样式
:row-class-name 行的样色
:cell-class-name 列的样式
:header-cell-style 表头的动态样色
:row-style 行的动态样色
:cell-style 列的动态样色
隐藏表头 :show-header=“false”
7、固定表头和列
当纵向内容过多时,固定表头就非常有用了,通过设置 height 参数
vxe-table 设置属性 height=“400”
固定列,通过设置 fixed 参数
当横向内容过多时,将列固定在左右两侧 如果列宽足够的情况下,固定列不会浮动
在最左边的 vxe-table-column 设置 fixed=“left” 属性
在最右边的 vxe-table-column 设置 fixed="right"属性
8、表头分组
当数据结构比较复杂的时候,可以使用多级表头显示更加直观 相当于在 vxe-table-column 在套一层 vxe-table-column
<vxe-table-column title="基本信息">
<vxe-table-column type="seq" width="60"></vxe-table-column>
<vxe-table-column field="name" title="Name"></vxe-table-column>
</vxe-table-column>
注:如果使用了分组表头,则需要按组来设置固定列,且固定列必须是在左右两侧位置,不允许跨列
9、 单选框 复选框
单选框 vxe-table-column type属性设置为 radio
<vxe-table-column type="radio" width="60"></vxe-table-column>
改变单选框所在列的表头
<vxe-table-column type="radio" width="60">
<template v-slot:header>
<vxe-button type="text">取消</vxe-button>
</template>
</vxe-table-column>
单选表格,用户手动选中时会触发事件 vxe-table 属性 radio-change 事件
checkMethod 方法控制 checkbox 是否允许用户手动选中,还可以配置 labelField 列显示属性
<vxe-table
border
ref="xTable2"
height="300"
:radio-config="{labelField: 'name', checkMethod}"
:data="tableData">
<vxe-table-column type="radio" title="请选择" width="100"></vxe-table-column>
<vxe-table-column field="sex" title="Sex"></vxe-table-column>
<vxe-table-column field="age" title="Age"></vxe-table-column>
<vxe-table-column field="address" title="Address" show-overflow></vxe-table-column>
</vxe-table>
checkMethod ({ row }) {
return row.age > 26
}
默认选中,通过指定 checkRowKey 设置默认选中的行,指定默认值需要有 row-id
<vxe-table
border
height="300"
row-id="id"
:data="tableData"
:radio-config="{checkRowKey: '2'}">
<vxe-table-column type="radio" width="60"></vxe-table-column>
<vxe-table-column field="name" title="Name"></vxe-table-column>
<vxe-table-column field="sex" title="Sex"></vxe-table-column>
<vxe-table-column field="address" title="Address" show-overflow></vxe-table-column>
</vxe-table>
row-id=‘属性名或者参数名’ checkRowKey: ‘应该是哪个属性名或者参数名默认选中’
复选框
vxe-table-column type属性设置为 checkbox
<vxe-table-column type="checkbox" width="60">
</vxe-table-column>
多选表格,用户手动勾选时会触发事件 checkbox-change
可以通过 checkMethod 方法控制 checkbox 是否允许用户手动勾选,还可以配置 labelField 列显示属性
<vxe-table
border
ref="xTable2"
:data="tableData"
:checkbox-config="{labelField: 'name', checkMethod}">
<vxe-table-column type="checkbox" title="All"></vxe-table-column>
<vxe-table-column field="sex" title="Sex"></vxe-table-column>
<vxe-table-column field="age" title="Age"></vxe-table-column>
<vxe-table-column field="address" title="Address" show-overflow></vxe-table-column>
</vxe-table>
checkMethod ({ row }) {
return row.age > 26
}
通过配置 trigger 设置触发源,使用渲染最快的 checkField 属性绑定方式 点击行也选中
vxe-table 添加 属性 :checkbox-config="{checkField: ‘checked(属性名)’, trigger: ‘row’}"
每个列表的字段都有 checked(也可以是其他的名字 boolean值) 为false
通过指定 checkRowKeys 设置默认选中的行,指定默认值需要有 row-id
<vxe-table
border
highlight-hover-row
row-id="id"
:data="tableData"
:checkbox-config="{checkRowKeys: ['2', '3']}"
:radio-config="{labelField: 'name'}">
<vxe-table-column type="checkbox" width="60"></vxe-table-column>
<vxe-table-column type="radio" width="300" title="Name"></vxe-table-column>
<vxe-table-column field="sex" title="Sex"></vxe-table-column>
<vxe-table-column field="age" title="Age"></vxe-table-column>
<vxe-table-column field="address" title="Address" show-overflow></vxe-table-column>
</vxe-table>
10、 排序
通过给需要排序功能的列加上 sortable 属性可以支持排序,
<vxe-table
border
highlight-hover-row
ref="xTable"
height="300"
:data="tableData">
<vxe-table-column type="seq" width="60"></vxe-table-column>
<vxe-table-column field="name" title="Name" sortable></vxe-table-column>
<vxe-table-column field="nickname" title="Nickname" sortable></vxe-table-column>
<vxe-table-column field="sex" title="Sex" sortable></vxe-table-column>
<vxe-table-column field="age" title="Age" sortable></vxe-table-column>
<vxe-table-column field="time" title="Time" sortable></vxe-table-column>
</vxe-table>
还可以通过设置 sort-by 多字段进行排序
<vxe-table
border
highlight-hover-row
height="300"
:data="tableData">
<vxe-table-column field="time" title="Time" sortable :sort-by="['time', 'name']"></vxe-table-column>
</vxe-table>
如果是服务端排序,只需加上 remote-sort 和 sort-change 事件就可以实现 两种方法
<vxe-table
border
highlight-hover-row
height="300"
:data="tableData"
@sort-change="sortChangeEvent">
<vxe-table-column type="seq" width="60"></vxe-table-column>
<vxe-table-column field="name" title="Name" sortable :sort-method="sortNameMethod"></vxe-table-column>
<vxe-table-column field="nickname" title="Nickname" sortable></vxe-table-column>
<vxe-table-column field="sex" title="Sex" sortable></vxe-table-column>
<vxe-table-column field="age" title="Age" sortable></vxe-table-column>
<vxe-table-column field="time" title="Time" sortable></vxe-table-column>
</vxe-table>
sortNameMethod (a, b) {
// 例如:名称不区分大小写的排序
var v1 = (a.name || '').toLowerCase()
var v2 = (b.name || '').toLowerCase()
return v1 < v2 ? -1 : v1 > v2 ? 1 : 0
},
sortChangeEvent ({ column, property, order }) {
console.info(property, order)
}
还可以通过调用 sort 方法实现手动排序
通过点击表头排序,通过 defaultSort 默认排序、通过配置 trigger 设置触发源
<vxe-table
border
highlight-hover-row
highlight-hover-column
height="300"
:data="tableData"
:sort-config="{trigger: 'cell', defaultSort: {field: 'age', order: 'desc'}}"
>
<vxe-table-column type="seq" width="60"></vxe-table-column>
<vxe-table-column field="name" title="Name"></vxe-table-column>
<vxe-table-column field="nickname" title="Nickname" sortable></vxe-table-column>
<vxe-table-column field="sex" title="Sex" sortable></vxe-table-column>
<vxe-table-column field="age" title="Age" sortable></vxe-table-column>
<vxe-table-column field="time" title="Time" sortable></vxe-table-column>
</vxe-table>
11、 筛选
通过设置 filters 属性和 filter-method 方法可以支持列筛选功能,可以通过 filter-multiple=false 设置为单选
如果是服务端筛选,只需加上 filter-config={remote: true} 和 filter-change 事件就可以实现
如果是动态数据请配合 filter 方法,参数 filters 不支持动态数据
context 对象(查看高级用法):
changeOption(event, checked, option) 更新选项的状态
confirmFilter() 确认筛选
resetFilter() 清除筛选条件
跟element-ui的筛选类似
12 空数据 加载中 HTML标签
不管是element-ui还是 vxe-table 在列表无数据的时候显示的样式比较单一
所以提供了一种 插槽 slot=empty
<vxe-table
border
:loading="loading"
:data="tableData">
<vxe-table-column type="seq" width="60"></vxe-table-column>
<vxe-table-column field="name" title="Name"></vxe-table-column>
<vxe-table-column field="sex" title="Sex"></vxe-table-column>
<vxe-table-column field="age" title="Age"></vxe-table-column>
<vxe-table-column field="address" title="Address" show-overflow></vxe-table-column>
<template v-slot:empty>
<span style="color: red;">
<img src="static/other/img2.gif">
<p>没有更多数据了!</p>
</span>
</template>
</vxe-table>
此插槽 slot 可以放自己想要的动静态样式 而且无数据并且横向有滚动条的时候 此样式会保持一种居中的状态
加载中也就是相当于添加了一个loading
<vxe-table
border
highlight-hover-row
height="300"
:loading="loading"
:data="tableData">
<vxe-table-column type="seq" width="60"></vxe-table-column>
<vxe-table-column field="name" title="Name" sortable></vxe-table-column>
<vxe-table-column field="sex" title="Sex"></vxe-table-column>
<vxe-table-column field="age" title="Age"></vxe-table-column>
<vxe-table-column field="address" title="Address" show-overflow></vxe-table-column>
</vxe-table>
判断变量 loading是true还是false
HTML标签 vxe-table-column 的type类型改为 html
<vxe-table-column field="describeHtml" type="html" title="HTML 标签"></vxe-table-column>
13 格式化内容(比如日期 金额 银行卡号 数值)
局部自定义 formatter 格式化内容
(注:formatter 只会在指定的 field 值发生改变时触发格式化,如果想要多字段关联变化请使用自定义模板)
全局格式化内容,基于 xe-utils 函数库挂载方法进行数据处理,会在渲染的时候自动调用
(用于实现业务中统一的格式化处理,这对于很多场景非常有用,减少很多不必要的重复代码)
<vxe-table
border
:data="tableData">
<vxe-table-column type="seq" width="60"></vxe-table-column>
<vxe-table-column field="date" title="转日期" width="180" formatter="formatDate"></vxe-table-column>
<vxe-table-column field="time" title="转日期格式" width="140" :formatter="['formatDate', 'yyyy-MM-dd']"></vxe-table-column>
<vxe-table-column field="amount" title="格式化金额" formatter="formatAmount"></vxe-table-column>
<vxe-table-column field="bankCard" title="银行卡" width="180" formatter="formatBankcard"></vxe-table-column>
<vxe-table-column field="num7" title="截取2位数" formatter="formatCutFixed"></vxe-table-column>
<vxe-table-column field="num7" title="四舍五入2位数" formatter="formatFixed"></vxe-table-column>
<vxe-table-column field="sex" title="格式化性别" :formatter="['formatSelect', sexList]"></vxe-table-column>
</vxe-table>
// 自定义全局的格式化处理函数
XEUtils.mixin({
// 格式化下拉选项formatSelect (cellValue, list) {
let item = list.find(item => item.value === cellValue)
return item ? item.label : ‘’
},
// 格式化日期,默认 yyyy-MM-dd HH:mm:ss
formatDate (cellValue, format) {
return XEUtils.toDateString(cellValue, format || 'yyyy-MM-dd HH:mm:ss')
},
// 格式金额,默认2位数
formatAmount (cellValue, digits) {
return XEUtils.commafy(cellValue, { digits: digits || 2 })
},
// 格式化银行卡,默认每4位隔开
formatBankcard (cellValue) {
return XEUtils.commafy(cellValue, { spaceNumber: 4, separator: ' ' })
},
// 四舍五入,默认两位数
formatFixed (cellValue, digits) {
return XEUtils.toNumber(cellValue).toFixed(digits || 2)
},
// 截取小数,默认两位数
formatCutFixed (cellValue, digits) {
return XEUtils.toFixedString(cellValue, digits || 2)
}
})
14、单元格事件绑定
@header-cell-click 表头单元格单机
headerCellClickEvent ({ row, rowIndex, column, columnIndex }, event) {
console.log(`表头单元格点击${column.title}`)
},
@header-cell-dblclick 表头单元格双击
headerCellDBLClickEvent ({ row, rowIndex, column, columnIndex }, event) {
console.log(`表头单元格双击${column.title}`)
},
@cell-click 单元格点击
cellClickEvent ({ row, rowIndex, column, columnIndex }, event) {
console.log(`单元格点击${column.title}`)
},
@cell-dblclick 单元格双击
cellDBLClickEvent ({ row, rowIndex, column, columnIndex }, event) {
console.log(`单元格双击${column.title}`)
},
@cell-mouseenter 鼠标进入单元格
cellMouseenterEvent ({ row, rowIndex, column, columnIndex }, event) {
console.log(`鼠标进入单元格${column.title}`)
},
@cell-mouseleave鼠标离开单元格
cellMouseleaveEvent ({ row, rowIndex, column, columnIndex }, event) {
console.log(`鼠标离开单元格${column.title}`)
}