此文章是翻译Fragments这篇React(版本v16.2.0)官方文档。

Fragments

React 中一个常见模式是为一个组件返回多个元素。Fragments 可以让你组织一个子元素列表,不在DOM 中增加额外节点。

  1. render() {
  2. return (
  3. <React.Fragment>
  4. <ChildA />
  5. <ChildB />
  6. <ChildC />
  7. </React.Fragment>
  8. );
  9. }

还有一个新的简短语法来声明它们,但它却不被所有流行工具支持。

Motivation

一个常见模式是为一个组件返回一个子元素列表。以这个示例的React 片段为例:

  1. class Table extends React.Component {
  2. render() {
  3. return (
  4. <table>
  5. <tr>
  6. <Columns />
  7. </tr>
  8. </table>
  9. );
  10. }
  11. }

<Columns /> 需要返回多个<td> 元素,为了渲染的HTML 有效的,。如果一个父div 用在 <Columns />render() 函数里面,那么最终的HTML 将是无效的。

  1. class Columns extends React.Component {
  2. render() {
  3. return (
  4. <div>
  5. <td>Hello</td>
  6. <td>World</td>
  7. </div>
  8. );
  9. }
  10. }

<Table /> 输出的结果是:

  1. <table>
  2. <tr>
  3. <div>
  4. <td>Hello</td>
  5. <td>World</td>
  6. </div>
  7. </tr>
  8. </table>

所以,我们引入Fragment

Usage

  1. class Columns extends React.Component {
  2. render() {
  3. return (
  4. <React.Fragment>
  5. <td>Hello</td>
  6. <td>World</td>
  7. </React.Fragment>
  8. );
  9. }
  10. }

导致正确的<Table /> 输出的结果:

Short Syntax

有一种新的较短的语法,你可以用来声明fraggments。它看起来像空标签:

  1. class Columns extends React.Component {
  2. render() {
  3. return (
  4. <>
  5. <td>Hello</td>
  6. <td>World</td>
  7. </>
  8. );
  9. }
  10. }

你可以像使用其它元素那样使用<></>,除了它不能接受key 或特性。

请注意,许多工具还不支持它,因此你可能需要显式地写<React.Fragment> 直到工具赶上为止。

Keyed Fragments

Fragments 使用明确的<React.Fragment> 语法声明可以有key。一个使用场景是映射一个集合为fragment 数组 — 例如,去创建一个描述列表:

  1. function Glossary(props) {
  2. return (
  3. <dl>
  4. {props.items.map(item => (
  5. // Without the `key`, React will fire a key warning
  6. <React.Fragment key={item.id}>
  7. <dt>{item.term}</dt>
  8. <dd>{item.description}</dd>
  9. </React.Fragment>
  10. ))}
  11. </dl>
  12. );
  13. }

key 是唯一能够传递给Fragment 的特性。未来,我们可以添加额外的特性,例如事件处理器。

Live Demo

你可以在CodePen 上尝试新的JSX framgment 语法。