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

NextJS Hydration失败求助:服务端与客户端UI不匹配

NextJS Hydration 错误修复:初始UI与服务端渲染不匹配

报错信息

Error: Hydration failed because the initial UI does not match what was rendered on the server.
Warning: Expected server HTML to contain a matching <h1> in <h3>.

问题根源

你的代码存在HTML语义结构违规:在<h3>标签内部直接嵌套了<h1>标签。HTML规范明确要求标题元素(h1-h6)属于同级层级标签,不能互相嵌套。这种非法结构会导致服务端渲染生成的DOM与客户端Hydration校验时预期的结构不一致,从而触发报错。

具体问题出在app/page.tsx的这段代码:

<h3>{logstate==1 && <h1>LOGGED IN</h1>}</h3>
<h3>{logstate==0 && <h1>LOGGED OUT</h1>}</h3>

修复方案

你可以通过两种方式修正这个问题:

方案1:移除嵌套,调整标题层级

如果需要保留<h1>的标题层级,直接去掉外层的<h3>,改为条件渲染<h1>:

'use server'
import BtnClient from "@components/BtnClient"

const Home: React.FC = async () => {
  const logstate: number = 0;

  return (
    <div>
      <h1>MAIN PAGE: SERVER RENDER</h1>

      {logstate === 1 && <h1>LOGGED IN</h1>}
      {logstate === 0 && <h1>LOGGED OUT</h1>}

      <BtnClient />
    </div>
  );
};

export default Home;

方案2:统一层级,替换内部标签

如果需要保留<h3>的容器,把内部的<h1>替换成普通文本或非标题标签:

'use server'
import BtnClient from "@components/BtnClient"

const Home: React.FC = async () => {
  const logstate: number = 0;

  return (
    <div>
      <h1>MAIN PAGE: SERVER RENDER</h1>

      <h3>{logstate === 1 ? 'LOGGED IN' : 'LOGGED OUT'}</h3>

      <BtnClient />
    </div>
  );
};

export default Home;

补充说明

Hydration错误本质是客户端与服务端渲染的DOM结构不匹配,除了标签嵌套违规,常见诱因还包括异步数据不一致、客户端独有API在服务端执行等。本次问题属于基础的HTML结构错误,修正后即可解决报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 05:42:52