jQuery EasyUI 数据网格 – 使用虚拟滚动视图显示海量数据(长文讲解)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

在现代 Web 应用开发中,数据展示是一个核心场景。当需要处理海量数据时,传统的数据表格加载方式往往会导致页面性能下降,甚至崩溃。jQuery EasyUI 的数据网格(DataGrid)组件,结合虚拟滚动视图技术,为开发者提供了一种高效、流畅的解决方案。本文将从基础概念到实战案例,逐步解析如何通过虚拟滚动视图技术,在保证用户体验的同时,实现海量数据的高效渲染。


一、数据网格与海量数据的挑战

1.1 数据网格的核心功能

数据网格(DataGrid)是 jQuery EasyUI 提供的可视化组件,主要用于展示结构化数据。它支持分页、排序、过滤、单元格编辑等基础功能,但当数据量达到万级甚至百万级时,传统分页方式会面临以下挑战:

  • 内存占用过高:一次性加载大量数据会导致浏览器内存溢出。
  • 渲染性能低下:DOM 元素过多会显著降低页面响应速度。
  • 用户体验差:用户需频繁切换页面,操作流程不连贯。

1.2 虚拟滚动视图的解决方案

虚拟滚动视图(Virtual Scrolling)通过动态加载和复用可视区域内的元素,解决了上述问题。其核心思想是:仅渲染用户当前可见的少量行,其余数据通过滚动事件动态加载

  • 类比解释:想象一个无限长的书架,用户只能看到眼前的几本书,而书架的两端始终处于“虚拟”状态,节省了存储和渲染成本。

二、jQuery EasyUI 数据网格的虚拟滚动实现

2.1 基础配置与核心概念

2.1.1 数据网格的基本结构

在 HTML 中,数据网格通过一个 <table> 标签定义,并通过 idclass 属性关联 EasyUI 的数据网格功能。例如:

<table id="dataGrid" class="easyui-datagrid"  
       style="width:100%;height:auto"></table>

2.1.2 关键配置项

虚拟滚动的核心配置项包括:
| 参数名 | 作用描述 |
|---------------------|-----------------------------------|
| loadFilter | 自定义数据加载过滤函数 |
| scrollbarSize | 滚动条宽度(单位:像素) |
| rowHeight | 每行高度(单位:像素) |
| virtualScroll | 启用虚拟滚动(布尔值) |

2.2 虚拟滚动的核心代码实现

2.2.1 启用虚拟滚动配置

在 JavaScript 中初始化数据网格时,需设置 virtualScroll: true 并定义 rowHeight

$("#dataGrid").datagrid({  
    url: '/api/data', // 数据接口路径  
    columns: [[  
        {field: 'id', title: 'ID', width: 80},  
        {field: 'name', title: '名称', width: 150}  
    ]],  
    virtualScroll: true,  
    rowHeight: 30, // 每行高度  
    scrollbarSize: 10 // 滚动条宽度  
});  

2.2.2 动态加载数据

虚拟滚动通过 loadFilter 函数拦截原始数据,并返回可视区域的数据片段。例如:

loadFilter: function(data) {  
    var rows = data.rows;  
    var start = $(this).datagrid('getScrollTop') / this.rowHeight;  
    var end = start + $(this).height() / this.rowHeight + 10; // 预加载部分数据  
    return {  
        total: data.total,  
        rows: rows.slice(start, end)  
    };  
}  

代码解析

  • getScrollTop() 获取当前滚动条位置,计算可见区域的起始行。
  • slice 方法截取当前可见的数据片段,避免一次性加载全部数据。

三、性能优化与常见问题

3.1 数据分页与懒加载

虚拟滚动虽然解决了渲染问题,但后端仍需提供分页接口。可通过 pageNumberpageSize 参数控制接口返回的数据范围,例如:

queryParams: {  
    pageSize: 500, // 每次加载500行  
    pageNumber: 1  
},  
onBeforeLoad: function(params) {  
    params.start = params.pageNumber * params.pageSize;  
}  

3.2 滚动事件与数据同步

滚动时需实时更新数据范围,可通过 onScroll 事件触发数据加载:

onScroll: function() {  
    var dg = $(this);  
    var scrollTop = dg.datagrid('getScrollTop');  
    var offset = scrollTop / this.rowHeight;  
    // 根据offset重新计算数据范围并更新  
}  

3.3 常见问题与解决方案

  • 滚动卡顿:检查 rowHeight 是否与实际行高一致,或减少 DOM 元素复杂度。
  • 数据错位:确保数据接口返回的顺序与前端逻辑一致,避免动态排序导致的偏移。
  • 内存泄漏:避免在 loadFilter 中创建大量临时变量,使用闭包或对象池技术复用资源。

四、完整案例与代码演示

4.1 HTML 结构

<div style="width:800px;margin:20px auto;">  
    <table id="dataGrid" class="easyui-datagrid"  
           data-options="  
               url: '/api/large-data',  
               method: 'get',  
               fitColumns: true,  
               rownumbers: true,  
               virtualScroll: true,  
               rowHeight: 40,  
               scrollbarSize: 12  
           ">  
        <thead>  
            <tr>  
                <th data-options="field:'id', width:80">ID</th>  
                <th data-options="field:'name', width:150">名称</th>  
                <th data-options="field:'value', width:150">数值</th>  
            </tr>  
        </thead>  
    </table>  
</div>  

4.2 JavaScript 扩展配置

$(function() {  
    $("#dataGrid").datagrid({  
        loadFilter: function(data) {  
            var start = Math.floor(this.scrollTop / this.rowHeight);  
            var end = start + Math.ceil(this.height / this.rowHeight) + 50;  
            return {  
                total: data.total,  
                rows: data.rows.slice(start, end)  
            };  
        },  
        onBeforeLoad: function(params) {  
            params.startIndex = params.pageNumber * params.pageSize;  
        }  
    });  
});  

结论

通过虚拟滚动技术,jQuery EasyUI 数据网格能够高效展示海量数据,同时保持流畅的用户体验。本文从基础配置到性能优化,结合代码示例,展示了如何通过动态加载和资源复用实现这一目标。开发者需注意滚动事件与数据同步的逻辑,并根据实际场景调整分页策略,以达到最佳性能。未来,随着前端技术的发展,虚拟滚动将与其他优化手段(如 Web Worker、懒加载图片)结合,进一步提升复杂数据场景的处理能力。


(全文约 1600 字)

最新发布