优化篇--vxe-table 大数据表格替代方案

news2024/12/26 11:37:26

解决数据量过大及内容复杂时造成的Table渲染滚动的卡顿问题
vxe-table官方文档

在这里插入图片描述

npm install xe-utils vxe-table@legacy

vex-table.vue

<template>
  <div class="page">
    <vxe-grid
      class="mytable"
      ref="xGrid2"
      v-bind="gridOptions2"
      :loading="loading"
      :checkbox-config="{
        checkField: 'checked',
        labelField: '',
        highlight: true,
        checkRowKeys: checkRowKeys,
        showHeader: true,
      }"
      @current-change="currentChangeEvent"
      @checkbox-change="selectChangeEvent"
      @checkbox-all="selectChangeEvent"
    >
      <template #rowInfoSlot="{ row }">
        {{ row }}
      </template>
    </vxe-grid>
  </div>
</template>
<script>
import Sortable from "sortablejs";
import VXETable from "vxe-table";

const columns = [
  {
    field: "",
    type: "checkbox",
    fixed: "left",
    width: 50,
  },
  {
    title: "商品",
    field: "taoBabyInfo",
    slots: { default: "rowInfoSlot" },
    // fixed: "left",
    align: "center",
    minWidth: 300,
  },
  {
    title: "日期",
    field: "statisDate",

    // fixed: "left",
    align: "center",
    width: 65,
  },
];

