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

React+Next.js报错:expected server html to contain a matching a in a求助

解决Next.js中"expected server html to contain a matching a in a"错误

这个错误的核心原因是HTML不允许嵌套<a>标签,你的代码里大概率出现了<a>标签嵌套的情况,导致服务端渲染的HTML和客户端 hydration 时的结构不匹配。

看你提供的代码片段,问题出在第二个使用legacyBehavior的Link组件上:

<Link href="/" legacyBehavior>
  <StyledLink>Home</StyledLink>
</Link>

如果StyledLink是基于<a>标签创建的样式组件(比如用styled-components写的const StyledLink = styled.a),那么带legacyBehavior的Link会自动生成一个<a>标签,形成<a><a>Home</a></a>的嵌套结构,这直接违反了HTML规则,触发错误。

修复方案:

  • 若项目用的是Next.js v13+的Pages Router,直接去掉legacyBehavior,改成Link包裹原生<a>标签的写法:
    <Link href="/">
      <StyledLink>Home</StyledLink>
    </Link>
    
    (注意此时StyledLink必须是基于<a>的组件,Link仅做路由跳转处理,不会额外生成a标签)
  • 若StyledLink不需要是<a>标签,把它改成基于span或div的样式组件,避免嵌套:
    // 修改StyledLink的定义
    const StyledLink = styled.span`
      /* 你的样式 */
      cursor: pointer;
    `;
    
    // 使用时
    <Link href="/" legacyBehavior>
      <StyledLink>Home</StyledLink>
    </Link>
    
  • 若项目用的是Next.js v13+的App Router,不需要legacyBehavior,直接用Link包裹元素即可,无需内部的<a>标签:
    <Link href="/" style={/* 你的样式 */}>
      <StyledLink>Home</StyledLink>
    </Link>
    
    (此时StyledLink可以是任意可点击元素,Link会处理路由跳转)

另外,排查项目中其他Link组件的用法,确保没有其他地方出现<a>标签嵌套的情况,这是触发这类服务端/客户端结构不匹配错误的常见原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 12:50:04