第17章:ECharts 饼图自定义样式(扇区颜色、轮廓、标签配置 + 空状态兼容)

第17章:ECharts 饼图自定义样式(扇区颜色、轮廓、标签配置 + 空状态兼容)

业务场景:若依后台常用占比统计饼图 / 环形饼图。本节自定义每个扇区颜色、边框轮廓、标签文字位置、字体大小,同时保留之前封装好的点击事件、防抖 resize,兼容空数据场景。echartHelper.js 无需改动。

页面完整 Vue 代码

复制代码
<template>
  <div class="chart-container">
    <el-alert title="饼图自定义样式:扇区颜色、轮廓、标签,点击扇区弹窗" type="info" style="margin-bottom:10px"/>
    <div
      ref="chartRef"
      style="width:100%;height:400px;border:1px solid #eee"
    ></div>

    <el-dialog v-model="dialogVisible" title="饼图点击详情">
      <p>分类名称:{{ clickData.name }}</p>
      <p>占比数值:{{ clickData.value }}</p>
      <p>百分比:{{ clickData.percent }}%</p>
    </el-dialog>
  </div>
</template>

<script setup>
import { ref } from 'vue'
import { useEcharts } from '@/composables/echartHelper'
const { chartRef, setChartOption, onChartEvent } = useEcharts()

const dialogVisible = ref(false)
const clickData = ref({ name:'', value:0, percent:0 })

const option = {
  title: {
    text: '产品销售占比饼图',
    left: 'center',
    textStyle: {
      fontSize:18,
      color:'#303133'
    }
  },
  tooltip: {
    trigger: 'item',
    formatter: '{b}: {c} ({d}%)'
  },
  legend: {
    orient: 'vertical',
    left: 'left',
    top: 'center',
    textStyle: {
      fontSize:14
    }
  },
  series: [
    {
      name: '销售额',
      type: 'pie',
      radius: '60%', // 饼图大小
      center: ['60%', '50%'],
      data: [
        { name: '产品A', value: 1048, itemStyle:{ color:'#409EFF' } },
        { name: '产品B', value: 735, itemStyle:{ color:'#67C23A' } },
        { name: '产品C', value: 580, itemStyle:{ color:'#E6A23C' } },
        { name: '产品D', value: 484, itemStyle:{ color:'#F56C6C' } },
        { name: '产品E', value: 300, itemStyle:{ color:'#909399' } }
      ],
      itemStyle: {
        borderColor: '#fff', // 扇区分割白色轮廓
        borderWidth: 2 // 轮廓宽度
      },
      label: {
        show: true,
        fontSize:13,
        formatter: '{b}: {d}%' // 标签显示名称+百分比
      }
    }
  ]
}

setChartOption(option)

// 饼图点击事件
onChartEvent('click', (params)=>{
  console.log('饼图点击参数', params)
  clickData.value = {
    name: params.name,
    value: params.value,
    percent: params.percent
  }
  dialogVisible.value = true
})
</script>

✅ 测试步骤

  1. 保存 vue 文件,刷新页面
  2. 饼图正常渲染,每个扇区独立自定义颜色,扇区之间有白色分割轮廓
  3. 扇区外部标签展示名称 + 百分比;鼠标悬浮 tooltip 正常
  4. 点击任意扇区,弹窗展示名称、数值、百分比
  5. 缩放浏览器窗口,防抖 resize 自适应生效
  6. 切换路由,图表实例正常销毁,无内存泄漏

拓展小知识点:

把 radius: '60%' 修改为 radius: ['40%','70%'],就会变成环形空心饼图 ,直接可以试。

相关推荐
ruanno_top15 小时前
Vue 3 后台权限路由:我漏掉了按钮级裁剪,还把 403 写成了 404
vue.js
栉甜15 小时前
Vue2学习内容(上)
前端·javascript·vue.js·学习
小郎君65817 小时前
(六)el-cascader 的展示值为什么不能直接 join:emitPath、路径还原与多选去重
vue.js·算法
用户0936717554118 小时前
用 4500 行 TypeScript 复刻了童年方格纸上的海战棋
前端·vue.js
行走的陀螺仪19 小时前
Claude Code 从入门到实战(一):安装、登录与第一个Vue项目
前端·javascript·vue.js
jktantan1 天前
Vue keep-alive 切标签后滚动位置回顶?因为 onDeactivated 里读到的 scrollTop 是 0
前端·javascript·vue.js
小郎君6582 天前
(一)为什么表单需要第三种状态:disabled、readonly 与纯文本展示
前端·vue.js
jktantan2 天前
(二)Vue 3 的 attrs 不是响应式:el-form 扩展属性同步的三种方案
前端·javascript·vue.js·element-plus
Highcharts.js2 天前
Highcharts 集成到 React 或 Vue 项目中时,如何高效地使用 TypeScript技巧?
vue.js·人工智能·react.js·typescript·前端框架·highcharts
Java后端的Ai之路2 天前
CAS并发控制-从CPU指令到企业级乐观锁
vue.js·人工智能·python·cas·乐观锁