vxe-table 启用虚拟滚动加载大数据表格

介绍vxe-table如何通过虚拟滚动技术实现大数据表格的快速渲染,仅展示可视区域数据,大幅提升性能,适用于大量数据展示场景。放弃动态行高、展开行等功能,以换取高效的渲染速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

vxe-table 启用虚拟滚动加载大数据表格

一般情况渲染表格加载数据不应该太多,但某些场景如果需要加载大数据量,[vxe-table]](https://xuliangzhan_admin.gitee.io/vxe-table/#/table/base/basic) 支持开启大数据量渲染,原理就是只渲染界面能所能看到部分数据,看不到的数据全部收起来,这个渲染起来的性能就非常快了。不过一旦启用虚拟滚动就必然要放弃动态行高、展开行、树结构等特殊功能,毕竟鱼与熊掌不可兼得,自行取舍喽。
下面简单介绍一下如何使用

相关的参数说明(具体参数请看 官方文档):

scrollX 是指横向虚拟滚动, gt 是指当大于 n 列是自动触发渲染大数据
scrollY 是指纵向虚拟滚动, gt 是指当大于 n 行是自动触发渲染大数据
:optimization="{scrollX: {gt: 40}, scrollY: {gt: 200}}"

<vxe-table height="400" :loading="loading" :data="tableData">
  <vxe-column type="seq" width="60"></vxe-column>
  <vxe-column field="name" title="Name"></vxe-column>
  <vxe-column field="sex" title="Sex"></vxe-column>
  <vxe-column field="date" title="Date"></vxe-column>
  <vxe-column field="address" title="Address"></vxe-column>
</vxe-table>
export default {
	data () {
		loading: false,
      	tableData: []
	},
	created () {
	    this.loading = true
	    setTimeout(() => {
	      var list = []
	      for(var index = 0; index < 10000; index++){
	        list.push({
	          name: 'test' + index,
	          sex: 'Man',
	          date: '2019-05-01'
	        })
	      }
	      const startTime = Date.now()
	      this.tableData = list
	      this.loading = false
	      this.$nextTick(() => {
	        console.log(`渲染完成 ${Date.now() - startTime} 毫秒`)
	      })
	    }, 300)
	}
}
> 渲染完成 157 毫秒

一次性渲染 1w 条数据只用了 157 多毫秒,在线运行 https://jsrun.pro/FIfKp/edit

单元格中一些常见的参数说明:

row:行数据对象
rowIndex:相对于 data 中的索引
$rowIndex:相对于可视区渲染中的行索引(也就是说和实际渲染 tr 相对应)
_rowIndex:相对于当前表格数据的索引(比如排序后、筛选之后等的相对索引)
column:列配置对象
columnIndex:现对于 columns 中的索引
$columnIndex:相对于可视区渲染中的列索引(也就是说和实际渲染 th 相对应)
cell:对应的 th/td 对象

单元格中一些常的方法说明:

加载数据,不会清除条件
loadData()

重新加载数据,会清除所有条件
reloadData()

获取当前表格的数据(完整的全量表体数据、处理条件之后的全量表体数据、当前渲染中的表体数据、当前渲染中的表尾数据)
getTableData():返回 { fullData, visibleData, tableData, footerData }

获取当前表格的列(收集到的全量列、全量表头列、处理条件之后的全量表头列、当前渲染中的表头列)
getTableColumn():返回 { collectColumn, fullColumn, visibleColumn, tableColumn }

获取表格数据集(新增的数据、删除的数据、更改的数据)
getRecordset():返回 { insertRecords, removeRecords, updateRecords }

在Vue3中使用VxeTable实现大数据虚拟滚动并实现实时自动滚动的效果,通常需要结合`vue-virtual-scroller`这样的库来处理分页和滚动加载。首先,你需要安装VxeTable和`vue-virtual-scroller`: ```bash npm install vxe-table vue-virtual-scroller ``` 然后,在组件中配置VxeTable,使用`virtualScroll`选项启用虚拟滚动,并设置`pageSize`或`loadSize`来控制每一页的数据量。同时,你可以监听滚动事件来判断是否需要加载更多数据。 ```js <template> <vxe-table :data="tableData" :virtual-scroll="{ pageSize: 50, loadSize: 100 }" @scroll-end="onScrollEnd"> <!-- ... --> </vxe-table> </template> <script> import { VxeTable } from 'vxe-table' import { useVirtualScroll } from 'vue-virtual-scroller' export default { components: { VxeTable }, setup() { const tableData = // 初始化数据源 const { scrollY, scrollTop, scrollHeight } = useVirtualScroll() function onScrollEnd() { if (scrollHeight - scrollTop > window.innerHeight) { // 加载更多数据,这里只是示例,你需要根据实际接口调用补充 fetchData({ start: scrollTop + scrollY, length: loadSize }) } } return { tableData, scrollY, scrollTop, scrollHeight, onScrollEnd } }, methods: { fetchData(options) { // 这里模拟异步请求,返回新的数据添加到tableData中 setTimeout(() => { this.tableData.push(...newData) }, 2000) } } } </script> ``` 当用户将鼠标移动到表格区域内时,你可以监听`mouseover`事件停止自动滚动,鼠标离开时(`mouseout`)恢复滚动: ```html <template> <div class="table-container" @mouseenter="stopScrolling" @mouseleave="resumeScrolling"> <vxe-table ref="tableRef" :data="tableData" :virtual-scroll="{ ... }" @scroll-end="onScrollEnd"> <!-- ... --> </vxe-table> </div> </template> <script> // ... methods: { ..., stopScrolling() { this.$refs.tableRef.$emit('stop', true) // 停止滚动 }, resumeScrolling() { this.$refs.tableRef.$emit('stop', false) // 恢复滚动 } } // ... </script> ``` 记得调整CSS样式,确保`.table-container`包含滚动区域,`stop`和`resume`事件可以根据VxeTable的API文档来确认具体的触发方式。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值