Это официальное руководство Next.js, макет
export default function Layout({ children }) {
return <div>{children}</div>
}
Я смотрю на одно репо с макетом
import { Component, Fragment } from 'react'
const Layout = ({ children }) => {
return (
<React.Fragment>
<p>header</p>
{children}
<p>footer</p>
</React.Fragment>
);
};
export default Layout;
Каковы плюсы и минусы React Fragments?
Любой компонент должен возвращать один элемент. Есть три элемента:
<p>header</p> //1
{children} //2 +
<p>footer</p> //3
Таким образом, они будут обёрнуты каким-либо тегом (div, main и т.д.):
<div>
<p>header</p>
{children}
<p>footer</p>
</div>
отображается как:
<body>
<div>
<p>header</p>
<p>first paragraph</p>
<p>second paragraph</p>
<p>footer</p>
<div>
</body>
С фрагментом (вы можете использовать <>
или <React.Fragment>
):
<>
<p>header</p>
{children}
<p>footer</p>
</>
отображается как:
<body>
<p>header</p>
<p>first paragraph</p>
<p>second paragraph</p>
<p>footer</p>
</body>
Также удобно использовать Fragment в таблицах, когда у вас в качестве компонента одна строка — вы не нарушите разметку.
Под капотом JSX превращается в такой код:
"use strict";
const layout = ({
children
}) => {
return React.createElement(
"div", // HTML tag name or React.Fragment
null, // Props or attributes (for div)
React.createElement("p", null, "header"), // 1th children of div
children, // 2nd children of div
React.createElement("p", null, "footer") // 3rd children of div
);
};
Как видите, React.createElement()
получает три параметра, первый из них — это корень HTML tag
или Fragment
, вместо которого будет помещено его содержимое. В отличие от HTML tags
, Fragment
может иметь только атрибут key
(который также используется только React
)
Если вы используете
Fragment
, HTML-тег не будет отображаться.