jQuery EasyUI 数据网格 – 合并单元格(千字长文)

更新时间:

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

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

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

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

前言

在 Web 开发中,数据展示是核心功能之一。而 jQuery EasyUI 数据网格作为一款功能强大的前端表格组件,因其高度可定制性和丰富的插件生态,成为许多开发者构建数据展示界面的首选工具。然而,当数据中存在大量重复信息时,如何通过合并单元格来提升表格的可读性和美观度,便成为了一个关键问题。本文将深入探讨 jQuery EasyUI 数据网格 – 合并单元格 的实现方法,通过案例演示与代码解析,帮助读者掌握这一实用技巧。


一、理解数据网格与合并单元格的意义

1.1 数据网格的核心功能

jQuery EasyUI 的数据网格(DataGrid)是一个基于 HTML 表格的增强组件,能够动态加载数据、分页、排序、过滤,并支持复杂的交互操作。它的核心作用是将大量结构化数据以直观的方式呈现给用户。

1.2 合并单元格的必要性

在实际应用中,表格中的某些列(如“班级”“部门”或“课程”)可能会出现连续重复的值。例如:
| 班级 | 学生姓名 | 成绩 |
|------|----------|------|
| 三班 | 张三 | 90 |
| 三班 | 李四 | 85 |
| 三班 | 王五 | 92 |

此时,重复显示“三班”不仅浪费空间,还会降低用户体验。通过合并单元格(如将“三班”合并为一个大单元格),可以显著提升表格的整洁度和信息传达效率。


二、合并单元格的核心原理

2.1 表格单元格的“桥梁”隐喻

合并单元格的本质是将相邻的多个单元格(行或列)合并为一个“更大的单元格”。这类似于用木板将多个独立的小抽屉合并为一个大空间,使信息呈现更紧凑。

在 HTML 中,合并单元格通过 rowspan(合并行)和 colspan(合并列)属性实现。例如:

<td rowspan="3">三班</td>  

表示当前单元格将占据下方的 3 行空间。

2.2 jQuery EasyUI 的合并逻辑

在 EasyUI 数据网格中,合并单元格需要通过 自定义方法 实现。具体步骤如下:

  1. 预处理数据:遍历数据,标记需要合并的单元格;
  2. 定义合并规则:通过 rowspancolspan 属性动态生成合并效果;
  3. 渲染到表格:在 EasyUI 的 onLoadSuccessonBeforeLoad 事件中执行合并逻辑。

三、基础案例:合并重复的“班级”列

3.1 案例场景

假设有一个学生信息表,数据结构如下:

[
  { "class": "三班", "name": "张三", "score": 90 },
  { "class": "三班", "name": "李四", "score": 85 },
  { "class": "四班", "name": "王五", "score": 92 }
]

目标是将“班级”列中连续重复的值合并为一个单元格。

3.2 实现步骤

3.2.1 HTML 结构

<table id="studentGrid"></table>  

3.2.2 JavaScript 配置

$(function() {  
  $('#studentGrid').datagrid({  
    url: 'data.json', // 模拟数据接口  
    columns: [[  
      { field: 'class', title: '班级', width: 100 },  
      { field: 'name', title: '学生姓名', width: 100 },  
      { field: 'score', title: '成绩', width: 100 }  
    ]],  
    onLoadSuccess: function(data) {  
      mergeCells(data, 'class'); // 调用合并方法  
    }  
  });  
});  

3.2.3 合并单元格的核心函数

function mergeCells(data, field) {  
  let rows = $('#studentGrid').datagrid('getRows');  
  let prevValue = null;  
  let count = 0;  
  
  for (let i = 0; i < rows.length; i++) {  
    let currentValue = rows[i][field];  
    if (currentValue === prevValue) {  
      count++;  
      // 清空当前行的单元格内容  
      rows[i]._merged = true;  
      $('#studentGrid').datagrid('updateRow', {  
        index: i,  
        row: { [field]: '' } // 空字符串避免重复显示  
      });  
    } else {  
      if (prevValue !== null) {  
        // 设置前一个合并单元格的行跨度  
        let prevIndex = i - count - 1;  
        let cell = $('#studentGrid').datagrid('getCell', {  
          index: prevIndex,  
          field: field  
        });  
        $(cell).attr('rowspan', count + 1); // +1 包含当前行  
      }  
      prevValue = currentValue;  
      count = 0;  
    }  
  }  
}  

