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

使用React Interweave库渲染HTML时出现运行时Hydration错误怎么办?

React Hydration 错误排查与解决

问题场景

开发React组件时,从包含HTML代码的字符串数组中获取数据,通过Interweave库的Markup组件循环渲染表格。页面能正常显示,但运行时触发Hydration错误,注释掉<li className={styles.listContent}>{<Markup content={i} />}</li>后错误消失。


相关代码

数据数组代码

export const RewardsFromInvestments = [
  "代币持有者可获得的净收益耕作奖励,将通过以下公式计算并定期发放至代币持有者账户:",
  `为明确起见,收益耕作奖励包括交易手续费收入和原生代币奖励收入产生的利润。收益耕作奖励分配如下:
  <table>
    <tr>
      <td>分配给代币持有者的交易手续费收入</td>
      <td>100%</td>
    </tr>
    <tr>
      <td>分配给ZaynFi的交易手续费收入</td>
      <td>0%</td>
    </tr>
    <tr>
      <td>分配给代币持有者的原生代币奖励</td>
      <td>80%</td>
    </tr>
     <tr>
      <td>分配给ZaynFi的原生代币奖励</td>
      <td>20%</td>
    </tr>
  </table>`,
];

动态列表渲染代码

<ol
  className={`list-[lower-roman] font-normal text-[16px]  pl-5 outside ${styles.listTerms}`}
>
  {RewardsFromInvestments.map((i) => (
    <li className={styles.listContent}>{<Markup content={i} />}</li>
  ))}
</ol>

解决方案

Hydration错误的核心原因是服务端渲染(SSR)/静态生成(SSG)时,服务端输出的HTML与客户端Hydration生成的DOM结构不匹配。针对Markup组件的场景,可通过以下方法解决:

1. 强制仅客户端渲染Markup

给Markup组件添加noSSR属性,跳过服务端渲染阶段的HTML解析,仅在客户端生成DOM:

<li className={styles.listContent}>
  <Markup content={i} noSSR />
</li>

2. 规范HTML字符串格式

清理HTML字符串中的多余缩进、换行,避免服务端与客户端因格式化差异导致DOM结构不一致:

`为明确起见,收益耕作奖励包括交易手续费收入和原生代币奖励收入产生的利润。收益耕作奖励分配如下:<table><tr><td>分配给代币持有者的交易手续费收入</td><td>100%</td></tr><tr><td>分配给ZaynFi的交易手续费收入</td><td>0%</td></tr><tr><td>分配给代币持有者的原生代币奖励</td><td>80%</td></tr><tr><td>分配给ZaynFi的原生代币奖励</td><td>20%</td></tr></table>`

3. 延迟渲染至Hydration完成

通过useEffect在客户端Hydration完成后再渲染Markup组件,确保DOM仅在客户端生成:

import { useEffect, useState } from 'react';

// 组件内部状态
const [isHydrated, setIsHydrated] = useState(false);

useEffect(() => {
  setIsHydrated(true);
}, []);

// 渲染逻辑
<ol
  className={`list-[lower-roman] font-normal text-[16px]  pl-5 outside ${styles.listTerms}`}
>
  {RewardsFromInvestments.map((i) => (
    <li className={styles.listContent}>
      {isHydrated && <Markup content={i} />}
    </li>
  ))}
</ol>

4. 临时抑制Hydration警告(不推荐长期使用)

若上述方法无效,可使用suppressHydrationWarning属性临时屏蔽警告,仅用于排查问题:

<li className={styles.listContent} suppressHydrationWarning>
  <Markup content={i} />
</li>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 14:45:25