You need to enable JavaScript to run this app. Preact + TypeScript 环境下 Chart.js 2.x 无法更新 fontSize 属性问题
优惠活动
大模型
产品
解决方案
定价
更多

Preact + TypeScript 环境下 Chart.js 2.x 无法更新 fontSize 属性问题

问题核心原因

你配置的fontSize不生效,本质是类型定义与实际运行的Chart.js版本不匹配:

  • 项目实际运行的chart.js@2.9.4版本,坐标轴ticks配置不存在ticks.minor/ticks.major这两个嵌套层级,所有tick相关的字体配置都直接平铺在ticks根节点下生效。
  • 你使用的@types/chart.js@2.9.30存在类型错位:它提前将Chart.js 3.x版本才引入的双层级刻度配置结构,写入了2.x版本的类型定义,导致VSCode类型校验能识别这些无效路径,但实际2.9.4运行时根本不会读取嵌套在minor/major下的配置参数,修改后自然没有渲染变化。
适配2.9.4版本的可行方案
  1. 静态初始化图表时,直接将fontSize写在对应配置的根节点下,不要嵌套在无效层级中,正确示例:
    scales: {
        yAxes: [
            {
                ticks: {
                    beginAtZero: true,
                    suggestedMax: Math.max(...data) + 1,
                    // 直接写在ticks根节点,运行时可正常读取
                    fontSize: 20
                },
                scaleLabel: {
                    display: true,
                    labelString: "Seconds",
                    fontSize: 20
                }
            }
        ],
        xAxes: [
            {
                ticks: {
                    // 去掉minor/major嵌套,直接平铺配置
                    fontSize: 20
                }
            }
        ]
    }
    
  2. 运行时动态修改图表字体时,同样直接修改根节点的fontSize属性,再调用chart.update()即可生效,修正后的动态修改代码:
    const scaleAxes = chartToUpdate?.options?.scales?.xAxes;
    const axesXTicks = scaleAxes && scaleAxes[0]?.ticks;
    if (axesXTicks) {
        // 不要把fontSize重新赋值在minor/major节点下
        axesXTicks.fontSize = 20;
    }
    chartToUpdate.update();
    
  3. 如果需要实现主、次刻度区分字号的效果(2.x版本无内置双层级支持),可以通过自定义tick回调覆盖canvas字体配置实现:
    ticks: {
        fontSize: 20, // 设置默认字号
        callback: function(value, index) {
            const ctx = this.chart.ctx;
            // 自定义规则调整不同刻度的字体
            ctx.font = index % 4 === 0 
                ? '20px "Helvetica Neue"' 
                : '16px "Helvetica Neue"';
            return value;
        }
    }
    
补充说明
  • 你之前嵌套在ticks.minor/ticks.major下的fontSize配置,对Chart.js 2.9.4来说是完全无效的参数,会被运行时直接忽略,无论修改多少值都不会触发渲染变化。
  • 只有升级到Chart.js 3.x及以上版本,类型提示里的ticks.minor/ticks.major嵌套结构才会真正被运行时识别生效,2.9.4版本不要依赖这部分类型提示的配置路径。

内容的提问来源于stack exchange,提问作者James Hicks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.30 18:54:04