React.Children提供了处理this.props.children的工具,this.props.children可以任何数据(组件、字符串、函数等等)。React.children有5个方法:React.Children.map(),React.Children.forEach()、React.Children.count()、React.Children.only()、React.Children.toArray(),通常与React.cloneElement()结合使用来操作this.props.children。

React.Children.map()

  1.   React.Children.map()有些类似Array.prototype.map()。如果children是数组则此方法返回一个数组,如果是nullundefined则返回nullundefined。第一参数是children,即示例中的Father组件里的'hello world!'和() => <p>2333</p>函数。第二个参数是fucntionfunction的参数第一个是遍历的每一项,第二个是对应的索引。
  1. function Father({children}) {
  2. return(
  3. <div>
  4. {React.Children.map(children, (child, index) => {
  5. ...
  6. })}
  7. </div>
  8. )
  9. }
  10.  
  11. <Father>
  12. hello world!
  13. {() => <p>2333</p>}
  14. </Father>
  1.   
  1. React.Children.forEach()
      React.Children.map()一样,区别在于无返回。
  2.  
  3. React.Children.count()
  1.   React.Children.count()用来计数,返回child个数。不要用children.length来计数,如果Father组件里只有'hello world!'会返回12,显然是错误的结果。
  1. function Father({children}) {
  2. return(
  3. <div>
  4. {React.Children.count(children)}
  5. </div>
  6. )
  7. }
  8.  
  9. <Father>
  10. hello world!
  11. {() => <p>2333</p>}
  12. </Father>
  1.  
  2. React.Children.only()
      验证children里只有唯一的孩子并返回他。否则这个方法抛出一个错误。
  1. function Father({children}) {
  2. return(
  3. <div>
  4. {React.Children.only(children)}
  5. </div>
  6. )
  7. }
  8.  
  9. <Father>
  10. hello world!
  11. </Father>
  1.  
  2. React.Children.toArray()
      children转换成Array,对children排序时需要使用
  1. function Father({children}) {
  2. let children1 = React.Children.toArray(children);
  3. return(
  4. <div>
  5. {children1.sort().join(' ')}
  6. </div>
  7. )
  8. }
  9.  
  10. <Father>
  11. {'ccc'}
  12. {'aaa'}
  13. {'bbb'}
  14. </Father>
  15.  
  16. //渲染结果: aaa bbb ccc
  1.   如果不用React.Children.toArray()方法,直接写children.sort()就会报错

Example:

例如有这样的需求,完成一个操作需要3个步骤,每完成一个步骤,对应的指示灯就会点亮。

index.jsx

  1. import * as React from 'react';
  2. import * as ReactDOM from 'react-dom';
  3. import {Steps, Step} from './Steps';
  4.  
  5. function App() {
  6. return (
  7. <div>
  8. <Steps currentStep={1}> //完成相应的步骤,改变currentStep的值。如,完成第一步currentStep赋值为1,完成第二部赋值为2
  9. <Step />
  10. <Step />
  11. <Step />
  12. </Steps>
  13. </div>
  14. );
  15. }
  16. ReactDOM.render(<App />, document.getElementById('root'));

Steps.jsx

  1. import * as React from 'react';
  2. import './step.less';
  3.  
  4. function Steps({currentStep, children}) {
  5. return (
  6. <div>
  7. {React.Children.map(children, (child, index) => {
  8. return React.cloneElement(child, {
  9. index: index,
  10. currentStep: currentStep
  11. });
  12. })}
  13.   </div>
  14. );
  15. }
  16.  
  17. function Step({index, currentStep}: any) {
  18. return <div className={`indicator${currentStep >= index + 1 ? ' active' : ''}`} />;
  19. }
  20. export {Steps, Step};