export default {
  props: {
    dataSource: {
      type: Array,
      default: function() {
        return [];
      },
    },
  },
  data() {
    return {
      $table: null, //table实例
      loading: false,
      checkRowKeys: [],
      gridOptions2: {
        border: true,
        stripe: true, //斑马纹
        // showFooter: true, //页脚
        class: "sortable-column",
        // resizable: true,
        showOverflow: true, //虚拟滚动
        keepSource: true,
        height: 750, //固定高度
        maxHeight: 750, //最大高度
        columnConfig: {
          useKey: true,
          // minWidth: 400, //最小高度
        },
        rowConfig: {
          isCurrent: true,
          isHover: true,
          height: 121, // 行高
          keyField: "babyId[0]",
        },
        scrollX: {
          enabled: false,
        },

        scrollY: {
          gt: 100,
          mode: "default", //滚动模式,鼠标滚轮触发,用于左右固定列的复杂表格,更加流畅
          oSize: 5,
          // scrollToTopOnChange: true,
        },
        // footerMethod: this.footerMethod,
        // checkboxConfig: { checkField: "checked", labelField: "name" },
        toolbarConfig: {
          // custom: true,//列筛选
          tableToolbar: true,
          // zoom: true, //全屏
        },
        // mouseConfig: { selected: true },
        columns,
      },
    };
  },
  created() {
    this.columnDrop2();
  },
  mounted() {
    this.$table = this.$refs.xGrid2;
  },
  beforeDestroy() {
    if (this.sortable2) {
      this.sortable2.destroy();
    }
  },
  methods: {
    currentChangeEvent({ row }) {
      //   console.log("行选中事件", row);
      this.$emit("rowClicked", row.babyId[0]);
    },
    selectChangeEvent({ $table }) {
      const records = $table.getCheckboxRecords();
      console.info(`勾选${records.length}个树形节点`, records);
      this.checkRowKeys = records;
      this.$emit("selectChange", records);
    },

    columnDrop2() {
      this.$nextTick(() => {
        const $table = this.$refs.xGrid2;
        this.sortable2 = Sortable.create(
          $table.$el.querySelector(
            ".body--wrapper>.vxe-table--header .vxe-header--row"
          ),
          {
            handle: ".vxe-header--column",
            onEnd: ({ item, newIndex, oldIndex }) => {
              const { fullColumn, tableColumn } = $table.getTableColumn();
              const targetThElem = item;
              const wrapperElem = targetThElem.parentNode;
              const newColumn = fullColumn[newIndex];
              if (newColumn.fixed) {
                const oldThElem = wrapperElem.children[oldIndex];
                // 错误的移动
                if (newIndex > oldIndex) {
                  wrapperElem.insertBefore(targetThElem, oldThElem);
                } else {
                  wrapperElem.insertBefore(
                    targetThElem,
                    oldThElem ? oldThElem.nextElementSibling : oldThElem
                  );
                }
                VXETable.modal.message({
                  content: "固定列不允许拖动,即将还原操作!",
                  status: "error",
                });
                return;
              }
              // 获取列索引 columnIndex > fullColumn
              const oldColumnIndex = $table.getColumnIndex(
                tableColumn[oldIndex]
              );
              const newColumnIndex = $table.getColumnIndex(
                tableColumn[newIndex]
              );
              // 移动到目标列
              const currRow = fullColumn.splice(oldColumnIndex, 1)[0];
              fullColumn.splice(newColumnIndex, 0, currRow);
              $table.loadColumn(fullColumn);
            },
          }
        );
      });
    },
  },
};
</script>
<style scoped lang="less">
.page {
  /*滚动条整体部分*/
  .mytable ::-webkit-scrollbar {
    background-color: #f00;
    width: 15px;
    height: 15px;
  }
  /*滚动条的轨道*/
  .mytable ::-webkit-scrollbar-track {
    background-color: #ffffff;
  }
  /*滚动条里面的小方块,能向上向下移动*/
  .mytable ::-webkit-scrollbar-thumb {
    background-color: #bfbfbf;
    // border-radius: 5px;
    border: 1px solid #f1f1f1;
    box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
    bottom: 0;
  }
  .mytable ::-webkit-scrollbar-thumb:hover {
    background-color: #a8a8a8;
  }
  .mytable ::-webkit-scrollbar-thumb:active {
    background-color: #787878;
  }
  /*边角,即两个滚动条的交汇处*/
  .mytable ::-webkit-scrollbar-corner {
    background-color: #ffffff;
  }

  .sortable-column .vxe-header--row .vxe-header--column.sortable-ghost,
  .sortable-column .vxe-header--row .vxe-header--column.sortable-chosen {
    background-color: #dfecfb;
  }
  .sortable-column .vxe-header--row .vxe-header--column.col--fixed {
    cursor: no-drop;
  }

  ::v-deep .vxe-table--render-default .vxe-cell {
    padding: 0;
    font-size: 12px;
  }

  ::v-deep .vxe-body--column {
    vertical-align: top;
  }
  ::v-deep .vxe-header--column:not(.col--ellipsis) {
    padding: 5px 0;
  }
  ::v-deep .vxe-header--row th:nth-child(1),
  ::v-deep .vxe-body--row td:nth-child(1) {
    font-size: 13px;
    text-align: center;
    display: flex;
    justify-content: center;

    & .vxe-checkbox--icon {
      background-color: #fff;
    }
  }
  ::v-deep .vxe-header--row th:nth-child(n + 1):nth-child(-n + 3),
  ::v-deep .vxe-body--row td:nth-child(n + 1):nth-child(-n + 3) {
    background-color: #fff9ce;
    text-align: center;
  }

  ::v-deep .vxe-header--row th:nth-child(n + 4):nth-child(-n + 13) {
    color: #ffc480;
  }

  ::v-deep .vxe-body--column.col--ellipsis:not(.col--actived) > .vxe-cell {
    overflow: inherit;
  }
  ::v-deep .vxe-table--body-wrapper {
    min-height: 155px;
  }
}
</style>

index.vue


<template>
  <VxeTable
    ref="vxeTableRef"
    @rowClicked="rowClicked"
    @selectChange="rowSelected"
  />
</template>

<script>
import VxeTable from "./components/vxe-table/index.vue";
import { reportExcelPageList } from "@/services/user";
export default {
  components: { VxeTable },
  methods: {
    rowClicked(row) {
      console.log("🚀row", row);
    },
    rowSelected(row) {
      console.log("🚀row", row);
    },
    async apiGetList(flag = true) {
      const _vxeTableRef = this.$refs.vxeTableRef;
      _vxeTableRef.loading = true;
      await reportExcelPageList(this.query)
        .then((e) => {
          const { code, data, total } = e.data;
          if (code === 0) {
            let dataSource = [];
            dataSource = this.restructure(data || []);
            this.total = total;
            // console.log("🚀🚀", dataSource);
            //1.虚拟滚动渲染异步加载

            _vxeTableRef.$table.reloadData(dataSource).then(() => {
              if (flag) {
                // 1.1  滚动到顶部
                _vxeTableRef.$table.scrollTo(0, 0);
              }
            });
            _vxeTableRef.loading = false;
          }
        })
        .finally(() => {
          _vxeTableRef.loading = false;
        });
    },
  },
};
</script>

