zoukankan      html  css  js  c++  java
  • React-Fragments

    Fragments

    为什么需要fragments?

    先看一段错误示范的代码

    import React from 'react'
    class Table extends React.Component{
      render () {
        return(
          <table>
            <tr>
              <Cloumn></Cloumn>
            </tr>
          </table>
        )
      }
    }
    class Cloumn extends React.Component{
      render () {
        return(
          <td>1</td>
          <td>2</td>
        )
      }
    }
    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(
          <div>
            <td>1</td>
            <td>2</td>
          </div>
        )
      }
    }
    

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

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

    Fragments

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

    用法

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

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

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

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

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

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

    带key的Fragments

    function Glossary(props){
      return(
        <dl>
          {
            props.items.map(item => (
              <React.Fragment key={item.id}>
                <dt>{item.term}</dt>
                <dt>{item.description}</dt>
              </React.Fragment>
            ))
          }
        </dl>
      )
    }
    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(
        <Glossary items={user}></Glossary>
      )
    }
    export  default GlossaryShow
    
  • 相关阅读:
    bzoj4753: [Jsoi2016]最佳团体(分数规划+树形依赖背包)
    bzoj2956: 模积和(数论)
    51nod 1766 树上的最远点对(线段树)
    bzoj2621: [Usaco2012 Mar]Cows in a Skyscraper(状压DP)
    Codeforces Round #441 Div. 2题解
    bzoj4569: [Scoi2016]萌萌哒(ST表+并查集)
    iOS和Android后台机制对比
    UIApplicationDelegate 各方法回调时机
    iOS OC和JS的交互 javaScriptCore方法封装
    iOS应用的执行原理
  • 原文地址:https://www.cnblogs.com/dehenliu/p/13451733.html
Copyright © 2011-2022 走看看