当前位置: 首页 > article >正文

干货|antd组件库Table组件开启虚拟列表的影响

注:虚拟滚动或分页加载可能导致部分数据未被渲染在 DOM 中,导致复制操作只选中页面上已渲染的数据。

导致问题:在开启虚拟列表时,复制表格内容到excel表时表头能正常显示,但所有数据都整齐排列在第一列的情况

原因分析

  1. 虚拟列表的渲染机制:虚拟列表只会渲染部分 DOM 元素(即当前可视区域的数据),当你复制时,浏览器可能认为整个表格内容都在第一列中,因为 DOM 中并没有完整渲染每一列的数据,导致数据在复制时被错误地认为是一列。

  2. 浏览器复制机制:浏览器复制操作依赖于 DOM 结构。如果数据列在虚拟列表中未被渲染到 DOM 中,浏览器在处理复制操作时会错位解析,将所有的未渲染数据都视为属于第一列。

  3. 列内容渲染方式:虚拟表格可能在列的 render 函数中对内容进行了延迟渲染或部分优化。由于这些列的内容未被完全渲染,浏览器可能只捕获到了 render 的部分结果,而这些结果被视为属于同一列。

解决方案

如果你要在启用虚拟列表的同时保持复制功能的正常工作,可以尝试以下方法:

  1. 自定义复制功能:实现一个自定义的复制功能,手动从 dataSource 中提取表格数据,并将这些数据格式化为适合 Excel 的形式。这种方式不会依赖 DOM 中的实际内容,而是直接从表格的数据源获取数据。

  2. 在复制前暂时关闭虚拟化:在用户执行复制操作时,可以监听 onCopy 事件并暂时关闭虚拟列表的功能,确保所有数据都完整渲染到 DOM 中,复制完成后再重新启用虚拟化。

  3. 使用 copy-to-clipboard 库:使用 copy-to-clipboard 等库自定义复制行为,从表格数据源中获取所选内容,并以合适的格式进行复制,而不是依赖浏览器的默认复制行为。

1:自定义复制功能

       可以在表格的顶部加一个按钮,允许用户点击后将表格内容复制到剪贴板。

import copy from 'copy-to-clipboard';

const handleCopy = () => {
  const dataToCopy = historyData.map(row => 
    columns.map(col => row[col.dataIndex]).join('\t')
  ).join('\n');
  
  copy(dataToCopy);
  message.success('表格数据已复制到剪贴板');
};

// 在表格上方添加按钮
<Button onClick={handleCopy}>复制表格数据</Button>

注:但是这种方式需要一个按钮


推荐结合后端实现滚动底部动态加载数据 :

1、滚动加载函数:

// 监听滚动事件,当用户滚动到表格底部时加载更多数据
  const handleScroll = (e) => {
    const { scrollTop, scrollHeight, clientHeight } = e.target;

    if (scrollTop + clientHeight >= scrollHeight - 50 && hasMore) {
      setPageNum((prevPage) => prevPage + 1);
      // console.log('底部xxxx=>>', scrollTop);
      // console.log('target=>>', e.target);
    }
  };

2、Table组件

<Table
        size='middle'
        bordered
        columns={columns}
        dataSource={historyData}
        rowKey='index'
        pagination={false}
        scroll={{ y: 300 }}
        loading={loading}
        // TODO:逻辑滚动时加载数据
        onScroll={handleScroll}
        // virtual   //关闭虚拟列表
      />

        设置了滚动到底部加载数据的机制,虚拟列表的作用就相对减弱了。虚拟列表主要是为了在数据量特别大的情况下优化渲染性能,但既然通过滚动加载数据来控制数据量,虚拟列表不再必要。可以考虑去掉虚拟列表,尤其是在复制功能上,如果去掉后问题解决了,那就说明虚拟列表确实是导致问题的原因。
 


http://www.kler.cn/a/354753.html

相关文章:

  • 微信小程序Uniapp
  • 我的创作纪念日——《惊变128天》
  • 【shell编程】报错信息:Non-zero Exit Status(包含7种解决方法)
  • 云打印之菜鸟打印组件交互协议
  • 五类推理(逻辑推理、概率推理、图推理、基于深度学习的推理)的开源库 (一)
  • 数据分析-Excel
  • 深度解析RLS(Recursive Least Squares)算法
  • 【Spring篇】初识之Spring的入门程序及控制反转与依赖注入
  • 如何利用被动DNS(Passive DNS)加强网络安全
  • STM32学习笔记---RTC
  • 中级注册安全工程师《安全生产法律法规》真题及详解
  • 48 | 代理模式:代理在RPC、缓存、监控等场景中的应用
  • 分布式管理工具分析:Java、Go 和 Python
  • 【vue】keep-alive动态组件的基础用法
  • 【text2sql】基于上下文文学习的MCS-SQL框架在Spider和BIRD取得了新SOTA
  • 线性可分支持向量机的原理推导
  • Android Jetpack组件库中的LiveData和ViewModel的作用。
  • 探索OpenCV的人脸检测:用Haar特征分类器识别图片中的人脸
  • [含文档+PPT+源码等]精品基于springboot实现的原生微信小程序汽车保养服务
  • 绿幕虚拟直播五大“硬件环境”
  • D2000国产化加固笔记本电脑:筑牢信息安全防线
  • Java学习-JUC
  • Java封装,继承,多态
  • Vue 上传图片前 裁剪图片
  • 请问医药销售智能仓系统包含哪些功能流程?
  • shell将数据导出为csv