<style lang="less" scoped>
@import "index.less";
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/727220.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

langchain系列1- langchain-ChatGLM

源码阅读 1 服务启动 (demo.queue(concurrency_count3).launch(server_name0.0.0.0,server_port7860,show_apiFalse,shareFalse,inbrowserFalse))这部分代码使用了 Gradio 库提供的两个函数&#xff1a;queue 和 launch。 在这里&#xff0c;demo 是一个 Interface 类的实例…

win go vscode安装配置-智能提示

win go vscode安装配置-智能提示 0.前提 go1.17.1之后不允许go get安装库 vscode是免费的go开发工具&#xff0c;想要代码智能提示 go推荐go mod和go install&#xff0c;不推荐GOPATH了 1.安装步骤 [1] vscode安装-百度一堆 [2] go安装-从官网 https://go.dev/dl/ 下载win 6…

SpringBoot——在开发阶段对表现层进行测试

在开发阶段对表现层进行测试 之前在做测试的时候&#xff0c;我们对Dao层做了测试&#xff0c;对Service层做了测试&#xff0c;但是在测试表现层的时候&#xff0c;我们并不是在测试类中启动的Web端口&#xff0c;还是直接启动了引导类&#xff0c;并在浏览器中打开本地网址或…

优思学院|带你轻松驾驭六西格玛:解答大家的五大疑问

在业务改进和质量管理领域&#xff0c;六西格玛被公认为一种卓越的方法和工具&#xff0c;可以帮助企业实现接近完美的质量水平。无论是制造业、医疗保健、金融还是服务行业&#xff0c;六西格玛都被广泛采用&#xff0c;并取得了令人瞩目的成果。它不仅可以降低缺陷和错误&…

【IoT物联网】IoT小程序在展示中央空调采集数据和实时运行状态上的应用

利用前端语言实现跨平台应用开发似乎是大势所趋&#xff0c;跨平台并不是一个新的概念&#xff0c;“一次编译、到处运行”是老牌服务端跨平台语言Java的一个基本特性。随着时代的发展&#xff0c;无论是后端开发语言还是前端开发语言&#xff0c;一切都在朝着减少工作量&#…

基于知识图谱的《红楼梦》人物关系可视化及问答系统(含码源):命名实体识别、关系识别、LTP简单教学

基于知识图谱的《红楼梦》人物关系可视化及问答系统&#xff08;含码源&#xff09;&#xff1a;命名实体识别、关系识别、LTP简单教学 文件树: app.py是整个系统的主入口templates文件夹是HTML的页面 |-index.html 欢迎界面 |-search.html 搜索人物关系页面 |-all_relation.…

JMeter参数化(6)

JMeter参数化 一、JMeter用户参数1、作用2、案例1&#xff1a;百度搜索接口&#xff1a;使用用户参数模拟不同线程操作时&#xff0c;搜索不同的数据 二、用户自定义变量案例1&#xff1a;演示用户定义的变量具有全局性案例2&#xff1a;使用用户定义的变量&#xff0c;分组管理…

基于Java的电影购票系统的设计与实现(源码+文档+数据库)

本系统是一个网上电影售票系统&#xff0c;可以为用户提供方便的在线订票环境。主要实现了用户注册、登录、查询、订购电影票、管理已订购电影票等功能。通过后台管理模块可以实现对用户、播放厅、电影、影片安排、电影票等的管理等功能。本系统以IntelliJ IDEA 作为开发环境&a…

2.3 Web应用 -- 2. HTTP 连接

2.3 Web应用 -- 2. HTTP 连接 HTTP连接的两种类型非持久性连接响应时间分析与建模持久性HTTP HTTP连接的两种类型 非持久性连接(Nonpersistent HTTP) 每个TCP连接最多允许传输一个对象HTTP 1.0版本使用非持久性连接 持久性连接(Persistent HTTP) 每个TCP连接允许传输多个对象H…

