React Fragment介绍与使用详解


Posted in Javascript onNovember 11, 2021

前言

在向 DOM 树批量添加元素时,一个好的实践是创建一个document.createDocumentFragment,先将元素批量添加到
DocumentFragment 上,再把 DocumentFragment 添加到 DOM 树,减少了 DOM操作次数的同时也不会创建一个新元素。

和 DocumentFragment 类似,React 也存在 Fragment 的概念,用途很类似。在 React 16之前,Fragment 的创建是通过扩展包 react-addons-create-fragment 创建,而 React 16 中则通过<React.Fragment></React.Fragment> 直接创建 ‘Fragment'。

Fragments出现动机

一种常见模式是组件返回一个子元素列表。以此 React 代码片段为例:

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

< Columns /> 需要返回多个 元素以使渲染的 HTML 有效。如果在 < Columns /> 的 render() 中使用了父 div,则生成的 HTML 将无效。

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

得到一个 < Table /> 输出:

<table>
  <tr>
    <div>
      <td>Hello</td>
      <td>World</td>
    </div>
  </tr>
</table>

Fragments 由此出现解决了这个问题。

React Fragment介绍与使用

React.Fragment 组件能够在不额外创建 DOM 元素的情况下,让 render() 方法中返回多个元素。一个常见模式是一个组件返回多个元素。Fragments 允许你将子列表分组,而无需向 DOM 添加额外节点。

理解起来就是在我们定义组件的时候return里最外层包裹的div往往不想渲染到页面,那么就要用到我们的Fragment组件了。就和vue的<template ></ template >.

render() {
  return (
    <React.Fragment>
      Some text.
      <h2>A heading</h2>
    </React.Fragment>
  );
}

你也可以使用其简写语法 <></>。

render() {
  return (
    <>
      Some text.
      <h2>A heading</h2>
    </>
  );
}

另外react 16开始, render支持返回数组,知道这个特性的人不在少数。这一特性已经可以减少不必要节点嵌套。

import React from 'react';

export default function () {
    return [
        <div>1</div>,
        <div>2</div>,
        <div>3</div>
    ];
}

<React.Fragment> 与 <>区别

<></> 语法不能接受键值或属性,<React.Fragment>可以。

使用显式 <React.Fragment> 语法声明的片段可能具有 key。一个使用场景是将一个集合映射到一个 Fragments 数组 - 举个例子,创建一个描述列表:

function Glossary(props) {
  return (
    <dl>
      {props.items.map(item => (
        // 没有`key`,React 会发出一个关键警告
        <React.Fragment key={item.id}>
          <dt>{item.term}</dt>
          <dd>{item.description}</dd>
        </React.Fragment>
      ))}
    </dl>
  );
}

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

注意:简写形式<></>,但目前有些前端工具支持的还不太好,用 create-react-app 创建的项目可能就不能通过编译。所以遇到这种情况很正常。

到此这篇关于React Fragment介绍与使用详解的文章就介绍到这了,更多相关React Fragment内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
jQuery 加上最后自己的验证
Nov 04 Javascript
jQuery之选择组件的深入解析
Jun 19 Javascript
ie7+背景透明文字不透明超级简单的实现方法
Jan 17 Javascript
js实现不提交表单获取单选按钮值的方法
Aug 21 Javascript
js实现select下拉框菜单
Dec 08 Javascript
JavaScript资源预加载组件和滑屏组件的使用推荐
Mar 10 Javascript
Angular实现双向折叠列表组件的示例代码
Nov 21 Javascript
js中document.write和document.writeln的区别
Mar 11 Javascript
vue 权限认证token的实现方法
Jul 17 Javascript
深入理解Vue父子组件生命周期执行顺序及钩子函数
Aug 12 Javascript
atom-design(Vue.js移动端组件库)手势组件使用教程
May 16 Javascript
微信小程序点击保存图片到本机功能
Dec 13 Javascript
在js中修改html body的样式
Nov 11 #Javascript
用JS创建一个录屏功能
JavaScript数组 几个常用方法总结
Nov 11 #Javascript
JavaScript 事件捕获冒泡与捕获详情
JavaScript 定时器详情
Nov 11 #Javascript
使用javascript解析二维码的三种方式
Nov 11 #Javascript
实现一个简单得数据响应系统
Nov 11 #Javascript
You might like
基于PHP与XML的PDF文档生成技术
2006/10/09 PHP
php循环输出数据库内容的代码
2008/05/24 PHP
计算php页面运行时间的函数介绍
2013/07/01 PHP
php gd等比例缩放压缩图片函数
2016/06/12 PHP
深入理解PHP JSON数组与对象
2016/07/19 PHP
php实现通过soap调用.Net的WebService asmx文件
2017/02/27 PHP
javascript 主动派发事件总结
2011/08/09 Javascript
分享一个用Mootools写的鼠标滑过进度条改变进度值的实现代码
2011/12/12 Javascript
如何使Chrome控制台支持多行js模式——意外发现
2013/06/13 Javascript
jquery+javascript编写国籍控件
2015/02/12 Javascript
jQuery实现带分组数据的Table表头排序实例分析
2015/11/24 Javascript
bootstrap实现动态进度条效果
2017/03/08 Javascript
AngularJS 霸道的过滤器小结
2017/04/26 Javascript
你点的 ES6一些小技巧,请查收
2018/04/25 Javascript
js获取浏览器地址(获取第1个斜杠后的内容)
2019/09/03 Javascript
Vue+iview+webpack ie浏览器兼容简单处理
2019/09/20 Javascript
[48:56]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 VG vs KG
2018/03/31 DOTA
操作Windows注册表的简单的Python程序制作教程
2015/04/07 Python
Python使用urllib2模块实现断点续传下载的方法
2015/06/17 Python
Python操作MongoDB详解及实例
2017/05/18 Python
python使用opencv读取图片的实例
2017/08/17 Python
利用numpy实现一、二维数组的拼接简单代码示例
2017/12/15 Python
Python模块文件结构代码详解
2018/02/03 Python
Python读写zip压缩文件的方法
2018/08/29 Python
windows下搭建python scrapy爬虫框架步骤
2018/12/23 Python
用OpenCV将视频分解成单帧图片,图片合成视频示例
2019/12/10 Python
TENSORFLOW变量作用域(VARIABLE SCOPE)
2020/01/10 Python
python 绘制场景热力图的示例
2020/09/23 Python
实体的生命周期
2013/08/31 面试题
学雷锋标兵事迹材料
2014/08/18 职场文书
国家助学金感谢信
2015/01/21 职场文书
创业计划书之健康营养产业
2019/10/15 职场文书
请学会珍惜眼前,因为人生没有下辈子!
2019/11/12 职场文书
SQL Server中交叉联接的用法详解
2021/04/22 SQL Server
Redis缓存-序列化对象存储乱码问题的解决
2021/06/21 Redis
Python matplotlib多个子图绘制整合
2022/04/13 Python