当前位置:首页 > VUE

vue实现扇形图

2026-01-18 01:40:15VUE

Vue 实现扇形图的方法

使用 SVG 和 Vue 动态计算路径

通过 SVG 的 path 元素和 Vue 的计算属性动态生成扇形路径。以下是一个基础实现示例:

<template>
  <svg width="200" height="200" viewBox="0 0 100 100">
    <path 
      :d="sectorPath(50, 50, 40, 0, 90)" 
      fill="#FF6384"
    />
  </svg>
</template>

<script>
export default {
  methods: {
    sectorPath(cx, cy, r, startAngle, endAngle) {
      const startRad = (startAngle * Math.PI) / 180;
      const endRad = (endAngle * Math.PI) / 180;
      const x1 = cx + r * Math.cos(startRad);
      const y1 = cy + r * Math.sin(startRad);
      const x2 = cx + r * Math.cos(endRad);
      const y2 = cy + r * Math.sin(endRad);

      return `M ${cx} ${cy} L ${x1} ${y1} A ${r} ${r} 0 0 1 ${x2} ${y2} Z`;
    }
  }
};
</script>

使用第三方图表库(如 ECharts)

安装 ECharts 和 Vue-ECharts 封装库:

vue实现扇形图

npm install echarts vue-echarts

示例代码:

vue实现扇形图

<template>
  <v-chart :option="chartOption" style="height: 400px"/>
</template>

<script>
import { use } from 'echarts/core';
import { PieChart } from 'echarts/charts';
import { CanvasRenderer } from 'echarts/renderers';
import VChart from 'vue-echarts';

use([PieChart, CanvasRenderer]);

export default {
  components: { VChart },
  data() {
    return {
      chartOption: {
        series: [{
          type: 'pie',
          radius: ['50%', '70%'],
          data: [
            { value: 35, name: 'Category A' },
            { value: 25, name: 'Category B' }
          ],
          emphasis: {
            itemStyle: {
              shadowBlur: 10,
              shadowOffsetX: 0,
              shadowColor: 'rgba(0, 0, 0, 0.5)'
            }
          }
        }]
      }
    };
  }
};
</script>

使用 Canvas 绘制

通过 Vue 的生命周期钩子和 Canvas API 实现:

<template>
  <canvas ref="pieCanvas" width="300" height="300"></canvas>
</template>

<script>
export default {
  mounted() {
    this.drawPieChart();
  },
  methods: {
    drawPieChart() {
      const canvas = this.$refs.pieCanvas;
      const ctx = canvas.getContext('2d');
      const data = [30, 70];
      const colors = ['#FF6384', '#36A2EB'];

      let startAngle = 0;
      data.forEach((value, i) => {
        const sliceAngle = (2 * Math.PI * value) / 100;
        ctx.beginPath();
        ctx.fillStyle = colors[i];
        ctx.moveTo(150, 150);
        ctx.arc(150, 150, 100, startAngle, startAngle + sliceAngle);
        ctx.closePath();
        ctx.fill();
        startAngle += sliceAngle;
      });
    }
  }
};
</script>

响应式数据处理

结合 Vue 的响应式特性动态更新扇形图:

<template>
  <div>
    <svg width="200" height="200">
      <path 
        v-for="(item, index) in sectors" 
        :key="index"
        :d="item.path" 
        :fill="item.color"
      />
    </svg>
    <button @click="updateData">Update Data</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      data: [45, 30, 25],
      colors: ['#FF6384', '#36A2EB', '#FFCE56']
    };
  },
  computed: {
    sectors() {
      let total = this.data.reduce((a, b) => a + b, 0);
      let startAngle = 0;
      return this.data.map((value, i) => {
        const angle = (value / total) * 360;
        const path = this.sectorPath(100, 100, 80, startAngle, startAngle + angle);
        startAngle += angle;
        return { path, color: this.colors[i] };
      });
    }
  },
  methods: {
    sectorPath(cx, cy, r, startAngle, endAngle) {
      // 同第一个示例的 path 计算方法
    },
    updateData() {
      this.data = this.data.map(() => Math.floor(Math.random() * 50) + 10);
    }
  }
};
</script>

关键注意事项

  • SVG 方案适合轻量级定制需求,但需要手动计算几何路径
  • ECharts 等库提供丰富的交互功能(如 tooltip、动画),适合复杂场景
  • Canvas 方案性能较好,但需要手动处理分辨率适配
  • 动态数据更新时,确保通过 Vue 的响应式系统触发重新渲染

标签: 扇形vue
分享给朋友:

相关文章

vue实现检测数组

vue实现检测数组

Vue 中检测数组变化的方法 Vue 的响应式系统无法直接检测到数组的某些变化,因为 JavaScript 的限制。以下是一些解决方案: 使用 Vue.set 或 this.$set Vue…

vue为啥能实现监听

vue为啥能实现监听

Vue 实现监听的原理 Vue 的监听能力主要基于其响应式系统,该系统通过数据劫持和依赖收集实现。当数据变化时,系统能自动触发视图更新或执行回调函数。 核心机制:Object.defineProp…

vue实现表格多行修改

vue实现表格多行修改

实现多行编辑表格 在Vue中实现表格的多行编辑功能,可以通过以下方法完成。这里以Element UI的表格组件为例,但思路适用于其他UI库或原生实现。 数据准备 定义表格数据和编辑状态管理变量:…

vue实现冰墩墩

vue实现冰墩墩

使用 Vue 实现冰墩墩动画 通过 Vue 的动画特性和 SVG 技术,可以动态渲染冰墩墩的形象。以下是具体实现方法: 准备 SVG 素材 冰墩墩的形象通常由多个 SVG 路径组成,包括身体轮廓、面…

vue实现自定义登录

vue实现自定义登录

实现自定义登录的基本步骤 在Vue中实现自定义登录功能通常需要结合前端和后端技术。以下是一个基本的实现流程: 创建登录表单组件 使用Vue的单文件组件创建一个登录表单,包含用户名和密码输入框以及提交…

vue实现微博发布动态

vue实现微博发布动态

使用Vue实现微博发布动态功能 创建Vue组件结构 新建一个WeiboPost.vue组件,包含文本框、图片上传和发布按钮: <template> <div class="we…