开发预览 更新于 2026-05-10

DonutChart 环形图

中空饼图,可在中心放数值/标签。

基础用法

数据通过 props 传入,纯 SVG 渲染,无第三方图表库依赖。 配色取自 --viz-1..8 token,色盲友好。

背景 视口
src/App.vue
<script setup lang="ts">
import { CfDonutChart } from '@chufix-design/vue';
const segments = [
  { name: 'Chrome', value: 65 },
  { name: 'Safari', value: 18 },
  { name: 'Firefox', value: 9 },
  { name: 'Edge', value: 5 },
  { name: 'Other', value: 3 },
];
</script>
<template>
  <CfDonutChart :segments="segments" :size="200" :thickness="28" center-value="100%" center-label="访问占比" />
</template>
<script setup>
import { CfDonutChart } from '@chufix-design/vue';
const segments = [
  { name: 'Chrome', value: 65 },
  { name: 'Safari', value: 18 },
  { name: 'Firefox', value: 9 },
  { name: 'Edge', value: 5 },
  { name: 'Other', value: 3 },
];
</script>
<template>
  <CfDonutChart :segments="segments" :size="200" :thickness="28" center-value="100%" center-label="访问占比" />
</template>
import { CfDonutChart } from '@chufix-design/react';

export default function Demo() {
  const segments = [
    { name: 'Chrome', value: 65 },
    { name: 'Safari', value: 18 },
    { name: 'Firefox', value: 9 },
    { name: 'Edge', value: 5 },
    { name: 'Other', value: 3 },
  ];
  return (
    <>
      <CfDonutChart segments={segments} size={200} thickness={28} center-value="100%" center-label="访问占比" />
    </>
  );
}
import { CfDonutChart } from '@chufix-design/react';

export default function Demo() {
  const segments = [
    { name: 'Chrome', value: 65 },
    { name: 'Safari', value: 18 },
    { name: 'Firefox', value: 9 },
    { name: 'Edge', value: 5 },
    { name: 'Other', value: 3 },
  ];
  return (
    <>
      <CfDonutChart segments={segments} size={200} thickness={28} center-value="100%" center-label="访问占比" />
    </>
  );
}

不同厚度

thickness 控制环厚度(同 size 时,越厚越偏饼图,越薄越偏 ring)。

背景 视口
src/App.vue
<script setup lang="ts">
import { CfDonutChart } from '@chufix-design/vue';
const segments = [
  { name: '已完成', value: 78 },
  { name: '进行中', value: 14, colorIndex: 4 },
  { name: '未开始', value: 8, colorIndex: 5 },
];
</script>
<template>
  <div class="demo-row" style="gap: 32px; align-items: center;">
    <CfDonutChart :segments="segments" :size="160" :thickness="14" :show-legend="false" center-value="78%" center-label="完成率" />
    <CfDonutChart :segments="segments" :size="160" :thickness="22" :show-legend="false" center-value="78%" center-label="完成率" />
    <CfDonutChart :segments="segments" :size="160" :thickness="32" :show-legend="false" center-value="78%" center-label="完成率" />
  </div>
</template>
<script setup>
import { CfDonutChart } from '@chufix-design/vue';
const segments = [
  { name: '已完成', value: 78 },
  { name: '进行中', value: 14, colorIndex: 4 },
  { name: '未开始', value: 8, colorIndex: 5 },
];
</script>
<template>
  <div class="demo-row" style="gap: 32px; align-items: center;">
    <CfDonutChart :segments="segments" :size="160" :thickness="14" :show-legend="false" center-value="78%" center-label="完成率" />
    <CfDonutChart :segments="segments" :size="160" :thickness="22" :show-legend="false" center-value="78%" center-label="完成率" />
    <CfDonutChart :segments="segments" :size="160" :thickness="32" :show-legend="false" center-value="78%" center-label="完成率" />
  </div>
</template>
import { CfDonutChart } from '@chufix-design/react';

export default function Demo() {
  const segments = [
    { name: '已完成', value: 78 },
    { name: '进行中', value: 14, colorIndex: 4 },
    { name: '未开始', value: 8, colorIndex: 5 },
  ];
  return (
    <>
      <div className="demo-row" style={{ gap: 32, alignItems: "center" }}>
          <CfDonutChart segments={segments} size={160} thickness={14} showLegend={false} center-value="78%" center-label="完成率" />
          <CfDonutChart segments={segments} size={160} thickness={22} showLegend={false} center-value="78%" center-label="完成率" />
          <CfDonutChart segments={segments} size={160} thickness={32} showLegend={false} center-value="78%" center-label="完成率" />
        </div>
    </>
  );
}
import { CfDonutChart } from '@chufix-design/react';

export default function Demo() {
  const segments = [
    { name: '已完成', value: 78 },
    { name: '进行中', value: 14, colorIndex: 4 },
    { name: '未开始', value: 8, colorIndex: 5 },
  ];
  return (
    <>
      <div className="demo-row" style={{ gap: 32, alignItems: "center" }}>
          <CfDonutChart segments={segments} size={160} thickness={14} showLegend={false} center-value="78%" center-label="完成率" />
          <CfDonutChart segments={segments} size={160} thickness={22} showLegend={false} center-value="78%" center-label="完成率" />
          <CfDonutChart segments={segments} size={160} thickness={32} showLegend={false} center-value="78%" center-label="完成率" />
        </div>
    </>
  );
}

API

属性类型默认值说明
segmentsDonutSegment[]{ name, value, colorIndex? }[]
sizenumber180直径
thicknessnumber24环厚
centerValue / centerLabelstring | number中心文本
showLegendbooleantrue显示图例
ariaLabelstring透传给根 <svg>aria-label

Events

Vue 事件React 回调载荷类型说明
item-enteronItemEnterDonutChartInteractionPayload鼠标进入某扇区时触发
item-leaveonItemLeaveDonutChartInteractionPayload鼠标离开扇区时触发

类型

interface DonutChartInteractionPayload {
  segment: DonutSegment;
  dataIndex: number;
  /** 该段占总和的比例(0..1)。 */
  pct: number;
  nativeEvent?: PointerEvent;
}

反馈与讨论

DonutChart 环形图 的讨论

0
0 / 600
正在加载评论...