vue3项目创建部署

别名联想路径提示&#xff1a; Element-plus默认的颜色是蓝色&#xff0c;以下修改成我们自己的主题色&#xff1a; css预处理语言 “scss是一种css预处理语言,是一个css的扩展,它在css语法的基础上,允许您使用变量,嵌套规则,混合,导入,继承等功能,使得css更加强大和优雅,而…

Jetson Orin Nano Developer Kit

Jetson Orin Nano Developer Kit包括Jetson Orin Nano 8GB模块&#xff0c;该模块具有NVIDIA安培GPU(具有1024个CUDA内核和32个第三代张量内核)和6核ARM CPU&#xff0c;能够运行多个并发AI应用程序管道并提供高推断性能。 开发套件载体板支持所有Jetson Orin Nano和Orin NX模块…

2023年如何通过8个步骤创建社交媒体内容策略

在创建成功的社交媒体内容策略时&#xff0c;感觉有无穷无尽的选项和平台可供选择。但不要因此而不知所措&#xff0c;因为只要稍作规划并发挥大量创造力&#xff0c;您就可以制定有助于提升品牌知名度、提高客户参与度和推动销售的战略。 目录 定义社交媒体内容配方的八个…

基于.Net Core实现的飞书所有文档一键导出服务(支持多系统)

feishu-doc-export 一个支持Windows、Mac、Linux系统的飞书文档一键导出服务&#xff0c;仅需一行命令即可将飞书知识库的全部文档同步到本地电脑。导出速度嘎嘎快&#xff0c;实测700多个文档导出只需25分钟&#xff0c;且程序是后台挂机运行&#xff0c;不影响正常工作。 动…

python爬虫爬取top250中排名、评分、导演等展示可视化界面

源代码4千字报告 需要源代码数据库可视化数据4千字报告加我qq

基于matlab评估单相机校准的准确性(附源码)

一、前言 相机校准是使用特殊校准模式的图像估计相机参数的过程。参数包括相机内在系数、失真系数和相机外在系数。校准相机后&#xff0c;有几种方法可以评估估计参数的准确性&#xff1a; 绘制相机的相对位置和校准模式 计算重投影误差 计算参数估计误差 二、校准相机 …

Spring Boot 数据访问框架介绍及使用

Spring Boot 数据访问框架介绍及使用 Spring Boot 是一个流行的 Java 应用程序框架&#xff0c;它提供了许多工具和库&#xff0c;帮助开发人员快速构建高效的应用程序。其中&#xff0c;Spring Boot 数据访问框架是其中一个重要的组件&#xff0c;它提供了许多不同的选项&…

短视频抖音多账号管理系统源码搭建开发(路径一)

一、开发环境 目录 一、开发环境 二、短视频账号矩阵系统源码功能构建模型 短视频抖音多账号管理系统源码搭建开发&#xff0c;视频抖音多账号管理系统源码的开发环境配置非常重要。 1、首先&#xff0c;确保您的计算机已经安装了适当的开发工具&#xff0c;如Java SDK、An…

(css)文字与底部对齐

(css)文字与底部对齐 修改前&#xff1a; 修改后&#xff1a; 代码&#xff1a; .AITip {height: 11%;color: #01ffff;font-size: 24px;//主要属性display: flex;justify-content: center;align-items: flex-end;line-height: 1; }解决参考&#xff1a;https://blog.csdn.n…

多家快递如何跟踪物流信息,并快速掌握了每条物流信息时间差呢

对于很电商商家朋友们他平时一般都是发多家快递&#xff0c;多家快递公司的物流信息处理和管理是一个挑战。很多公司在处理这些信息时需要耗费大量人力和时间&#xff0c;为了提高工作效率和降低成本&#xff0c;需要采用一些高效的管理和利用方法。例如使用第三方的工具来&…

路由的介绍

目录 路由器的转发原理&#xff1a;路由表 路由——指示路由器去往未知网段的方法 路由器的转发原理&#xff1a;路由表 当一个数据包来到路由器&#xff0c;路由器将基于数据包中的目标IP地址查询自身的路由表&#xff0c;如果路由表中有相应的记录&#xff0c;则无条件根据…