You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Vaadin Grid中合并相同值单元格?能否集成jQuery?

Vaadin Grid 单元格合并实现方案

一、原生实现方式

Vaadin Grid(包括Vaadin 14+的Flow版本及旧版框架)没有原生支持单元格合并的API。Grid的核心设计基于标准行/列表格模型,单元格合并属于自定义布局需求,不在原生功能覆盖范围内。

二、集成jQuery实现单元格合并

如果需要实现该效果,可以将jQuery脚本集成到Vaadin项目中,具体步骤如下:

1. 引入jQuery依赖

  • Vaadin 14+(Flow + npm):在项目根目录的package.json中添加依赖,执行npm install完成安装:

    "dependencies": {
      "jquery": "^3.7.1"
    }
    

    然后在对应视图类中声明依赖:

    import com.vaadin.flow.component.dependency.NpmPackage;
    
    @NpmPackage(value = "jquery", version = "^3.7.1")
    public class YourGridView extends VerticalLayout {
        // 视图逻辑代码
    }
    
  • 旧版Vaadin(如Vaadin 8):通过WebJar引入,在pom.xml中添加依赖:

    <dependency>
        <groupId>org.webjars</groupId>
        <artifactId>jquery</artifactId>
        <version>3.7.1</version>
    </dependency>
    

    并在UI类中添加资源引用:

    import com.vaadin.annotations.JavaScript;
    
    @JavaScript("webjars/jquery/3.7.1/jquery.min.js")
    public class YourUI extends UI {
        // UI逻辑代码
    }
    

2. 编写单元格合并的jQuery脚本

针对Vaadin Grid的DOM结构编写合并逻辑,核心思路是遍历目标列的单元格,对比相邻单元格的值,隐藏重复值的单元格并为上方单元格设置rowspan属性。示例脚本(以第一列为例):

$(function() {
    // 目标列索引(从0开始计数)
    const targetColumnIndex = 0;
    // 获取Grid的总列数
    const columnCount = $('vaadin-grid-column').length;
    let previousValue = null;
    let currentRowSpan = 1;

    // 遍历所有单元格内容元素
    $('vaadin-grid-cell-content').each(function(index) {
        // 判断当前单元格是否属于目标列
        if (index % columnCount === targetColumnIndex) {
            const currentValue = $(this).text().trim();
            if (currentValue === previousValue) {
                // 值重复,隐藏当前单元格,增加上方单元格的rowspan
                currentRowSpan++;
                $(this).hide();
                $(this).closest('vaadin-grid-row').prev()
                      .find('vaadin-grid-cell-content').eq(targetColumnIndex)
                      .attr('rowspan', currentRowSpan);
            } else {
                // 值不重复,重置rowspan和参考值
                previousValue = currentValue;
                currentRowSpan = 1;
                $(this).attr('rowspan', 1).show();
            }
        }
    });
});

3. 在Vaadin中触发脚本

由于Vaadin Grid是动态渲染的,需要在Grid数据加载完成、视图挂载或数据更新后执行脚本:

  • 视图挂载时触发(Vaadin Flow):
    grid.addAttachListener(event -> {
        getElement().executeJs("""
            $(function() {
                // 放入上面的jQuery合并代码
            });
        """);
    });
    
  • 数据更新后重新触发(分页、排序、过滤等操作后):
    grid.addDataProviderRefreshListener(event -> {
        getElement().executeJs("""
            // 重新执行合并脚本
        """);
    });
    

注意事项

  • 分页、排序、过滤、数据刷新等动态操作后,需要重新执行合并脚本,因为Grid会重新渲染DOM;
  • 若Grid使用懒加载,需确保在数据加载完成后触发脚本;
  • 可根据需求调整脚本中的列索引、选择器和样式,确保合并后的单元格显示正常(如设置垂直居中)。

内容的提问来源于stack exchange,提问作者Anshaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 17:31:15