当前位置: 首页
前端开发
vxe-table数据分组统计与表尾合计实现方法

vxe-table数据分组统计与表尾合计实现方法

热心网友 时间:2026-06-13
转载

在数据报表或管理系统里,按某个字段分组并计算每组统计值(比如求和、平均值),同时表格底部还要显示所有数据的合计——这个需求太常见了。vxe-table 正好提供了灵活的组合方案:aggregateConfig 配上自定义计算函数 calcValuesMethod,再手动维护一个表尾 footerDa

在数据报表或管理系统里,按某个字段分组并计算每组统计值(比如求和、平均值),同时表格底部还要显示所有数据的合计——这个需求太常见了。vxe-table 正好提供了灵活的组合方案:aggregateConfig 配上自定义计算函数 calcValuesMethod,再手动维护一个表尾 footerData,就能轻松搞定。

下面拿一个完整的例子来说明:按角色(role)对数据分组,统计每个角色的 num 总和,最后在表格底部显示所有数据的 num 总计。

属性说明

配置项 / 属性所在位置作用
aggregateConfig.groupFields表格配置(gridOptions)指定分组字段,例如 ['role'],表格会按该字段对数据进行分组,并在每个分组后插入“分组合计行”
aggregateConfig.calcValuesMethod表格配置自定义分组统计值计算函数,接收当前分组的子数据(children)和列信息(column),返回统计值
aggFunc列配置(columns)标记该列需要参与聚合计算,配合分组统计使用
footerData表格配置手动指定表尾合计行的数据,适用于简单的总计、平均值等,更复杂时可配合 updateFooter 方法动态计算
rowGroupNode列配置标识该列作为分组的显示节点,通常设置为 true,使分组后的行可以展开/折叠(示例中使用)

注意:分组聚合需要同时设置 aggregateConfig.groupFields 和至少一列的 rowGroupNode: true,同时要聚合的列必须设置 aggFunc: true(或自定义聚合函数)。

代码

<template>
  <div>
    <vxe-grid v-bind="gridOptions">vxe-grid>
  div>
template><script setup>
import { reactive } from 'vue'// 表尾合计行数据(手动维护总计)
const footerSummaryRow = reactive({
  seq: '总计',
  num: 0
})const gridOptions = reactive({
  border: true,
  showOverflow: true,       // 超出显示省略号
  showFooter: true,         // 开启表尾
  height: 500,
  loading: false,  // 分组聚合配置
  aggregateConfig: {
    groupFields: ['role'],   // 按角色字段分组
    // 自定义分组统计值的计算方法
    calcValuesMethod({ column, children }) {
      // 只对 num 列进行求和
      if (column.field === 'num') {
        let sum = 0
        children.forEach(item => {
          sum += item.num
        })
        return sum
      }
      // 其他列不统计,返回 0 或空字符串
      return 0
    }
  },  // 列定义
  columns: [
    { type: 'seq', width: 70, title: '序号' },
    { field: 'name', title: '姓名', minWidth: 150, rowGroupNode: true },  // 分组显示节点
    { field: 'role', title: '角色', width: 120 },
    { field: 'num', title: '数量', width: 100, aggFunc: true },           // 参与聚合
    { field: 'age', title: '年龄', width: 80 },
    { field: 'address', title: '地址', minWidth: 200 }
  ],  data: [],               // 动态加载的数据
  footerData: [footerSummaryRow]   // 表尾数据
})// 模拟异步加载数据,并计算表尾总计
const loadData = () => {
  gridOptions.loading = true
  setTimeout(() => {
    const rawData = [
      { id: 10001, name: 'Test1', role: 'Develop', sex: 'Woman', age: 28, num: 63, date: '2025-02-01', address: 'test abc' },
      { id: 10002, name: 'Test2', role: 'Test', sex: 'Man', age: 22, num: 63, date: '2025-01-01', address: 'Guangzhou' },
      { id: 10003, name: 'Test3', role: 'PM', sex: 'Woman', age: 32, num: 10, date: '2025-05-01', address: 'Shanghai' },
      { id: 10004, name: 'Test4', role: 'Designer', sex: 'Man', age: 32, num: 24, date: '2025-01-01', address: 'test abc' },
      { id: 10005, name: 'Test5', role: 'Develop', sex: 'Man', age: 30, num: 98, date: '2025-01-01', address: 'Shanghai' },
      { id: 10006, name: 'Test6', role: 'Designer', sex: 'Man', age: 30, num: 46, date: '2025-03-01', address: 'test abc' },
      { id: 10007, name: 'Test7', role: 'Test', sex: 'Woman', age: 29, num: 35, date: '2025-05-01', address: 'test abc' },
      { id: 10008, name: 'Test8', role: 'PM', sex: 'Woman', age: 35, num: 84, date: '2025-11-01', address: 'test abc' },
      { id: 10009, name: 'Test9', role: 'Test', sex: 'Man', age: 21, num: 25, date: '2025-05-01', address: 'test abc' },
      { id: 10010, name: 'Test10', role: 'PM', sex: 'Woman', age: 28, num: 32, date: '2025-03-01', address: 'test abc' },
      { id: 10011, name: 'Test11', role: 'Test', sex: 'Woman', age: 29, num: 24, date: '2025-03-01', address: 'test abc' },
      { id: 10012, name: 'Test12', role: 'Develop', sex: 'Man', age: 37, num: 28, date: '2025-10-01', address: 'test abc' },
      { id: 10013, name: 'Test13', role: 'Test', sex: 'Woman', age: 24, num: 38, date: '2025-02-01', address: 'test abc' },
      { id: 10014, name: 'Test14', role: 'Develop', sex: 'Man', age: 34, num: 46, date: '2025-08-01', address: 'test abc' },
      { id: 10015, name: 'Test15', role: 'Designer', sex: 'Man', age: 21, num: 48, date: '2025-05-01', address: 'test abc' },
      { id: 10016, name: 'Test16', role: 'Designer', sex: 'Woman', age: 21, num: 59, date: '2025-10-01', address: 'test abc' },
      { id: 10017, name: 'Test17', role: 'Test', sex: 'Man', age: 31, num: 81, date: '2025-12-01', address: 'test abc' },
      { id: 10018, name: 'Test18', role: 'Develop', sex: 'Woman', age: 32, num: 75, date: '2025-10-01', address: 'test abc' },
      { id: 10019, name: 'Test19', role: 'Test', sex: 'Man', age: 37, num: 80, date: '2025-02-01', address: 'test abc' },
      { id: 10020, name: 'Test20', role: 'Develop', sex: 'Man', age: 41, num: 60, date: '2025-03-01', address: 'test abc' }
    ]    // 计算总计(num 总和)
    let totalNum = 0
    rawData.forEach(row => {
      totalNum += row.num
    })
    footerSummaryRow.num = totalNum    gridOptions.data = rawData
    gridOptions.loading = false
  }, 200)
}// 调用加载
loadData()
script>