3.3 关键点解析

  • 数据遍历:通过 getRows() 获取所有行数据,并逐行比较目标字段值;
  • 动态更新:使用 updateRow() 清空重复值的单元格内容;
  • 行跨度设置:通过 rowspan 属性合并连续的单元格,并计算正确的跨度值。

四、进阶技巧与常见问题

4.1 合并多列的复杂场景

如果需要同时合并“班级”和“课程”两列,可以扩展合并逻辑:

function mergeMultiColumns(data, fields) {  
  // 实现多字段合并的逻辑  
}  

此时需注意合并顺序(如先合并“班级”,再合并“课程”),避免覆盖已合并的单元格。

4.2 性能优化

当数据量较大时,频繁操作 DOM 可能导致性能问题。可通过以下方式优化:

  1. 缓存计算结果:将合并后的索引和跨度值存储为数据属性,避免重复计算;
  2. 分页处理:仅对当前页的数据进行合并,而非全部数据。

4.3 常见错误与解决方案

  • 合并后内容错位:检查 rowspancolspan 的计算逻辑是否正确;
  • 数据更新后未重新合并:在数据更新事件(如 onAfterEdit)中重新调用合并函数。

五、完整代码示例

以下是一个完整的可运行代码片段:

<!DOCTYPE html>  
<html>  
<head>  
  <title>jQuery EasyUI 合并单元格示例</title>  
  <link rel="stylesheet" href="https://www.jeasyui.com/easyui/themes/default/easyui.css">  
  <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>  
  <script src="https://www.jeasyui.com/easyui/jquery.easyui.min.js"></script>  
</head>  
<body>  
<table id="studentGrid"></table>  

<script>  
$(function() {  
  // 模拟数据  
  const data = {  
    total: 3,  
    rows: [  
      { class: "三班", name: "张三", score: 90 },  
      { class: "三班", name: "李四", score: 85 },  
      { class: "四班", name: "王五", score: 92 }  
    ]  
  };  
  
  $('#studentGrid').datagrid({  
    data: data.rows, // 直接使用模拟数据  
    columns: [[  
      { field: 'class', title: '班级', width: 100 },  
      { field: 'name', title: '学生姓名', width: 100 },  
      { field: 'score', title: '成绩', width: 100 }  
    ]],  
    onLoadSuccess: function() {  
      mergeCells('class'); // 合并班级列  
    }  
  });  
  
  function mergeCells(field) {  
    let rows = $('#studentGrid').datagrid('getRows');  
    let prevValue = null;  
    let count = 0;  
  
    for (let i = 0; i < rows.length; i++) {  
      let currentValue = rows[i][field];  
      if (currentValue === prevValue) {  
        count++;  
        rows[i]._merged = true;  
        $('#studentGrid').datagrid('updateRow', {  
          index: i,  
          row: { [field]: '' }  
        });  
      } else {  
        if (prevValue !== null) {  
          let prevIndex = i - count - 1;  
          let cell = $('#studentGrid').datagrid('getCell', {  
            index: prevIndex,  
            field: field  
          });  
          $(cell).attr('rowspan', count + 1);  
        }  
        prevValue = currentValue;  
        count = 0;  
      }  
    }  
  }  
});  
</script>  
</body>  
</html>  

六、总结与展望

通过本文的讲解,读者可以掌握 jQuery EasyUI 数据网格 – 合并单元格 的实现方法,并理解其背后的逻辑原理。合并单元格不仅优化了表格的视觉效果,还简化了用户的认知负担,是提升数据展示质量的重要技巧。

对于开发者而言,建议在实际项目中结合以下方向进一步探索:

  1. 动态合并逻辑:根据用户筛选条件动态调整合并范围;
  2. 跨列合并:实现行与列的交叉合并(需更复杂的计算);
  3. 响应式设计:确保合并后的表格在不同设备上保持良好显示效果。

掌握这些技巧后,开发者可以更灵活地应对复杂的数据展示需求,为用户提供更优质的交互体验。

最新发布