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

Next.js中使用Recharts BarChart出现Hydration失败问题求助

解决Next.js中Recharts BarChart的Hydration匹配失败问题

核心原因

服务端渲染(SSR/SSG)时,Recharts的子组件(如XAxis、YAxis、Tooltip)会因为尺寸计算、SVG属性差异等问题,导致服务端生成的DOM和客户端渲染的DOM结构不一致,触发Hydration失败报错。

具体解决方案

  • 延迟客户端渲染
    利用useEffect让图表只在客户端完成渲染后再显示,避免服务端和客户端的DOM差异:

    import { useState, useEffect } from 'react';
    import { BarChart, XAxis, YAxis, Tooltip, Bar } from 'recharts';
    
    export default function MyChart({ data }) {
      const [isClient, setIsClient] = useState(false);
    
      useEffect(() => {
        setIsClient(true);
      }, []);
    
      if (!isClient) return null; // 服务端返回空,客户端再渲染图表
    
      return (
        <BarChart data={data} width={600} height={300}>
          <XAxis dataKey="name" />
          <YAxis />
          <Tooltip />
          <Bar dataKey="value" fill="#8884d8" />
        </BarChart>
      );
    }
    
  • 禁用SSR动态导入组件
    使用Next.js的dynamic导入,直接跳过服务端渲染图表组件:

    // 页面文件中
    import dynamic from 'next/dynamic';
    
    // 禁用SSR,只在客户端渲染图表
    const MyChart = dynamic(() => import('../components/MyChart'), { ssr: false });
    
    export default function Page() {
      const chartData = [{ name: 'A', value: 10 }, { name: 'B', value: 20 }];
      return <MyChart data={chartData} />;
    }
    
  • 确保数据一致性
    检查图表数据是否在服务端和客户端完全一致:

    • 如果数据来自API,确保服务端获取和客户端获取的逻辑一致,避免服务端预渲染用旧数据、客户端渲染用新数据
    • 避免在组件中使用window、document等仅客户端存在的对象生成数据,这类操作要放在useEffect里
  • 设置固定尺寸
    给BarChart明确设置宽高,避免服务端无法计算容器尺寸导致SVG属性差异:

    <BarChart data={data} width={600} height={300}>
      {/* 子组件 */}
    </BarChart>
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 02:17:42