React高级指引:Fragments

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

上一节:Refs转发
下一节:高阶组件

引言

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语法。

上一节:Refs转发
下一节:高阶组件

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值