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

Posted

技术标签:

【中文标题】警告:预期的服务器 HTML 在 <div> 中包含匹配的 <body>【英文标题】:Warning: Expected server HTML to contain a matching <body> in <div> 【发布时间】:2020-07-04 21:59:48 【问题描述】:

我在控制台中收到上述警告。我不明白为什么。我在index.js 文件中有两个匹配的&lt;body&gt; 标签。完整的警告是 -

Warning: Expected server html to contain a matching <body> in <div>.
    in body (at pages/index.js:12)
    in div (at pages/index.js:11)
    in div (at pages/index.js:7)
    in Index (at _app.js:8)
    in MyApp
    in Container (created by AppContainer)
    in AppContainer

按照我正在使用的 index.js 文件。我正在使用 Next.js 和 tailwindcss。

import Head from "next/head"
import SideNavbar from "../components/SideNavbar"
import MainPage from "../components/MainPage"

const Index = () => 
  return (
    <div className="mx-auto">
      <Head>
        <title>Manchester United</title>
      </Head>
      <body className="min-h-screen">
        <div className="flex flex-row">
          <SideNavbar />
          <MainPage>
            <div className="text-center px-2 py-6 text-5xl font-bold text-gray-200">
              Manchester United
            </div>
          </MainPage>
        </div>
      </body>
    </div>
  )


export default Index

如果我用&lt;div&gt; 标记替换&lt;body&gt; 标记,警告就会消失。我使用的两个自定义组件&lt;SideNavbar /&gt;&lt;MainPage /&gt;,没有使用任何&lt;body&gt; 标签。

【问题讨论】:

在你的 _document.js 中你必须有 div 即&lt;body&gt; &lt;Main /&gt; &lt;NextScript /&gt; &lt;/body&gt; 所以Main 不能通过你的 _app.js 有另一个 body 标签 我没有_document.js 文件。我使用npm init next-app 创建了这个应用程序。我确实有一个 _app.js 文件,我必须创建它才能使用 tailwindcss。 【参考方案1】:

随着 React 的工作,您的 React 应用程序被“注入”到您在 ReactDOM.render 定义的 HTML 元素中:

ReactDOM.render(<App />, document.getElementById('root'));

但是,这个元素已经是&lt;body&gt;元素的子元素了。

警告:validateDOMNesting(...)&lt;body&gt; 不能作为&lt;div&gt; 的子项出现。

您的错误只是同一事物的变体,但作为服务器端呈现 (Next.js) 错误。


通过使用Next.js此 HTML 对您隐藏(检查所附代码和框中“vanilla”示例中的 HTML)。

另外,您可以在开发工具中的source 选项卡中检查 DOM 树,您会注意到存在两个&lt;body&gt; 元素。

这是一个演示错误的小代码框代码:

【讨论】:

啊!所以,我不需要在任何地方使用&lt;body&gt; 标签。我可以继续使用&lt;div&gt;,因为&lt;body&gt; 已经封装了所有内容,对吧?【参考方案2】:

您的 HTML 不正确。 div-Tag 内不能有 body-Tag。一个基本的 HTML 结构如下所示

<html>
<head>
<title>Page Title</title>
</head>
<body>

<h1>My First Heading</h1>
<p>My first paragraph.</p>
<div></div>

</body>
</html>

【讨论】:

我明白了。但在反应中,return 语句应该包含在一个 &lt;div&gt; 元素中。否则我会得到一个编译错误。我在上面的代码中删除了Index 组件中最上面的&lt;div&gt;,然后我得到了以下错误-SyntaxError: /home/akshaj/projects_js/man-utd-explorer/pages/index.js: Adjacent JSX elements must be wrapped in an enclosing tag. Did you want a JSX fragment &lt;&gt;...&lt;/&gt;? (10:6) @theairbend3r 您不能从反应组件返回 多个 *** html 标记/组件。为了解决这个问题,您可以使用&lt;React.Fragment&gt;...&lt;/React.Fragment&gt; 将多个标签包装在一个有效的“无操作”标签中。

以上是关于警告:预期的服务器 HTML 在 <div> 中包含匹配的 <body>的主要内容,如果未能解决你的问题,请参考以下文章

Next.js - 预期的服务器 HTML 在 <div> 中包含匹配的 <div>

警告:清理不安全的样式值 url

Knockoutjs div 绑定没有按预期工作

警告:validateDOMNesting(...): <div> 不能作为 <p> 的后代出现

animate() 和 fadeIn() 无法按预期工作

HTML DIV 上面 DIV 里面 DIV