【问题标题】:Warning: Prop `className` did not match in Next.JS site with Styled Components警告:带有样式组件的 Next.JS 站点中的 Prop `className` 不匹配
【发布时间】:2021-03-30 18:14:41
【问题描述】:

我在 Stack Overflow 上搜索过类似的问题,但答案要么是旧版本,要么与我的情况无关。

页面上第一个使用样式化组件的组件出现上述错误。如果我删除该组件,我会收到下一个组件的错误,依此类推,所以我认为水合过程存在问题,并且每个类名都会发生这种情况。

我有一个 _document.tsx 文件,它扩展了 Document 类并具有以下 getInitialProps 函数

static async getInitialProps (ctx) {

    const sheet = new ServerStyleSheet()
    const originalRenderPage = ctx.renderPage

    try {

        ctx.renderPage = () =>
            originalRenderPage({
            enhanceApp: App => props => sheet.collectStyles(<App {...props} />)
        })

        const initialProps = await Document.getInitialProps(ctx)
        
        return {
            ...initialProps,
            styles: (
                <>
                    {initialProps.styles}
                    {sheet.getStyleElement()}
                </>
            )
        }
        
    } finally {
        sheet.seal()
    }
    
}

我的直觉是它与这段代码有关,因为在我升级到 Typescript(并且不得不更改我的 _app.tsx 文件)之前,我没有收到这个错误,但我不知道如何修复它。

任何帮助将不胜感激。

【问题讨论】:

  • 能否也发布您的.babelrc 文件?
  • 没有.babelrc文件,next不加了。

标签: reactjs next.js styled-components


【解决方案1】:

尝试安装babel-plugin-styled-components,然后使用以下配置将.babelrc 文件添加到项目的根目录。这可确保在补液过程中不会出现类生成不匹配的情况。

{
    "presets": ["next/babel"],
    "plugins": [["styled-components", { "ssr": true }]]
}

来自babel-plugin-styled-components's documentation

通过为每个样式化的组件添加唯一标识符,该插件避免了由于客户端和服务器上生成不同的类而导致的校验和不匹配。如果你不使用这个插件并尝试在服务器端渲染 styled-components,React 将在 rehydration 期间抱怨 HTML 属性不匹配警告。

【讨论】:

  • 好的,我试试。我还需要保留 _document.tsx 文件中的所有内容吗?
  • 只是为了添加,我添加了一个 .babelrc 文件,而不是 Babel.config.json
  • @decryptingfuture 看起来 Next.js 团队计划将此插件移植到 SWC 编译器:github.com/vercel/next.js/issues/30802。在那之前,我猜你会被 Babel 困住。
  • 谢谢,它帮助解决了我的问题! github.com/vercel/next.js/tree/canary/examples/…
  • 我阅读了 Next.js 文档部分,所以插件部分我已经尝试过了,但它抛出了一个语法错误:Unexpected token,因为我的项目中有打字稿。成功的部分是:“presets”:[“next/babel”],而不仅仅是文档中的插件部分告诉你要包含在你的 .babelrc 文件中。非常感谢,我不知道你从哪里得出的答案,但你是一个救生员。
猜你喜欢
  • 2021-01-27
  • 2019-01-18
  • 2021-11-26
  • 2019-08-01
  • 2021-06-14
  • 1970-01-01
  • 2018-04-28
相关资源
最近更新 更多