首页 > 解决方案 > 有没有办法避免在 React 中有两个“根”元素?

问题描述

通常,您必须在模板中放置一个根元素,例如<div id="root"></div>. 然后使用 React/jsx,你将一个组件(及其子组件)渲染到root. 该组件(渲染时)可能看起来像这样<div id="main-wrapper">。最终渲染将有两个根,一个称为 root,一个称为 main-wrapper。有没有更简洁的方式来使用 React 进行渲染?

而不是这个:

<div id="root">
    <div id="main-wrapper>
        <section></section>
        <section></section>
        . . .
    </div>
</div>

我可以这样做吗?

<div id="root">
    <section></section>
    <section></section>
    . . .
</div>

标签: reactjsjsxreact-dom

解决方案


您可以从顶级组件而不是顶级元素返回片段:

const App = () => {
    return <>
        <section>stuff</section>
        <section>goes</section>
        <section>here</section>
    </>;
};

前:

const App = () => {
    return <div id="main-wrapper">
        <section>stuff</section>
        <section>goes</section>
        <section>here</section>
    </div>;
};

ReactDOM.render(<App/>, document.getElementById("root"));
<div id="root"></div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.2/umd/react.development.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.2/umd/react-dom.development.js"></script>

后:

// Stack overflow's Stack Snippets Babel is so massively out of date that I have to use
// <React.Fragment>...</React.Fragment> rather than <>...</>, but that's just for the
// on-site snippet.
const App = () => {
    return <React.Fragment>
        <section>stuff</section>
        <section>goes</section>
        <section>here</section>
    </React.Fragment>;
};

ReactDOM.render(<App/>, document.getElementById("root"));
<div id="root"></div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.2/umd/react.development.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.2/umd/react-dom.development.js"></script>


推荐阅读