An efficiently updated div table Vue component. Compatible with Vue 2.x
To view a demo online: https://tm-fe.github.io/FlexTable/examples/dist/
To view demo examples locally clone the repo and run yarn install && yarn dev
or view local example
- 支持最大高度,超过 fixed header
- 固定列
- footer 展示汇总数据
- 自定义列宽
- 排序
- 拖动调整列宽(resizable)
- selectable
- expand 嵌套功能
- 异步渲染
- selectable模式下渲染选中行背景色
- 初始化渲染行、列、单元格背景色
- 合并单元格
- 拖动改变列顺序
npm install --save tm-flextable
// or
yarn add tm-flextable
import { FlexTable } from 'tm-flextable';
export default {
// ...
components: {
FlexTable
}
// ...
}
<script src="https://unpkg.com/tm-flextable@latest/dist/index.js" type="text/javascript"></script>
然后直接在页面使用
<div id="app">
<flex-table
resizable
:loading="loading"
:columns="columns"
:data="list"
:sum="sum">
</flex-table>
</div>
<script>
new Vue({
el: '#app',
data: {
// ...
},
methods: {
// ...
}
})
</script>
// main.js
import Vue from 'vue';
import VueRouter from 'vue-router';
import App from 'components/app.vue';
import Routers from './router.js';
import FlexTable from 'tm-flextable';
Vue.use(VueRouter);
Vue.use(FlexTable); // 全局注册组件
//or
// app.vue
// 局部注册
import { FlexTable } from 'tm-flextable';
export default {
components:{
flexTable
},
// ...
属性 | 说明 | 类型 | 默认值 |
---|---|---|---|
data | 显示的结构化数据 | Array | [] |
columns | 表格列的配置描述,具体项见后文 | Array | [] |
sum | 显示的结构化数据汇总 | Object | {} |
loading | 是否加载中 | Boolean | false |
resizable | 是否可拖动调整列宽 | Boolean | false |
height | 表格高度,单位 px,设置后,如果表格内容大于此值,会固定表头 | Number | - |
no-data | 数据为空时显示的提示内容 | String | No Data |
asyncRender | 不为 0 时使用异步渲染模式,mounted 触发前渲染的行数(建议是刚好首屏,见后文详细说明) | number | 0 |
minWidth | 最小列宽 | Number | 40 |
maxWidth | 拖动调整时,可调的最大列宽, 默认不限制 | number | - |
size | 表格大小 default/big/small | String | default |
theme | 颜色 light/dark | String | light |
border | 边框显示 | Boolean | true |
stripe | 行的斑纹显示 | Boolean | true |
fixedHead | 全屏固定头部 | Boolean | false |
fixedHeadTop | 全屏固定头部离顶部距离 | Number | 0 |
checkFixedHeadTop | 全屏固定头部离顶部距离判断(可以自定义) | Function | '' |
selectedClass | 单选或多选模式下,渲染选中行样式 | string | '' |
rowClassName | 初始化渲染行背景色 | Function | '' |
autoCalWidth | 是否自动计算width | Boolean | true, 默认true,false时会严格按照设置的width来展示 |
span-method | 合并行(合并列暂未实现) | Function | 方法的参数是一个对象,里面包含当前行row、当前列column、当前行号rowIndex、当前列号columnIndex四个属性。该函数可以返回一个包含两个元素的数组,第一个元素代表rowspan,第二个元素代表colspan。 也可以返回一个键名为rowspan和colspan的对象。具体见 demo |
multiple | 是否多选(设置false即为单选) | Boolean | true |
selectedData | 传入的默认选中id | Array | |
uniqueKey | 表格数据的唯一值名称(处理id重复报错问题) | String | |
virtualScroll | 虚拟滚动的展示条数(设置此值即自动开启虚拟滚动功能) | Number | |
virtualHeight | 虚拟滚动的单条数据高度(开启虚拟滚动时必填,否则表格会有间隙错位) | Number | 40 |
scrollContainer | 表格所在的滚动容器,默认document,传String会使用document.querySelector查询 | String/Object | document |
fixedXScroll | 是否固定横向滚动 | Boolean | false |
fixedXScrollBottom | 固定横向滚动的底部位置 | Number/String | 0 |
vertical | 表格单元格是否垂直居中 | Boolean | false(如果需要某一列需要垂直居中:在表columns中给需要垂直居中的字段增加 vertical: true 即可) |
事件名 | 说明 | 返回值 |
---|---|---|
on-sort-change | 排序时有效,当点击排序时触发 | column:当前列数据; key:排序依据的指标; order:排序的顺序,值为 asc 或 desc |
on-selection-change | 点击全选时触发 | selection:已选项数据; row: 当前选中行数据 |
on-all-cancel | 全选取消时触发 | selection:已选项数据 |
on-selection-cancel | 单选取消时触发 | selection:已选项数据 |
on-render-done | 异步渲染完成时触发(asyncRender 不为 0 时生效) | - |
on-scroll-x | 横向滚动事件 | event |
on-col-width-resize | 调整列宽事件 | newWidth, oldWidth, column, event |
列描述数据对象,是 columns 中的一项
属性 | 说明 | 类型 | 默认值 |
---|---|---|---|
title | 列名 | String | - |
key | 列名 | String | - |
type | 列类型,可选值为 index、selection、expand | String | - |
width | 列宽,不设置将自动分配,最小 60px | Number | 60 |
align | 对齐方式,可选值为 left 左对齐、right 右对齐和 center 居中对齐 | String | Left |
fixed | 列是否固定在左侧或者右侧,可选值为 left 、right |
String | - |
render | 自定义渲染列,使用 Vue 的 Render 函数。传入两个参数,第一个是 h,第二个为对象,包含 row、column 和 index,分别指当前行数据,当前列数据,当前行索引,详见示例。 | Function | - |
renderHeader | 自定义列头显示内容,使用 Vue 的 Render 函数。传入两个参数,第一个是 h,第二个为对象,包含 column 和 index,分别为当前列数据和当前列索引。 | Function | - |
sortable | 对应列是否可以排序,如果设置为 custom,则代表用户希望远程排序,需要监听 Table 的 on-sort-change 事件 | Boolean | false |
sortType | 设置初始化排序。值为 asc, desc 和 normal | String | normal |
resizable | 是否可拖动调整列宽(必须设置table props 的 resizable 为 true 才生效) | Boolean | - |
minWidth | 最小列宽(优先级高于table props) | number | - |
maxWidth | 拖动调整时,可调的最大列宽, 默认不限制(优先级高于table props) | number | - |
className | 初始化渲染列的背景色 | string | '' |
行描述数据对象,是 list 中的一项
属性 | 说明 | 类型 | 默认值 |
---|---|---|---|
cellClassName | 指定任意一个单元格的背景色 | Object | {} |
行类名、列类名、单元格类名和选中行类名的权重由它们的定义顺序决定 定义在后面的权重相对较大
名称 | 说明 |
---|---|
loading | 加载中 |
异步渲染功能,适用于数据量特别大,改善首次渲染慢的情况。asyncRender 值为 mounted 之前首次渲染的行数,剩余行数会在 mounted 之后以 RAF 的方式逐行渲染,因此如果没有设置表格最大高度 height, 可能会造成页面抖动和 reflow, 建议设置 table height prop。 此外, 当表格数据 data 属性变化时,也会造成整表重新渲染,而失去 vue diff 的优势, 可以在首次异步渲染完成后的 on-render-done 事件中,将 asyncRender 的值改为 pageSize 相同的值,这样可以避免整表重新渲染。
虚拟滚动功能注意点:
-
- 只支持每条数据高度一致的情况,不支持展开行以及任何会改变单元格高度的方式;
-
- 不支持分组表头;
-
- 当表格有固定列的情况,虚拟滚动可能会有延迟
-
- 必须给源数据每一项加上唯一id。必须确定且唯一。假如用随机数,会导致每次的id都不一致,vue会误以为是有是数据更新,无法复用。详见Vue的dIff算法。
yarn test
or
npm test
tm-flextable
is released under the MIT license.