06 Fragments

Fragments

Fragments可以理解成:多个片段,多个部分(React元素返回的Fragments)

在此之前,我们开发的组件 return 的都是单个React元素,想要返回多个元素就必须使用父元素包裹这些子元素,然后返回这个父元素。

然而,这并不总是能满足要求的,例如在下述场景中,嵌套div将导致表格不能正常渲染

class Table extends React.Component {
  render() {
    return (
      <table>
        <tr>
          <Columns />
        </tr>
      </table>
    )
  }
}

class Columns extends React.Component {
  render() {
    <div>
      <td>Hello</td>
      <td>World</td>
    </div>
  }
}

// 渲染后的 <Table />输出
<table>
  <tr>
    <div>
      <td>Hello</td>
      <td>World</td>
    </div>
  </tr>
</table>

Fragments的出现解决了这样的问题,它可以让React组件返回多个元素而不需要嵌套父元素

用法

class Columns extends React.Component {
  render() {
    return (
      <React.Fragment>
        <td>Hello</td>
        <td>World</td>
      </React.Fragment>
    )
  }
}

这样table组件就可以正常的渲染了!

短语法

React提供了一种新的,更加简短的语法来声明Fragments,它看起来就是个空标签!

class Columns extends React.Component {
  render() {
    return (
      <>
        <td>Hello</td>
        <td>World</td>
      </>
    )
  }
}

你可以像用其他标签一样来使用它,但注意:它不支持key属性

带key的Fragments

使用显式的<React.Fragments>语法可以使用key属性。一个示例场景:将一个数组映射到一个Fragments数组,创建一个描述列表。

function Glossary(props) {
  return (
    <div>
      {props.items.map(item => (
        <React.Fragment key={item.id}>
          <dt>{item.term}</dt>
          <dd>{item.description}</dd>
        </React.Fragment>
      ))}
    </div>
  )
}

key是唯一可以传递给Fragment的属性,未来可能会添加其他属性,比如事件。

page2Items.add(new ItemBean("5", "死别 (手风琴)", "12key","死别-手风琴.mp3","死别 (手风琴)-12key-歌词.lrc","02:06")); page2Items.add(new ItemBean("6", "逃跑计划", "一万次悲伤","逃跑计划 - 一万次悲伤.mp3","一万次悲伤-逃跑计划-歌词.lrc","04:15")); page2Items.add(new ItemBean("7", "寻找多莉", "梅卡德尔","寻找多莉 (Single Version)-梅卡德尔.mp3","寻找多莉 (Single Version)-梅卡德尔-歌词.lrc","04:35")); page2Items.add(new ItemBean("8", "这首关于我们的歌谣", "仁科","这首关于我们的歌谣.mp3","这首关于我们的歌谣-仁科-歌词.lrc","04:01")); page1Fragment = new PageFragment(page1Items,1); page2Fragment = new PageFragment(page2Items,2); ArrayList<Fragment> fragments = new ArrayList<>(); fragments.add(page1Fragment); fragments.add(page2Fragment); navigationFragmentAdapter = new NavigationFragmentAdapter(getChildFragmentManager(), getLifecycle(), fragments); viewPager2_fragment.setAdapter(navigationFragmentAdapter);报错 page2Items.add(new ItemBean("5", "死别 (手风琴)", "12key","死别-手风琴.mp3","死别 (手风琴)-12key-歌词.lrc","02:06")); page2Items.add(new ItemBean("6", "逃跑计划", "一万次悲伤","逃跑计划 - 一万次悲伤.mp3","一万次悲伤-逃跑计划-歌词.lrc","04:15")); page2Items.add(new ItemBean("7", "寻找多莉", "梅卡德尔","寻找多莉 (Single Version)-梅卡德尔.mp3","寻找多莉 (Single Version)-梅卡德尔-歌词.lrc","04:35")); page2Items.add(new ItemBean("8", "这首关于我们的歌谣", "仁科","这首关于我们的歌谣.mp3","这首关于我们的歌谣-仁科-歌词.lrc","04:01")); page1Fragment = new PageFragment(page1Items,1); page2Fragment = new PageFragment(page2Items,2); ArrayList<Fragment> fragments = new ArrayList<>(); fragments.add(page1Fragment); fragments.add(page2Fragment); navigationFragmentAdapter = new NavigationFragmentAdapter(getChildFragmentManager(), getLifecycle(), fragments); viewPager2_fragment.setAdapter(navigationFragmentAdapter);
10-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值