游乐游手机版
首页/前端开发/文章详情

vxe-table数据分组与单元格图表柱状图饼图渲染实战

时间:2026-06-14 06:53
在实际的数据管理后台中,经常需要按某个维度分组展示数据,并且在表格里直接嵌入图表——比如销售对比、完成率这些指标。如果能让用户在同一张表里既看到分组信息,又直观地看到柱状图或饼图,那体验感会直接拉满。 vxe-table 的 aggregateConfig 和 cellRender 组合起来,真正能

在实际的数据管理后台中,经常需要按某个维度分组展示数据,并且在表格里直接嵌入图表——比如销售对比、完成率这些指标。如果能让用户在同一张表里既看到分组信息,又直观地看到柱状图或饼图,那体验感会直接拉满。

vxe-table 的 aggregateConfigcellRender 组合起来,真正能做到这一点:分组表格 + 图表混合展示,无需额外的第三方图表库。下面的例子演示了如何在分组表格的每一行里,渲染柱状图(计划 vs 实际)和饼图(占比)。

<template>
  <div>
    <vxe-grid ref="gridRef" v-bind="gridOptions">vxe-grid>
  div>
template><script setup>
import { reactive } from 'vue'const salesAmountsCellRender = reactive({
  name: 'bar',
  props: {
    bar: {
      max: 500 // 柱状图最大值(用于统一坐标尺度)
    },
    colors: ['#91C7AE', '#D48265'], // 系列颜色:[计划, 实际]
    labels: ['计划销售', '实际销售'],  // 图例标签
    tooltip: {
      formatter: '{label}:{value}元'
    },
    label: {
      formatter: '{value}元'
    }
  }
})const salesCompletenessCellRender = reactive({
  name: 'pie',
  props: {
    colors: ['#91C7AE', '#D48265'],
    labels: ['计划销售', '实际销售'],
    tooltip: {
      formatter: '{label}:{value}元'
    }
  }
})const gridOptions = reactive({
  height: 500,
  showOverflow: true,
  aggregateConfig: {
    groupFields: ['name']
  },
  columnConfig: {
    resizable: true
  },
  columns: [
    { type: 'seq', width: 70 },
    { field: 'group', title: 'Group', minWidth: 140, rowGroupNode: true },
    { field: 'date', title: '日期', width: 140 },
    { field: 'name', title: '产品名称' },
    { field: 'department', title: '部门' },
    { field: 'salesAmounts', title: '柱状图', minWidth: 160, cellRender: salesAmountsCellRender },
    { field: 'salesCompleteness', title: '饼图', width: 140, cellRender: salesCompletenessCellRender }
  ],
  data: [
    { id: 10001, name: '笔记本', department: '销售1部', actualAmount: 80, plannedAmount: 100, salesAmounts: [100, 80], salesCompleteness: [100, 80], date: '2025-02-01' },
    { id: 10002, name: '手机', department: '销售3部', actualAmount: 140, plannedAmount: 120, salesAmounts: [120, 140], salesCompleteness: [120, 140], date: '2025-01-01' },
    { id: 10003, name: '键盘', department: '销售2部', actualAmount: 220, plannedAmount: 200, salesAmounts: [200, 220], salesCompleteness: [200, 220], date: '2025-05-01' },
    { id: 10004, name: '鼠标', department: '销售1部', actualAmount: 110, plannedAmount: 140, salesAmounts: [140, 110], salesCompleteness: [140, 110], date: '2025-01-01' },
    { id: 10005, name: '笔记本', department: '销售2部', actualAmount: 40, plannedAmount: 90, salesAmounts: [90, 40], salesCompleteness: [90, 40], date: '2025-01-01' },
    { id: 10006, name: '鼠标', department: '销售4部', actualAmount: 40, plannedAmount: 120, salesAmounts: [120, 40], salesCompleteness: [120, 40], date: '2025-03-01' },
    { id: 10007, name: '键盘', department: '销售1部', actualAmount: 234, plannedAmount: 300, salesAmounts: [300, 234], salesCompleteness: [300, 234], date: '2025-05-01' },
    { id: 10008, name: '手机', department: '销售4部', actualAmount: 146, plannedAmount: 240, salesAmounts: [240, 146], salesCompleteness: [240, 146], date: '2025-11-01' },
    { id: 10009, name: '笔记本', department: '销售3部', actualAmount: 78, plannedAmount: 120, salesAmounts: [120, 78], salesCompleteness: [120, 78], date: '2025-05-01' },
    { id: 10010, name: '笔记本', department: '销售4部', actualAmount: 100, plannedAmount: 130, salesAmounts: [130, 100], salesCompleteness: [130, 100], date: '2025-03-01' },
    { id: 10011, name: '手机', department: '销售2部', actualAmount: 146, plannedAmount: 150, salesAmounts: [150, 146], salesCompleteness: [150, 146], date: '2025-03-01' },
    { id: 10012, name: '键盘', department: '销售4部', actualAmount: 130, plannedAmount: 130, salesAmounts: [130, 130], salesCompleteness: [130, 130], date: '2025-10-01' },
    { id: 10013, name: '手机', department: '销售2部', actualAmount: 140, plannedAmount: 80, salesAmounts: [80, 140], salesCompleteness: [80, 140], date: '2025-02-01' },
    { id: 10014, name: '笔记本', department: '销售1部', actualAmount: 200, plannedAmount: 100, salesAmounts: [100, 200], salesCompleteness: [100, 200], date: '2025-08-01' },
    { id: 10015, name: '键盘', department: '销售3部', actualAmount: 320, plannedAmount: 300, salesAmounts: [300, 320], salesCompleteness: [300, 320], date: '2025-05-01' },
    { id: 10016, name: '笔记本', department: '销售4部', actualAmount: 380, plannedAmount: 400, salesAmounts: [400, 380], salesCompleteness: [400, 380], date: '2025-10-01' },
    { id: 10017, name: '鼠标', department: '销售1部', actualAmount: 34, plannedAmount: 200, salesAmounts: [200, 34], salesCompleteness: [200, 34], date: '2025-12-01' },
    { id: 10018, name: '键盘', department: '销售4部', actualAmount: 100, plannedAmount: 150, salesAmounts: [150, 100], salesCompleteness: [150, 100], date: '2025-10-01' },
    { id: 10019, name: '鼠标', department: '销售3部', actualAmount: 90, plannedAmount: 120, salesAmounts: [120, 90], salesCompleteness: [120, 90], date: '2025-02-01' },
    { id: 10020, name: '手机', department: '销售2部', actualAmount: 40, plannedAmount: 50, salesAmounts: [50, 40], salesCompleteness: [50, 40], date: '2025-03-01' }
  ]
})
script>

