0

0

Chart.js 在甜甜圈图表中心显示文本的正确实现方法

心靈之曲

心靈之曲

发布时间:2026-01-09 15:04:57

|

821人浏览过

|

来源于php中文网

原创

Chart.js 在甜甜圈图表中心显示文本的正确实现方法

本文详解如何在 chart.js 的 doughnut 图表中心精准渲染动态文本,重点纠正插件注册位置错误、坐标计算逻辑缺陷及 react 状态同步问题,并提供可直接运行的完整解决方案。

在使用 react-chartjs-2 实现甜甜圈图(Doughnut)时,许多开发者尝试通过 options.plugins.beforeDraw 直接注入绘图逻辑来居中显示数值,但常遇到文本不显示、偏移或闪烁等问题。根本原因在于:Chart.js 插件必须作为独立对象传入组件的 plugins prop,而非嵌套在 options.plugins 内部——后者仅用于配置已注册插件,无法定义新插件逻辑。

✅ 正确做法:分离插件定义与配置

首先,将自定义插件提取为独立对象,并赋予唯一 id(这是 Chart.js 插件系统的强制要求):

const centerTextPlugin = {
  id: 'centerText',
  beforeDraw: (chart) => {
    const { ctx, chartArea: { left, top, right, bottom } } = chart;
    const centerX = left + (right - left) / 2;
    const centerY = top + (bottom - top) / 2;

    ctx.save();
    ctx.font = 'bold 24px sans-serif';
    ctx.fillStyle = '#333';
    ctx.textAlign = 'center';
    ctx.textBaseline = 'middle';
    ctx.fillText(`${chart.data.datasets[0].data[0]}`, centerX, centerY);
    ctx.restore();
  }
};
⚠️ 注意:chart.ctx 和 chart.chartArea 在 beforeDraw 阶段已完全就绪,但需确保 chart.data 已同步更新(见下文状态处理)。

✅ 配置 options 与 plugins 分离

options 中不应包含插件实现,仅保留图表行为配置;插件需通过 组件的 plugins 属性显式传入:

const options = {
  responsive: true,
  cutout: '75%', // 建议用百分比而非字符串('80%' → 80)
  layout: { padding: 16 },
  plugins: {
    legend: { display: false }, // 可选:隐藏图例以突出中心文本
    tooltip: { enabled: false }  // 可选:禁用悬停提示
  }
};

// 使用时:

✅ 处理 React 状态与动画同步问题

原代码中 useEffect 的依赖项 [count, targetValue] 会导致无限循环(count 更新触发 effect,effect 又更新 count)。应改为:

TemPolor
TemPolor

AI音乐生成器,一键创作免版税音乐

下载
useEffect(() => {
  const durations = [5000, 5000, 5000];
  const increment = targetValue.map((val, i) => Math.ceil(val / durations[i] * 10));

  const timer = setTimeout(() => {
    setCount(prev => 
      prev.map((c, i) => (c < targetValue[i] ? c + increment[i] : c))
    );
  }, 10);

  return () => clearTimeout(timer);
}, [targetValue]); // ✅ 仅依赖 targetValue,避免循环

同时,确保 data 动态绑定最新值(如 data.datasets[0].data[0] 对应 input1),插件内 fillText 才能实时反映变化。

✅ 完整可运行示例(精简版)

import { Doughnut } from 'react-chartjs-2';
import { Chart as ChartJS, ArcElement, Tooltip, Legend } from 'chart.js';

ChartJS.register(ArcElement, Tooltip, Legend);

const centerTextPlugin = { /* 如上定义 */ };

export default function RoundedStats() {
  const [input1, setInput1] = useState(0);
  // ... 其他 state 同理

  useEffect(() => {
    // 初始化逻辑(略)
  }, []);

  const data = {
    datasets: [{
      data: [input1, 100 - input1],
      backgroundColor: ['red', '#071952']
    }]
  };

  const options = { /* 如上配置 */ };

  return (
    

No of Visitors

{/* 其他两个图表同理 */}
); }

? 常见错误排查清单

  • ❌ 错误:plugins 写在 options.plugins 里 → ✅ 应传给组件 plugins prop
  • ❌ 错误:未设置 id 字段 → ✅ 插件必须有唯一 id
  • ❌ 错误:chartArea 计算使用 chart.chartArea.left 等 → ✅ 应解构 chart.chartArea 或用 chart.boxes(更健壮)
  • ❌ 错误:input1 未及时同步到 data → ✅ 确保 data 是响应式引用最新 state

通过以上调整,文本将稳定、居中、随数据实时更新地渲染在甜甜圈图正中央。

相关专题

更多
counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

196

2023.11.20

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

510

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

244

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

253

2023.08.03

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

5260

2023.08.17

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

475

2023.09.01

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

206

2023.09.04

Js中concat和push的区别
Js中concat和push的区别

Js中concat和push的区别:1、concat用于将两个或多个数组合并成一个新数组,并返回这个新数组,而push用于向数组的末尾添加一个或多个元素,并返回修改后的数组的新长度;2、concat不会修改原始数组,是创建新的数组,而push会修改原数组,将新元素添加到原数组的末尾等等。本专题为大家提供concat和push相关的文章、下载、课程内容,供大家免费下载体验。

217

2023.09.14

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

3

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 3.5万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

React核心原理新老生命周期精讲
React核心原理新老生命周期精讲

共12课时 | 1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号