react 16:警告:预期服务器 HTML 在 <body> 中包含匹配的 <div>

IT技术 reactjs
2021-04-11 20:26:09

升级到 React 16 后,我收到此错误消息:

warning.js:33 Warning: Expected server HTML to contain a matching <div> in <body>.

通常是什么导致此错误消息以及如何修复?

6个回答

如果您使用ReactDOM.hydrate启动 web 应用程序,您将看到此警告。

如果您的应用程序不使用服务器端渲染 ( ssr),请使用ReactDOM.render来启动。

suppressHydrationWarning={true}道具也可以是所呈现的元素所使用。然而,作为文档点,这个道具必须很少使用。更好的解决方案是使用hydrate()render() 适当地:reactjs.org/docs/react-dom.html#hydrate
2021-05-29 20:26:09
那么,这个警告有什么用呢?
2021-06-20 20:26:09

如果您正在使用 NextJS 之类的服务器端渲染,请删除最近的代码并比较您是否尝试直接访问 DOM 尚不能保证的 Component 范围内的变量。对我来说,它是:

import { i18n } from 'i18n'

export default function SomeComponent() {
    const initLanguage = i18n.language              <---- causing error

    return ...
}

如果您需要访问此类属性,请在 内访问它useEffect,以确保到document那时已经建立。它有点相当于componentDidMount()

import { i18n } from 'i18n'
import { useEffect, useState } from 'react'

export default function SomeComponent() {
    const [initlanguage, setInitLanguage] = useState('en')

    useEffect(() => setInitLanguage(i18n.language), [])

    return ...
}
@rony 看看这个答案
2021-05-28 20:26:09
嗨@Lucia,如果我想从 useSelector() 获取数据会发生什么?我不能在 useEffect 中调用钩子。我也有这个问题,它破坏了 Next.JS 中的 css。谢谢。
2021-06-21 20:26:09

如果您的 HTML 代码类似于

<table>
  <tr>

你会得到这个错误。
要绕过它,请使用 <tbody> 标签,例如

<table>
  <tbody>
    <tr>

不要忘记关闭标签!

next.js 就是这种情况
2021-05-24 20:26:09
我正在处理遗留代码,并且在长三元条件下,“else”输出是“没有找到结果......”但它<div>位于 parent 内部<ul>通过将其更改为<div>修复它<li>
2021-06-08 20:26:09

这似乎是因为 Browsersync 在客户端的正文中插入了服务器端不存在的脚本标记。因此 React 无法附加到服务器渲染。

那么解决方案是什么?
2021-06-06 20:26:09
我不使用 body 作为 React 的容器,但在补水时也遇到了这个错误。你如何解决它?
2021-06-18 20:26:09

我通过尝试const searchParams = new URLSearchParams(process.browser ? window.location.search : '')使用 material-ui SnackBar 在我的 NextJS 应用程序中的 react 组件的顶部使用 material UI 得到了这个,我能够通过将它放在一个useEffect钩子中来消除错误

整个组件供参考:

export default function SnackBarMessage() {
  const [requestLogin, setRequestLogin] = useState(false)
  const handleClose = (event, reason) => {
    if (reason === 'clickaway') {
      return
    }

    setRequestLogin(false)
  }

  useEffect(() => {
    // had to move into a useEffect hook
    const searchParams = new URLSearchParams(process.browser ? window.location.search : '')
    const hasRequestLogin = Boolean(searchParams.get('requestLogin'))
    if (hasRequestLogin) {
      setRequestLogin(true)
    }
  }, [])
  return (
    <>
      {requestLogin && (
        <Snackbar open={requestLogin} autoHideDuration={6000} onClose={handleClose}>
          <Alert onClose={handleClose} severity='error' style={{ fontSize: '18px' }} elevation={6}>
            Please Log Back In
          </Alert>
        </Snackbar>
      )}
    </>
  )
}
我在 GatsbyJS 中也遇到过这个问题。就我而言,我最终使用了 props 中的位置数据。css-tricks.com/how-to-the-get-current-page-url-in-gatsby/...
2021-06-02 20:26:09