例如,我可以这样做:
import React from 'react';
import PanelA from './panelA.jsx';
import PanelB from './panelB.jsx';
React.render(
<PanelA />
<PanelB />,
document.body
);
React将呈现的地方:
body
PanelA
PanelB
目前我收到错误:
Adjacent JSX elements must be wrapped in an enclosing tag
在使用browserify和babelify进行转换时
答案 0 :(得分:41)
自React v16.0版本发布以来,当您在组件内部时,可以渲染组件数组,而无需将项目包装在额外元素中:
render() {
return [
<li key="one">First item</li>,
<li key="two">Second item</li>,
<li key="three">Third item</li>,
<li key="four">Fourth item</li>,
];
}
请记住只设置密钥。
在ReactDOM.render
中,您仍然无法渲染多个项目,因为react需要root。因此,您可以在ReactDOM.render
内呈现单个组件,并在内部组件中呈现项目数组。
答案 1 :(得分:33)
自版本16.2引入<React.Fragment />
(或简称<></>
)以来,您可以使用条件。这是更好的方式。
return (
<React.Fragment>
<h1>Page title</h1>
<ContentComponent />
{this.props.showFooter && (
<footer>(c) stackoverflow</footer>
)}
</React.Fragment>
)
从React 16开始,您可以从render()
方法返回组件列表。交易是你不能轻易地调整渲染,需要将key
属性添加到列表中的每个组件。
return [
<h1 key="page-title">Page</h1>,
<ContentComponent key="content" />,
<footer>(c)stackoverflow</footer>
]
在旧版本的React中,如果不将它们包装在封闭元素(标记,组件)中,则无法渲染多个组件。 例如:
return (
<article>
<h1>title</h1>
<meta>some meta</meta>
</article>
)
如果你想将它们仅仅用作一个元素,你必须从它们创建一个模块。
答案 2 :(得分:16)
只需将多个组件包装成单个标签即可。例如:
React.render(
<div>
<PanelA />
<PanelB />
</div>,
document.body
);
答案 3 :(得分:8)
在React 16之前,同一render()
中的多个顶级元素要求您将所有内容包装在父元素中(通常为<div>
):
render () {
return (
<div>
<Thing1 />
<Thing2 />
</div>
)
}
React 16引入了渲染顶级元素数组的能力(警告他们都必须有唯一的键):
render () {
return ([
<Thing1 key='thing-1' />,
<Thing2 key='thing-2' />
])
}
React 16.2引入了<Fragment>
元素,其功能与第一个示例中的<div>
完全相同,但不会在DOM上留下无意义的父<div>
:
import React, { Fragment } from 'react'
...
render () {
return (
<Fragment>
<Thing1 />
<Thing2 />
</Fragment>
)
}
它有一个简写语法,但大多数工具(例如语法高亮显示器)都不支持它:
import React from 'react'
...
render () {
return (
<>
<Thing1 />
<Thing2 />
</>
)
}
答案 4 :(得分:6)
如果您希望渲染多个组件,则需要将它们嵌套在另一个组件中,以便维护Tree-Like结构。这在Multiple Components
的文档页面上有说明最终只要顶层有一个节点就可以工作。
您只能使用一个DOM元素,例如<div>
<div>
<PanelA />
<PanelB />
</div>
然而,当您创建更复杂的应用程序并拥有更多的链接组件时,您可能会发现最好将子组件包装在父组件中,如此
import React from 'react';
import PanelA from './panelA.jsx';
import PanelB from './panelB.jsx';
var PanelHolder = React.createClass({
render: function() {
return (
<div>
<PanelA />
<PanelB />
</div>
)
}
});
然后在你的主js文件中,你会这样做:
import React from 'react';
import PanelHolder from './panelHolder.jsx';
React.render(
<PanelHolder />
document.body
);
答案 5 :(得分:1)
this.propsTextBox.value = this._context.parameters.textBoxProperty.raw || "";
var elements = new Array<React.SFCElement<any>>();
elements.push(React.createElement(
TextField,
this.propsTextBox
));
elements.push(React.createElement(
Label,
this.propsLabel
));
ReactDOM.render(
elements,
this._container
);
答案 6 :(得分:0)
您也可以这样做。
const list = [item1, item2]
const elements = (
<div>
{list.map(element => element)}
</div>
);
ReactDOM.render(elements, document.body);
答案 7 :(得分:0)
React.render(
<PanelA>
<PanelB />
</PanelA>
document.body
);