实现思路

  • 分组显示:表格会按 role 字段将数据分组,同一角色的数据连续排列,并在每个分组前显示一个可展开/折叠的分组行(分组标题行)。
  • 分组统计行:在每个分组的末尾,自动插入一行“分组合计”,其中 num 列显示该组内所有 num 值的总和(由 calcValuesMethod 自定义计算)。
  • 表尾总计:表格底部固定一行(footerData),显示所有数据的 num 总计。该总计需要手动从数据源计算并赋值。

总的来说,vxe-table 通过 aggregateConfigaggFunc,再搭配自定义计算函数 calcValuesMethod,就能轻松应对各种复杂的分组统计场景。而表尾合计通过 footerData 手动维护,既灵活又直观。把这两者结合起来,一个带分组统计和总计的专业数据表格就能快速成型。

来源:https://juejin.cn/post/7645900195423305754

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
如何用拖放在Flask看板应用中更新数据库状态

如何用拖放在Flask看板应用中更新数据库状态

在Flask看板应用中,通过HTML5拖放API结合前端fetch异步POST请求,将拖拽任务的task_id和target_state发送至后端路由;后端接收JSON后更新数据库并提交事务,实现跨列拖拽时实时更新状态。需注意将事件绑定到容器而非子元素,并在ondragover中阻止默认行为以确保drop触发。

时间:2026-07-09 07:01
如何用CSS :has()选择器快速实现悬停span显示相邻div

如何用CSS :has()选择器快速实现悬停span显示相邻div

利用CSS的:has()伪类选择器,通过` bar:has(> baz:hover)+ qux`实现悬停内联元素时显示相邻块级容器,解决了传统相邻兄弟选择器无法跨层级匹配的局限,可用于悬停图标显示详情框等交互场景。需注意浏览器兼容性和性能优化,避免过度使用影响渲染效率。

时间:2026-07-09 07:01
display:block居中段落文本的响应式实现方法

display:block居中段落文本的响应式实现方法

通过`display:block`与`max-width`限制宽度,配合`margin:auto`使段落块水平居中并实现响应式布局;同时用CSS统一控制段落间距,避免脱离文档流,提升可读性与维护性。

时间:2026-07-09 07:01
JavaScript代码去重:高效避免重复编写的技巧

JavaScript代码去重:高效避免重复编写的技巧

将重复代码中的变化点提取为参数,利用ES6模板字符串动态生成选择器,可消除重复、保持一致性。注意参数安全性,必要时进行白名单校验;批量化场景可扩展为数组形式;现代框架中更推荐数据驱动或组件化封装替代手动选择器。

时间:2026-07-09 07:00
使用容器查询单位cqw实现表单输入框相对于祖父容器百分比宽度

使用容器查询单位cqw实现表单输入框相对于祖父容器百分比宽度

利用CSS容器查询单位cqw,表单输入框宽度可直接基于祖父容器计算,绕过中间包装器尺寸干扰,实现简洁响应式布局,无需硬编码或JavaScript,显著降低维护成本,提升嵌套结构下的布局灵活性。

时间:2026-07-09 07:00
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 热门数据榜