您现在的位置是:首页 > 技术教程 正文

vue最强table vxe-table 虚拟滚动列表 前端导出

admin 阅读: 2024-03-27
后台-插件-广告管理-内容页头部广告(手机)

最近遇到个问题。后台一次性返回2万条列表数据。

并且需求要求所有数据必须全部展示,不能做假分页(不能优化了)。

这些数据的直接来源就是CS客户端。

他们做CS客户端就是一次性加载几万条数据不分页(说这是客户的要求)。

我体验了一把CS客户端,数万条数据放在那里,着实卡顿。

他们CS开发人员非他妈嘴硬说,这一点也不卡,极致顺滑。

真尼玛在这里掩耳盗铃呢,是吗?懒得跟他们废话。

结论就是:永远不要和傻子讲道理。

不废话,开整吧。

既然需要一次性展示数万条数据,那么element-table基本是不行了,毕竟也不能做个假分页。

终于,茫茫人海,遇到了 vxe-table。

官方地址:https://vxetable.cn/#/table/start/install

 最高支持10w+数据的流畅滚动。确实厉害。

那么这么厉害的虚拟滚动,如何实现?

官方也一语道破。

没错,就是懒加载。界面上只是在窗口可视区域范围内加载数据,随着鼠标滚动,再继续加载下一波数据。

怎么用?

第一,写下table模板

  1. border
  2. show-overflow
  3. show-header-overflow
  4. ref="tableRef"
  5. height="600"
  6. :row-config="{isCurrent: true, isHover: true, useKey: true}"
  7. :column-config="{resizable: true}"
  8. :export-config="{}"
  9. :loading="demo1.loading"
  10. :sort-config="{trigger: 'cell'}"
  11. :scroll-y="{ enable: true }"
  12. :checkbox-config="{checkField: 'checked'}">
  13. <vxe-column type="seq" width="100" fixed="left">vxe-column>
  14. <vxe-column type="checkbox" width="60" fixed="left">vxe-column>
  15. <vxe-column field="attr0" title="Attr0" width="200" sortable>vxe-column>
  16. <vxe-column field="attr1" title="Attr1" width="200">vxe-column>
  17. <vxe-column field="attr2" title="Attr2" width="200">vxe-column>
  18. <vxe-column field="attr3" title="Attr3" width="200">vxe-column>
  19. <vxe-column field="attr4" title="Attr4" width="200">vxe-column>
  20. <vxe-column field="attr5" title="Attr5" width="200">vxe-column>
  21. <vxe-column field="attr6" title="Attr6" width="300" sortable>vxe-column>
  22. <vxe-column field="attr7" title="Attr7" width="200" sortable>vxe-column>
  23. <vxe-column field="attr8" title="Attr8" width="200">vxe-column>
  24. <vxe-column field="attr9" title="Attr9" width="200">vxe-column>
  25. <vxe-column field="attr10" title="Attr10" width="200">vxe-column>
  26. <vxe-column field="attr11" title="Attr11" width="200">vxe-column>
  27. <vxe-column field="attr12" title="Attr12" width="200">vxe-column>
  28. <vxe-column field="attr13" title="Attr14" width="200">vxe-column>
  29. <vxe-column field="attr14" title="Attr14" width="200">vxe-column>
  30. <vxe-column field="attr15" title="Attr15" width="200">vxe-column>
  31. <vxe-column field="attr16" title="Attr16" width="200" fixed="right">vxe-column>

这样子,看起来和element-table几乎没有区别。只是注意一些常用字段,改了下名字。

第二,写下数据请求方法

但是你发现这里没有绑定数据,也就是 :data="tableData"。

仔细想想朋友,10万+数据你交给vue双向绑定,你是要累死谁啊?不合适啊,这么干。所以,官方提供了一个方法:reloadData。

  1. // 第一步: 接口请求后台数据(可能是10万条数据)
  2. new Promise(resolve => {
  3. // 注意 这里引入接口方法
  4. getList().then(res => {
  5. // 在这里将请求的列表数据 返回出promise
  6. resolve(res ? res : [])
  7. })
  8. }).then(list => {
  9. /*
  10. * 在这里开始给vxe-table数据了
  11. */
  12. // 1. 首先通过 $refs(vue内部方法,或者原生获取vxe-table这个dom)
  13. const VXE_TABLE = this.$refs.tableRef;
  14. // 2. 通过这个dom下挂载的方法 reloadData 方法 取数据
  15. VXE_TABLE..reloadData(list).then(() => {
  16. // 如果你有loading的话 可以在这里关闭
  17. })
  18. // 至此, 数据接收完毕。
  19. }).catch(err => {
  20. console.log('请求数据报错了 -- ',err);
  21. })

