代码之家  ›  专栏  ›  技术社区  ›  TheDomis4

nextjs:链接元素导致水合错误

  •  0
  • TheDomis4  · 技术社区  · 6 月前

    我正在调查我页面上的许多水合错误,这些错误似乎来自我去年从旧的下一个版本迁移到最新的15.x版本。请参阅底部的截图:

    Unhandled Runtime Error Expected server HTML to contain a matching <div> in <a>.

    Uncaught Error: Hydration failed because the initial UI does not match what was rendered on the server.

    我从这些错误中了解到:客户端当前的html与我们在客户端预先计算的不匹配。

    这很奇怪,因为我在组件中使用了“use client”语句。

    我可以把所有这些都钉到一个按钮组件中,该组件使用 next/link 组件。因此,我尽可能地简化了它,但无论我如何编辑这个组件,它都会在控制台中抛出水合错误。我尝试了各种无容器元素的方法,等等:

    'use client'
    import React from 'react'
    import Link from 'next/link'
    
    const ButtonComponent = function () {
      return (
         <button>
          <Link href="/">Button</Link>
        </button>)
    }
    export default ButtonComponent
    

    然而,一旦我摆脱了 下一页/链接 在这种情况下,所有水合误差都得到了解决

    'use client'
    import React from 'react'
    
    const ButtonComponent = function () {
      return (
         <button>
          Button
        </button>)
    }
    export default ButtonComponent
    

    这不是我想要的-这应该是一个可重用的按钮,可以获取子项和href作为道具并呈现子项。

    我该如何解决这个问题?我有误解吗?

    [ screenshot of console: Hydration failed ]

    1 回复  |  直到 6 月前
        1
  •  1
  •   Ahmet Firat Keler    6 月前

    您收到此警告的原因: HTML标签嵌套不正确

    让我们看看 the official documentation

    交互式内容不能嵌套(嵌套在标记中、按钮嵌套在按钮标记中等)

    交互式内容是专门用于用户交互的内容 =>a(如果存在href属性)、音频(如果存在controls属性)、按钮、详细信息、嵌入、iframe、img(如果存在usemap属性)、输入(如果类型属性不处于隐藏状态)、标签、选择、文本区域、视频(如果存在control属性)

    在整个页面加载期间是否将其标记为客户端组件并不重要。HTML仍然在服务器上呈现,以便在客户端操作(DOM更新、附加事件监听器等)期间显示其非交互式预览

    导入组件时尝试此操作

    import dynamic from "next/dynamic"
    
    const ButtonComponentWithNoSSR = dynamic(
        () => import("../components/ButtonComponent"),// fix the path pls
        { ssr: false }
    )
    
    const Page = () => {
        return (
            <>
                <ButtonComponentWithNoSSR />
            </>
        )
    }
    

    阅读更多 How are Client Components Rendered?