steps.less

  1. .indicator {
  2. display: inline-block;
  3. width: 100px;
  4. height: 20px;
  5. margin-right: 10px;
  6. margin-top: 200px;
  7. background: #f3f3f3;
  8. &.active {
  9. background: orange;
  10. }

React.Children详解的更多相关文章

  1. jQuery笔记-jQuery筛选器children()详解

    jQuery的选择包含两种,一种是选择器,一种是筛选器.筛选器是对选择器选定的jQuery对象做进一步选择. children()是一个筛选器,顾名思义就是筛选孩子,筛选那些符合条件的孩子. 完整的格 ...

  2. React hooks详解

    此篇文章仅是对hooks入门的总结,老鸟略过吧~ React从16.8.X以后增加了一个新特性,react hooks 让我们看看这个新特性又带来了哪些惊喜呢~以下内容我们采取不同方式创建组件来进行对 ...

  3. vue和react全面对比(详解)

    vue和react对比(详解) 放两张图镇压小妖怪 本文先讲共同之处, 再分析区别 大纲在此: 共同点: a.都使用虚拟dom b.提供了响应式和组件化的视图组件 c.注意力集中保持在核心库,而将其他 ...

  4. React Native组件、生命周期及属性传值props详解

    创建组件的三种方式 第一种:通过ES6的方式创建 /** * 方式一 :ES6 */ export default class HelloComponent extends Component { r ...

  5. 4-13 Webpacker-React.js; 用React做一个下拉表格的功能: <详解>

    Rails5.1增加了Webpacker: Webpacker essentially is the decisions made by the Rails team and bundled up i ...

  6. react基本demo详解

    一.react的优势 1.React速度很快:它并不直接对DOM进行操作,引入了一个叫做虚拟DOM的概念,安插在javascript逻辑和实际的DOM之间,性能好. 2.跨浏览器兼容:虚拟DOM帮助我 ...

  7. React 实践心得:react-redux 之 connect 方法详解

    Redux 是「React 全家桶」中极为重要的一员,它试图为 React 应用提供「可预测化的状态管理」机制. Redux 本身足够简单,除了 React,它还能够支持其他界面框架.所以如果要将 R ...

  8. React—组件生命周期详解

    React—组件生命周期详解 转自 明明的博客  http://blog.csdn.net/slandove/article/details/50748473 (非原创) 版权声明:转载请注明出处,欢 ...

  9. react目录结构、demo实例详解、属性数据绑定方式

    1.目录结构 2.demo实例详解 a)创建Home.js import React, { Component } from 'react'; //创建一个组件必须要集成Component组件,且组件 ...

随机推荐

  1. 276. Paint Fence篱笆涂色

    [抄题]: There is a fence with n posts, each post can be painted with one of the k colors. You have to ...

  2. 运行jupyter

    在mac 命令行中输入 jupyter notebook 即可 https://www.datacamp.com/community/tutorials/tutorial-jupyter-notebo ...

  3. 使用python把图片存入数据库-乾颐堂

    一般情况下我们是把图片存储在文件系统中,而只在数据库中存储文件路径的,但是有时候也会有特殊的需求:把图片二进制存入数据库. 今天我们采用的是python+mysql的方式 MYSQL 是支持把图片存入 ...

  4. Python设计模式之"外观模式"实例讲解

    Python中设计模式之外观模式主张以分多模块进行代码管理而减少耦合,下面用实例来进行说明. 应用特性: 在很多复杂而小功能需要调用需求时,而且这些调用往往还有一定相关性,即一调用就是一系列的. 结构 ...

  5. sed的模式空间和保持空间

    摘自:https://blog.csdn.net/wanglelelihuanhuan/article/details/51591809 sed的模式空间和保持空间 2016年06月06日 17:15 ...

  6. understand的安装

    1.win7 64位下安装 1)下载Understand.4.0.908.x64.rar. 2)解压之,直接运行里面的Understand-4.0.908-Windows-64bit.exe. 3)选 ...

  7. 使用Selenium&PhantomJS的方式爬取代理

    前面已经爬取了代理,今天我们使用Selenium&PhantomJS的方式爬取快代理 :快代理 - 高速http代理ip每天更新. 首先分析一下快代理,如下 使用谷歌浏览器,检查,发现每个代理 ...

  8. SIGPIPE信号解析

    当服务器close一个连接时,若client端接着发数据.根据TCP协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会发出一个SIGPIPE信号给进程,告诉进程这个连接已经 ...

  9. idea 启动报错问题

    Artifact SpiderServer:war exploded: Error during artifact deployment. See server log for details. 1. ...

  10. 用word2013发布csdn博客

    目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...