引言
React一个常用的模式是组件返回多个元素。Fragment可以为你的子元素分组而不需要在DOM上为它们添加额外的节点。
render() {
return (
<React.Fragment>
<ChildA />
<ChildB />
<ChildC />
</React.Fragment>
);
}
还有一种短语法可以用来声明它们。
动机
一个常用的模式是组件返回一列子元素。让我们来看看下面这个React片段:
class Table extends React.Component {
render() {
return (
<table>
<tr>
<Columns />
</tr>
</table>
);
}
}
为了使渲染出的HTML能够有效展示,<Columns />需要返回多个<td>。但是如果<Columns />的render方法中有一个<div>作为父元素,那么最终渲染出来的HTML是无效的。
class Columns extends React.Component {
render() {
return (
<div>
<td>Hello</td>
<td>World</td>
</div>
);
}
}
最终在
中的结果是:<table>
<tr>
<div>
<td>Hello</td>
<td>World</td>
</div>
</tr>
</table>
很显然这是无效的HTML,Fragment为这一问题提供了解决方案。
用法
class Columns extends React.Component {
render() {
return (
<React.Fragment>
<td>Hello</td>
<td>World</td>
</React.Fragment>
);
}
}
上面的代码会在
中渲染出正确的代码:<table>
<tr>
<td>Hello</td>
<td>World</td>
</tr>
</table>
短语法
这里有一种短语法可以用来声明Fragment,它看起来就像是空标签:
class Columns extends React.Component {
render() {
return (
<>
<td>Hello</td>
<td>World</td>
</>
);
}
}
你可以像使用其他元素一样使用它,除了它不支持key和属性。
带key的Fragments
使用<React.Fragment>语法声明的Fragment是可以有key的。一个使用场景是将集合映射到一组Fragment数组。举个例子:创建一个描述列表:
function Glossary(props) {
return (
<dl>
{props.items.map(item => (
//如果没有key,React将会展示一个key warning
<React.Fragment key={item.id}>
<dt>{item.term}</dt>
<dd>{item.description}</dd>
</React.Fragment>
))}
</dl>
);
}
key是唯一能传递给Fragment的属性。在未来,我们可能会支持其他如事件处理器的属性。
在线Demo
你可以在CodePen中尝试这个新的Fragment语法。

本文介绍React中的Fragments组件,一种解决组件返回多个子元素问题的方法,避免在DOM中添加不必要的节点。文章详细解释了Fragments的引入背景、使用场景、语法形式及如何正确使用key。
2988