柱状图/ 饼图渲染器参数

参数说明
bar.max柱状图的最大值刻度,用于统一多个单元格的视觉比例
colors系列颜色数组,按数据顺序对应
labels图例/提示框显示的文本
tooltip.formatter鼠标悬浮时的提示内容,{label} 对应 labels 项,{value} 对应数据值
label.formatter柱顶数值标签格式
来源:https://juejin.cn/post/7644402972715466779
上一篇vxe-table数据分组的三种展示方式详解 下一篇uniapp中灵活控制web组件scoped样式的方法
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
checked表单属性与CSS变量实现换肤原理
前端开发 · 2026-07-02

checked表单属性与CSS变量实现换肤原理

先聊一个有意思的现象:不需要编写任何 JavaScript,仅靠一个 :checked 伪类,就能驱动整个主题切换系统。听起来很神奇,但原理其实并不复杂——核心在于,:checked 是浏览器原生状态的实时镜像,而不是 JS 模拟出来的开关。 用户点击 ,或者用键盘空格键选中它,状态更新的那一刻,C

HTML meta标签页面定时跳转实现
前端开发 · 2026-07-02

HTML meta标签页面定时跳转实现

说到前端开发中最简洁的页面跳转方式,meta http-equiv= "refresh " 绝对算得上一个经典方案。不过别看它结构简单,格式上稍有疏忽,页面就可能原地卡死,或者直接跳到一个错误地址。下面把几个最容易踩坑的细节彻底讲清楚,帮你避开这些常见陷阱。 使用 http-equiv= "refresh

Cypress跨测试用例状态传递的不推荐但可选方案
前端开发 · 2026-07-02

Cypress跨测试用例状态传递的不推荐但可选方案

Cypress 默认的设计哲学很干脆:每个测试用例都必须是独立小王国,谁也不靠谁。这意味着 it() 执行前,浏览器上下文会被“一键还原”——页面状态、LocalStorage、Cookies 统统清空,强制维护测试隔离。这一规则让很多新手头疼:明明前一个测试已经创建了员工,后一个测试怎么就没法直接

全面深度解析HTML主体main标签唯一性原则与使用规范
前端开发 · 2026-07-02

全面深度解析HTML主体main标签唯一性原则与使用规范

在进行前端无障碍审计时,不少开发者会遇到一个奇怪的场景:浏览器不报错,但Lighthouse却直接标红“duplicate-main”。这其实是语义层与渲染层之间的根本差异。 为什么浏览器不报错但 Lighthouse 直接标红 duplicate-main 关键原因就在于:`main` 是语义锚点

HTML main标签在文档结构中的唯一性详解
前端开发 · 2026-07-02

HTML main标签在文档结构中的唯一性详解

先做一个快速检测:打开你最近开发的一个页面,按下 Ctrl+F 搜索 。如果搜索结果里出现2个以上,那这篇文章建议你认真读完。 本期要聊的主题,是HTML标签中一个看似简单、实际极易踩坑的核心知识点:main标签的唯一性。很多开发者知道这个标签的存在,但真正写到项目里,尤其是用了React、Vue这