优化vxe-table下,超大数据下el-popover性能问题

问题场景

  1. 项目有一个页面基于vxe-table做数据展示,大概会有表格规模默认是50(列) × 20 (行)
  2. 有其中7列数据可以悬浮展示与该字段相关的更详细的数据表格,基于 el-popover 和自己写的一个简易表格

伪代码大致如下

html 复制代码
<vxe-table>
    <vxe-column field="test" title="test" width="120">
    	<template #default="{ row }">
            <el-popover>
                <my-table></my-table>
            </el-popover>
        </template>
    </vxe-column>
</vxe-table>

问题分析

尝试跑lighthouse去找优化方向,没想到lighthouse直接崩了。所以只能通过经验,判断是尽管有vxe-table做了虚拟滚动,但是因为el-popover的存在,在首屏加载以及滚动滚动条的情况下,依然加载了大量DOM,导致浏览器解析执行JS的时间非常的长,加载完成后由于DOM数量极其巨大,所以依然造成卡顿,影响使用。最后通过控制台性能页和打印分析,验证确实加载了巨量的DOM节点。

解决思路

原因分析出来之后,解决方案就比较清晰了,减少首屏的DOM数量即可。因为 el-popover 是悬浮触发的,并不需要首屏加载的时候把DOM节点解析出来,所以就使用懒加载的思路去解决这个问题。el-popover提供了气泡框展示的回调方法,我们监听这个方法再去动态加载组件即可。

代码大致如下

html 复制代码
<vxe-table>
    <vxe-column field="test" title="test" width="120">
        <template #default="{ row }">
            <el-popover @show="showContent">
                <component :is="myTable" v-bind="$attrs" />
            </el-popover>
        </template>
    </vxe-column>
</vxe-table>

<script>
import MyTable from './MyTable'
export default {
    components: {MyTable},
    data () {
        return {
            myTable: null
        }
    },
    methods: {
        showContent () {
            this.myTable = MyTable
        }
    }
}
</script>

总结

这个解决思路可以用于其他类似的场景大数据量场景,也就是首屏在满足需求的前提下,应该尽可能少的加载DOM元素或者其他长任务,提前做好预警准备,避免上线后影响用户体验。

相关推荐
码界领航1 分钟前
【2025最新版】Chrome谷歌浏览器如何能恢复到之前的旧版本
前端·chrome
customer0830 分钟前
【开源免费】基于SpringBoot+Vue.JS个人博客系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
乐多_L1 小时前
使用vue3框架vue-next-admin导出表格excel(带图片)
前端·javascript·vue.js
初尘屿风1 小时前
基于微信小程序的电影院订票选座系统的设计与实现,SSM+Vue+毕业论文+开题报告+任务书+指导搭建视频
vue.js·微信小程序·小程序
南望无一1 小时前
React Native 0.70.x如何从本地安卓源码(ReactAndroid)构建
前端·react native
Mike_188702783511 小时前
1688代采下单API接口使用指南:实现商品采集与自动化下单
前端·python·自动化
customer081 小时前
【开源免费】基于SpringBoot+Vue.JS打卡健康评测系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
鲨鱼辣椒️面1 小时前
HTML视口动画
前端·html
一小路一1 小时前
Go Web 开发基础:从入门到实战
服务器·前端·后端·面试·golang
堇舟1 小时前
HTML第一节
前端·html