React-Fragments


Fragments

为什么需要fragments?

先看一段错误示范的代码

import React from 'react'
class Table extends React.Component{
  render () {
    return(
      
) } } class Cloumn extends React.Component{ render () { return( 1 2 ) } } export default Table

当我们编译上述Cloumn的时候会抛出一个错误

Adjacent JSX elements must be wrapped in an enclosing tag. Did you want a JSX fragment <>...? 

这个错误的意思是——解析错误:相邻的JSX元素必须包装在一个封闭标签中。您是否想要JSX fragment或者<>

在使用React开发组件的时候,每一个React组件都必须返回一个根元素,如果我们将上述的Coumn组件改一下,给它添加一个根元素,如下

class Cloumn extends React.Component{
  render () {
    return(
      
1 2
) } }

这时,也会在控制台报一个错误

tr与td之间是不存在div标签的,当然我们也可以把tr移到Cloumn组件作为根元素,但是在React项目中,我们也需要组件返回多个并列标签/组件的情况,而fragments就是解决这样的问题

Fragments

逛网定义:React中常见的一个模式是一个组件返回多个元素。Fragments允许你将子列表分组,而无需向dom添加额外的节点

用法

我们可以将上述的Clomn代码改成

class Cloumn extends React.Component{
  render () {
    return(
      
        1
        2
      
    )
  }
}

这样就可以正确的输出Table了

我们也可以用段语法来实现

class Cloumn extends React.Component{
  render () {
    return(
      <>
        1
        2
      
    )
  }
}

注:短语法不支持key或属性

带key的Fragments

function Glossary(props){
  return(
    
{ props.items.map(item => (
{item.term}
{item.description}
)) }
) } const user = [ { name:'xxx', id:1, term:"des", description:'dksdoos' }, { name:'xxx', id:2, term:"des", description:'dksdoos' }, { name:'xxx', id:3, term:"des", description:'dksdoos' }, ] function GlossaryShow(){ return( ) } export default GlossaryShow