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

Vue2 ant-design table由于表格渲染太多数据导致渲染慢问题

在这里插入图片描述
由于表格渲染数据太多,导致渲染慢,所以初始展示一些数据,滚动再加载剩余数据,加快首次渲染页面速度
废话不多说,直接上代码:

<template>
  <div class="page-main">
 	<a-table
       ref="tableRef"
       :bordered="true"
       :columns="tableColumnList"
       :data-source="tableCopyData"
       :loading="tableLoading"
       :pagination="false"
       :scroll="scrollNum"
       :rowKey="(record, index) => index"
     >
       <a slot="action" slot-scope="text">action</a>
     </a-table>
  </div>
</template>
<script>
export default {
  name: 'tableScroll',
  data() {
    return {
      scrollNum: { x: 2600, y: 'calc(100vh - 560px)' },
      tableLoading: false,
      hasMore: false,
      tableData: [], // 展示表格数据
      tableCopyData: [], // 全部表格数据
      tableColumnList: [
		  { title: 'Full Name', width: 100, dataIndex: 'name', key:'name', fixed: 'left' },
		  { title: 'Age', width: 100, dataIndex: 'age', key: 'age', fixed: 'left' },
		  { title: 'Column 1', dataIndex: 'address', key: '1', width: 150 },
		  { title: 'Column 2', dataIndex: 'address', key: '2', width: 150 },
		  { title: 'Column 3', dataIndex: 'address', key: '3', width: 150 },
		  { title: 'Column 4', dataIndex: 'address', key: '4', width: 150 },
		  { title: 'Column 5', dataIndex: 'address', key: '5', width: 150 },
		  { title: 'Column 6', dataIndex: 'address', key: '6', width: 150 },
		  { title: 'Column 7', dataIndex: 'address', key: '7', width: 150 },
		  { title: 'Column 8', dataIndex: 'address', key: '8' },
		  {
		    title: 'Action',
		    key: 'operation',
		    fixed: 'right',
		    width: 100,
		    scopedSlots: { customRender: 'action' },
		  },
      ],
    }
  },
  created() {
    this.billMonth = [moment().subtract(1, 'months').format('YYYY-MM'), moment().subtract(1, 'months').format('YYYY-MM')]
    this.prodIncomeCostQueryItem()
    this.fetchTable()
  },
  mounted() {
    this.handleScrollTable()
  },
  destroyed() {
    // 组件销毁前移除事件监听器
    const table = this.$refs.tableRef
    if (table) {
      const scrollContainer = table.$el.getElementsByClassName('ant-table-body')[0]
      if (scrollContainer) {
        scrollContainer.removeEventListener('scroll', this.handleScroll)
      }
    }
  },
  methods: {
    handleScrollTable() {
      // 确保表格已挂载
      this.$nextTick(() => {
      	// 通过设置ref 属性,获取表格dom 元素
        const table = this.$refs.tableRef
        if (table) {
          // 获取表格的滚动容器并添加滚动事件监听器
          const scrollContainer = table.$el.getElementsByClassName('ant-table-body')[0]
          if (scrollContainer) {
            const throttledHandleScroll = _.throttle(this.handleScroll, 200)
            scrollContainer.addEventListener('scroll', throttledHandleScroll)
          }
        }
      });
    },
    handleScroll(event) {
      const target = event.target;
      const { scrollHeight, scrollTop, clientHeight } = target;
      this.hasMore = this.tableCopyData.length === this.tableData.length ? true : false
      // 距离表格内容底部距离 小于 '30' 时 渲染剩余数据
      if(scrollHeight - (scrollTop + clientHeight) < 30 && !this.hasMore) {
        this.tableCopyData = lodash.slice(this.tableData, 0, this.tableCopyData.length+2)
      }
    },
  }
}
</script>

旨在分享~~~~~~~~~~~~~~~~~~~~~~~


http://www.kler.cn/news/340031.html

相关文章:

  • AI开发者工具的双子星:Cursor与ChatGPT Canvas的区别
  • 三步轻松打造专业的可视化看板,提升工作效率全靠这个工具!
  • C语言复习题
  • Unity中实现预制体自动巡逻与攻击敌人的完整实现指南
  • 基于贝叶斯决策的 CAD 程序设计方案
  • [ComfyUI]超级简单的 Flux 扩图方案,简单但好用!
  • nginx做负载均衡的策略有哪些和模块
  • 新一轮 Web3 游戏季,Final Glory成捕获全新市场红利的入口
  • 基于卷积神经网络的书法字体识别系统,resnet50,mobilenet模型【pytorch框架+python】
  • 第 21 章 一条记录的多幅面孔——事务的隔离级别与 MVCC
  • C++ static静态
  • 怎么避免在pod产生-派生炸弹(Fork Bomb)? k8s(kubernetes)
  • 使用java操作浏览器的工具selenium-java和webdriver下载地址
  • CMake 教程跟做与翻译 2
  • Sealos Devbox 发布,珍爱生命,远离 CI/CD
  • React生命周期以及Hook
  • 修改Docker的默认存储路径
  • 01_23 种设计模式之《简单工厂模式》
  • (实习日报)广告技术平台实习工作日报 9月29号-10月7号(国庆快乐)
  • vue3+vant4+微信公众号实现图片上传和扫一扫功能