You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

react-apexcharts中Y轴刻度符号无法动态更新问题

解决react-apexcharts Y轴标签符号动态更新问题

问题分析

切换Y轴刻度类型(百分比/美元)时,刻度数值能正确变化,但标签的%/$符号无法实时更新,仅页面刷新后才生效。核心原因是react-apexcharts对formatter函数的变更检测不敏感,直接更新chartOptions中的formatter无法触发图表重新计算轴标签。

解决方案

方法1:给Chart组件添加动态Key

通过给Chart组件设置与scale绑定的key,当刻度类型切换时,强制组件重新渲染,确保新的formatter生效。

修改后的完整代码:

const { createRoot } = ReactDOM;
const { Fragment, StrictMode, useEffect, useState } = React;
const Chart = ReactApexChart;

const App = () => {
  const baseChartOptions = {
    chart: {
      type: 'line',
    },
    series: [
      {
        name: 'serie1',
        data: [1, 2, 3],
      },
    ],
    xaxis: {
      categories: ['a', 'b', 'c'],
    },
  };
  const [chartOptions, setChartOptions] = useState(baseChartOptions);
  const [scale, setScale] = useState('percentage');

  useEffect(() => {
    const getYAxisFormatter = (val) => {
      return scale === 'percentage' ? `${val.toFixed(1)}%` : `$${val.toFixed(2)}`;
    };

    setChartOptions((prevOptions) => ({
      ...prevOptions,
      yaxis: { labels: { formatter: getYAxisFormatter } },
    }));
  }, [scale]);

  return (
    <Fragment>
      <h4>{scale}</h4>
      <button onClick={() => setScale('dollars')}>Dollars</button>
      <button onClick={() => setScale('percentage')}>Percentage</button>
      {/* 添加与scale绑定的key,强制重新渲染 */}
      <Chart 
        key={scale}
        options={chartOptions} 
        series={chartOptions.series} 
        type="bar" 
        width="500" 
        height="320" 
      />
    </Fragment>
  );
};

const root = createRoot(document.getElementById("root"));
root.render(<StrictMode><App /></StrictMode>);

方法2:使用ApexCharts实例的updateOptions方法

通过获取图表实例,直接调用updateOptions方法更新Y轴配置,这种方式无需重新渲染整个组件,性能更优。

修改后的完整代码:

const { createRoot } = ReactDOM;
const { Fragment, StrictMode, useEffect, useRef, useState } = React;
const Chart = ReactApexChart;

const App = () => {
  const baseChartOptions = {
    chart: {
      type: 'line',
    },
    series: [
      {
        name: 'serie1',
        data: [1, 2, 3],
      },
    ],
    xaxis: {
      categories: ['a', 'b', 'c'],
    },
    yaxis: {
      labels: {
        formatter: (val) => `${val.toFixed(1)}%`
      }
    }
  };
  const chartRef = useRef(null);
  const [scale, setScale] = useState('percentage');

  useEffect(() => {
    const getYAxisFormatter = (val) => {
      return scale === 'percentage' ? `${val.toFixed(1)}%` : `$${val.toFixed(2)}`;
    };

    // 直接调用实例的updateOptions方法更新配置
    if (chartRef.current) {
      chartRef.current.chart.updateOptions({
        yaxis: { labels: { formatter: getYAxisFormatter } }
      });
    }
  }, [scale]);

  return (
    <Fragment>
      <h4>{scale}</h4>
      <button onClick={() => setScale('dollars')}>Dollars</button>
      <button onClick={() => setScale('percentage')}>Percentage</button>
      {/* 绑定ref获取图表实例 */}
      <Chart 
        ref={chartRef}
        options={baseChartOptions} 
        series={baseChartOptions.series} 
        type="bar" 
        width="500" 
        height="320" 
      />
    </Fragment>
  );
};

const root = createRoot(document.getElementById("root"));
root.render(<StrictMode><App /></StrictMode>);

方案对比

  • 方法1实现简单,适合小型图表或快速开发场景;
  • 方法2避免组件完全重渲染,性能更优,适合复杂图表或大数据量场景。

内容的提问来源于stack exchange,提问作者Damiano Dotto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 17:04:55