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

React-ApexCharts环形图渲染报错求助:TypeError读取toString失败

解决React-ApexCharts环形图首次渲染Cannot read properties of undefined (reading 'toString')错误

问题分析

该错误是Next.js环境下react-apexcharts的初始化时机与客户端组件渲染流程不匹配导致的——首次挂载时图表内部某个未完成初始化的变量触发了toString调用,而修改属性后图表重新渲染时,相关变量已就绪,因此能正常显示。

解决方案

以下是几种可行的修复方案,按优先级排序:

1. 延迟渲染图表,确保DOM就绪

通过添加加载状态,等待组件挂载完成后再渲染图表,规避初始化阶段的DOM未就绪问题:

"use client";
import { ApexOptions } from "apexcharts";
import React, { useState, useEffect } from "react";
import dynamic from "next/dynamic";
const ReactApexChart = dynamic(() => import("react-apexcharts"), { ssr: false });

interface ChartThreeState {
    series: number[];
}

const options: ApexOptions = {
    chart: {
        type: "donut",
    },
    colors: ["#85b473f8", "#183d6df8"],
    labels: ["Verwendete Benefits", "Noch verfügbare Benefits"],
    legend: {
        show: true,
        position: "bottom",
    },
    plotOptions: {
        pie: {
            donut: {
                size: "65%",
                background: "transparent",
            },
        }, 
    },
    dataLabels: {
        enabled: false,
    },
    responsive: [
        {
            breakpoint: 2600,
            options: {
                chart: {
                    width: 380,
                },
            },
        },
        {
            breakpoint: 640,
            options: {
                chart: {
                    width: 200,
                },
            },
        },
    ],
};

const Chart: React.FC = () => {
    const [state, setState] = useState<ChartThreeState>({
        series: [2, 0]
    });
    const [chartLoaded, setChartLoaded] = useState(false);

    useEffect(() => {
        // 组件挂载后再渲染图表
        setChartLoaded(true);
    }, []);

    return (
        <div className="pt-4 col-span-12 ring-1 ring-secondary mx-0 rounded-lg border border-secondary bg-white px-5 pb-5 shadow-default sm:px-7.5 xl:col-span-6">
            <div className="mb-3 justify-between gap-4 sm:flex">
                <div>
                    <h5 className="text-xl font-semibold text-primary">
                        Nutzung
                    </h5>
                </div>
            </div>

            <div className="mb-2">
                <div id="chartThree" className="mx-auto flex justify-center">
                    {chartLoaded && (
                        <ReactApexChart
                            options={options}
                            series={state.series}
                            width="100%"
                            type="donut"
                        />
                    )}
                </div>
            </div>
        </div>
    );
};

export default Chart;

2. 调整初始series值,规避零值触发的内部异常

部分场景下,series包含0会导致ApexCharts内部计算出现未定义变量,可将初始零值替换为极小非零值:

const [state, setState] = useState<ChartThreeState>({
    series: [2, 0.001] // 用0.001替代0
});

3. 将options移入组件内部,避免外部常量引用问题

把options定义移到Chart组件内部,确保每次渲染时都能获取到最新的配置对象:

const Chart: React.FC = () => {
    const [state, setState] = useState<ChartThreeState>({
        series: [2, 0]
    });
    // 将options移入组件内部
    const options: ApexOptions = {
        chart: {
            type: "donut",
        },
        colors: ["#85b473f8", "#183d6df8"],
        labels: ["Verwendete Benefits", "Noch verfügbare Benefits"],
        legend: {
            show: true,
            position: "bottom",
        },
        plotOptions: {
            pie: {
                donut: {
                    size: "65%",
                    background: "transparent",
                },
            }, 
        },
        dataLabels: {
            enabled: false,
        },
        responsive: [
            {
                breakpoint: 2600,
                options: {
                    chart: {
                        width: 380,
                    },
                },
            },
            {
                breakpoint: 640,
                options: {
                    chart: {
                        width: 200,
                    },
                },
            },
        ],
    };

    // 其余代码不变
};

验证方式

应用方案后刷新页面,若初始化错误消失,且修改属性后图表仍能正常渲染,则问题已解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 21:05:08