element table 数据量大页面卡顿的解决

 更新时间:2022年01月24日 10:07:37   作者:狗狗狗狗亮  
这篇文章主要介绍了element table 数据量大页面卡顿的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

element table数据量大页面卡顿

table显示医院列表,这里后台未做分页,总共数据大约8000条。

一次性全部赋值给table整个页面都会卡顿好几秒。

查看了请求接口到数据返回的时间为192ms,可以接受。

在这里插入图片描述

应该是页面渲染的问题。

这边就在前端做了分页处理。

调用接口

 // 获取医院列表
    getHospitalList() {
      this.$api.Hospital.GetHospitalList().then(res => {
        if (res.status == 200) {
          this.tableData = res.data.response;
          this.total = res.data.response.length;
        }
      });
    },
  // 分页
  handleCurrentChange(currentPage) {
    this.currentPage = currentPage;
  },
  // 搜索
 searchList() {
   let params = "";
   switch (this.select) {
     case "1":
       if (this.input3) {
         params = this.input3;
         this.$api.Hospital.QueryHospitalsByName(params).then(res => {
           if (res.data.length > 0) {
             this.tableData = res.data;
             this.currentPage = 1;
             this.total = res.data.length;
           } else {
             this.$message({
               message: "未查询到医院信息",
               type: "info"
             });
           }
           console.log(res);
         });
       }
       break;
     case "2":
       if (this.input3) {
         params = this.input3;
         this.$api.Hospital.QueryHospitalsByCode(params).then(res => {
           if (res.data.length > 0) {
             this.tableData = res.data;
             this.currentPage = 1;
             this.total = res.data.length;
           } else {
             this.$message({
               message: "未查询到医院信息",
               type: "info"
             });
           }
           console.log(res);
         });
       }
       break;
     default:
       console.log(111);
   }
 },

table组件

<el-table
    :data=" tableData.slice((currentPage - 1) * pageSize, currentPage * pageSize )  "
    border
    style="width: 100%"
    height="400"
    size="mini"
    highlight-current-row
  >
   ……
  </el-table>
  <el-pagination
    layout="prev, pager, next"
    background
    :page-size="pageSize"
    :total="total"
    @current-change="handleCurrentChange"
  >
  </el-pagination>

data里使用到的数据

data(){
	return {
		total: 0,
		currentPage: 1,
        pageSize: 50,
	}
}
		

在这里插入图片描述

el-table大数据量渲染卡顿的一种思路

现需要呈现一个表格,有近500行,30多列,使用vue+elementUI呈现。

这个数据量不算大,但可能列数比较多,渲染时速度很慢,滚动会有卡顿,使用体验不佳。

但并不想做分页处理,想要尽可能接近excel的呈现。

思路

假设全部数据为allData(数组),现在使用一个displayData(数组),displayData = allData.slice(scorll, scorll+ displayCount),scroll表示当前滚动到的index, displayCount表示要展示的行数。把displayData设为el-table的数据源,只渲染该部分数据。通过对表格添加滚动事件监听,来动态更新scroll,并且对scroll添加watch,当scroll发生变化,就自动更新displayData。

滚动监听

监听滚动需要考虑到兼容性,火狐是DOMMouseScroll,其他的是mousewheel。

            /*指定table的ref*/
            this.table = this.$refs.mytable.bodyWrapper;
            
            /*浏览器兼容*/
            let userAgent = navigator.userAgent; //取得浏览器的userAgent字符串
            let ff = userAgent.indexOf("Firefox") > -1; //判断是否Firefox浏览器          
            if (ff) {
             this.table.addEventListener('DOMMouseScroll', (event) => {
                    let detail = event.detail;
                    //滚动方向
                    let down = detail > 0;
                    /**
                    根据滚动方向和距离修改scroll的值,需要注意scroll的范围不能越界。
                    **/
                    });
            }else{
              this.table.addEventListener('mousewheel', (event) => {
                    let wheel = event.deltaY;
                    //滚动方向
                    let down = wheel > 0;
                    });
            }

slider

除了滚动表格,还需要一个模拟滚动条。这里选用slider控件,和scroll绑定。

发现elementUI的slider数值方向只能从下到上,且不能有太多的定制化。找到另外一个可深度定制化的vue slider控件:vue-slider-component。通过参数配置及css修改使其尽可能像滚动条。

在这里插入图片描述

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Vue3 composition API实现逻辑复用的方法

    Vue3 composition API实现逻辑复用的方法

    本文主要介绍了Vue3 composition API实现逻辑复用的方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Vite Vue3 EsLint Prettier配置步骤极简方法详解

    Vite Vue3 EsLint Prettier配置步骤极简方法详解

    这篇文章主要为大家介绍了Vite Vue3 EsLint Prettier配置步骤的极简方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Element-UI+Vue模式使用总结

    Element-UI+Vue模式使用总结

    这篇文章主要介绍了Element-UI+Vue模式使用总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • vue路由跳转传参数的方法

    vue路由跳转传参数的方法

    这篇文章主要介绍了vue路由跳转传参数的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • vue配置文件自动生成路由和菜单实例代码

    vue配置文件自动生成路由和菜单实例代码

    因为不同的用户有不同的权限,能访问的页面是不一样的,所以我们在写后台管理系统时就会遇过这样的需求:根据后台数据动态添加路由和菜单,这篇文章主要给大家介绍了关于vue配置文件自动生成路由和菜单的相关资料,需要的朋友可以参考下
    2021-08-08
  • 解决elementui导航折叠卡顿的问题

    解决elementui导航折叠卡顿的问题

    这篇文章主要介绍了解决elementui导航折叠卡顿的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Vue实现父子组件页面刷新的几种常用方法

    Vue实现父子组件页面刷新的几种常用方法

    很多时候我们在操作过页面时候,特别是增删改操作之后,数据会有所改变,本文主要介绍了Vue实现父子组件页面刷新的几种常用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • vue使用vuex实现首页导航切换不同路由的方法

    vue使用vuex实现首页导航切换不同路由的方法

    这篇文章主要介绍了vue使用vuex实现首页导航切换不同路由的方法 ,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • Vue中插槽slot的使用方法

    Vue中插槽slot的使用方法

    插槽就是子组件中的提供给父组件使用的一个占位符,用<slot></slot> 表示,父组件可以在这个占位符中填充任何模板代码,如 HTML、组件等,填充的内容会替换子组件的<slot></slot>标签,这篇文章主要介绍了Vue插槽的理解和使用,需要的朋友可以参考下
    2023-03-03
  • JavaScript实现简单的图片切换功能(实例代码)

    JavaScript实现简单的图片切换功能(实例代码)

    这篇文章主要介绍了JavaScript实现简单的图片切换功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-04-04

最新评论