第三,自定义(翻译)字段

总有一些需要自己翻译的字段。实际上和element-table很类似。

还是插槽。更多插槽,请移步官方文档:vxe-table v4

 第四,高亮某一行,跳转到某一行

  1. border
  2. ref="tableRef"
  3. height="300"
  4. :row-config="{isCurrent: true, isHover: true}"
  5. :data="tableData"
  6. @current-change="currentChangeEvent">
  7. <vxe-column field="name" title="Name">vxe-column>
  8. <vxe-column field="sex" title="Sex">vxe-column>
  9. <vxe-column field="age" title="Age">vxe-column>
  10. <vxe-column field="address" title="Address" show-overflow>vxe-column>

配置 row-config.

然后写一个方法 setCurrentRow.

  1. // 老规矩 还是获取table这个dom
  2. // talbeData[0] 设置第一行数据高亮
  3. this.$refs.tableRef.setCurrentRow(talbeData[0])

等等?刚才说,这个data没有绑定。那么我们应该去哪里拿到这个数据呢?

  1. // 通过 reloadData方法获取数据的 通过下边方式 拿到所有的table数据
  2. const TABLE_DATA = this.$refs.tableRef.allFullData;
  3. // 然后就可以愉快的设置某一行数据了 index 就是你需要哪一行数据高亮
  4. this.$refs.tableRef.setCurrentRow(TABLE_DATA[index])
  5. // 想要一键删除所有高亮 那么就直接调用 clearCurrentRow
  6. this.$refs.tableRef.clearCurrentRow
  7. // 如果需要跳转到某一行 比如 跳转定位到 第 100 行
  8. // 首先我们要知道每一行的高度, 比如每一行高度是 40 px
  9. // 那么需要dom滚动的距离就是 index * 40
  10. // 所以 就是如下
  11. document.querySelector('.body--wrapper').scrollTop = index * 40;
  12. // 至此,跳转成功

第五,导出数据

本来这个导出数据这个事,后台返回个流,前端处理下就完事了。

但是这个table组件厉害了。可以直接通过内置方法,直接导出数据。

内置的格式有 txt,html,csv等等。

说实话,也够用了。

  1. // 例如 导出csv文件 使用内置 $table.exportData({ type: 'csv' }) 方法
  2. this.$refs.tableRef.exportData({type: 'csv'})

但是,需求要求我们导出pdf(wocao)。

对不起,失态了。

那么,我们也可以利用 vxe-table 的插件实现该功能。

文档:vxe-table v4 集成第三方

  1. // 首先肯定是要安装这个插件了
  2. npm install xe-utils vxe-table@next vxe-table-plugin-export-pdf@next jspdf
  3. // 没错 基于 jspdf做的插件
  4. // 然后 入口文件引入
  5. import VXETable from 'vxe-table'
  6. import VXETablePluginExportPDF from 'vxe-table-plugin-export-pdf'
  7. // ...
  8. VXETable.use(VXETablePluginExportPDF)
  9. // 然后配置字体
  10. // 需要注意的是 中文尤其要配字体 不然导出就是乱码
  11. VXETablePluginExportPDF.setup({
  12. // Set default font
  13. fontName: 'SourceHanSans-Normal',
  14. // Font maps
  15. fonts: [
  16. {
  17. // Font name
  18. fontName: 'SourceHanSans-Normal',
  19. // Font library url
  20. fontUrl: 'https://cdn.jsdelivr.net/npm/vxe-table-plugin-export-pdf/fonts/source-han-sans-normal.js'
  21. }
  22. ]
  23. })
  24. // 以上配置完毕之后 在具体的组件业务中 就可以使用导出pdf功能
  25. // 导出功能如下
  26. this.$refs.tableRef.exportData({
  27. filename: 'Order details',
  28. sheetName: 'Order details ( X02514645652 )',
  29. type: 'pdf'
  30. })

与此同时,你可以导出 xlsx格式的。

具体不再细说。请参考官方文档:vxe-table v4 集成第三方

至此,导出部分也讲完了。

但是,导出功能最后交给后台,毕竟这前端不擅长干这事。

结束了。

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索