React.Children详解
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()
- React.Children.map()有些类似Array.prototype.map()。如果children是数组则此方法返回一个数组,如果是null或undefined则返回null或undefined。第一参数是children,即示例中的Father组件里的'hello world!'和() => <p>2333</p>函数。第二个参数是fucntion,function的参数第一个是遍历的每一项,第二个是对应的索引。
- function Father({children}) {
- return(
- <div>
- {React.Children.map(children, (child, index) => {
- ...
- })}
- </div>
- )
- }
- <Father>
- hello world!
- {() => <p>2333</p>}
- </Father>
- React.Children.forEach()
跟React.Children.map()一样,区别在于无返回。- React.Children.count()
- React.Children.count()用来计数,返回child个数。不要用children.length来计数,如果Father组件里只有'hello world!'会返回12,显然是错误的结果。
- function Father({children}) {
- return(
- <div>
- {React.Children.count(children)}
- </div>
- )
- }
- <Father>
- hello world!
- {() => <p>2333</p>}
- </Father>
- React.Children.only()
验证children里只有唯一的孩子并返回他。否则这个方法抛出一个错误。
- function Father({children}) {
- return(
- <div>
- {React.Children.only(children)}
- </div>
- )
- }
- <Father>
- hello world!
- </Father>
- React.Children.toArray()
将children转换成Array,对children排序时需要使用
- function Father({children}) {
- let children1 = React.Children.toArray(children);
- return(
- <div>
- {children1.sort().join(' ')}
- </div>
- )
- }
- <Father>
- {'ccc'}
- {'aaa'}
- {'bbb'}
- </Father>
- //渲染结果: aaa bbb ccc
- 如果不用React.Children.toArray()方法,直接写children.sort()就会报错
Example:
例如有这样的需求,完成一个操作需要3个步骤,每完成一个步骤,对应的指示灯就会点亮。
index.jsx
- import * as React from 'react';
- import * as ReactDOM from 'react-dom';
- import {Steps, Step} from './Steps';
- function App() {
- return (
- <div>
- <Steps currentStep={1}> //完成相应的步骤,改变currentStep的值。如,完成第一步currentStep赋值为1,完成第二部赋值为2
- <Step />
- <Step />
- <Step />
- </Steps>
- </div>
- );
- }
- ReactDOM.render(<App />, document.getElementById('root'));
Steps.jsx
- import * as React from 'react';
- import './step.less';
- function Steps({currentStep, children}) {
- return (
- <div>
- {React.Children.map(children, (child, index) => {
- return React.cloneElement(child, {
- index: index,
- currentStep: currentStep
- });
- })}
- </div>
- );
- }
- function Step({index, currentStep}: any) {
- return <div className={`indicator${currentStep >= index + 1 ? ' active' : ''}`} />;
- }
- export {Steps, Step};
steps.less
- .indicator {
- display: inline-block;
- width: 100px;
- height: 20px;
- margin-right: 10px;
- margin-top: 200px;
- background: #f3f3f3;
- &.active {
- background: orange;
- }
React.Children详解的更多相关文章
- jQuery笔记-jQuery筛选器children()详解
jQuery的选择包含两种,一种是选择器,一种是筛选器.筛选器是对选择器选定的jQuery对象做进一步选择. children()是一个筛选器,顾名思义就是筛选孩子,筛选那些符合条件的孩子. 完整的格 ...
- React hooks详解
此篇文章仅是对hooks入门的总结,老鸟略过吧~ React从16.8.X以后增加了一个新特性,react hooks 让我们看看这个新特性又带来了哪些惊喜呢~以下内容我们采取不同方式创建组件来进行对 ...
- vue和react全面对比(详解)
vue和react对比(详解) 放两张图镇压小妖怪 本文先讲共同之处, 再分析区别 大纲在此: 共同点: a.都使用虚拟dom b.提供了响应式和组件化的视图组件 c.注意力集中保持在核心库,而将其他 ...
- React Native组件、生命周期及属性传值props详解
创建组件的三种方式 第一种:通过ES6的方式创建 /** * 方式一 :ES6 */ export default class HelloComponent extends Component { r ...
- 4-13 Webpacker-React.js; 用React做一个下拉表格的功能: <详解>
Rails5.1增加了Webpacker: Webpacker essentially is the decisions made by the Rails team and bundled up i ...
- react基本demo详解
一.react的优势 1.React速度很快:它并不直接对DOM进行操作,引入了一个叫做虚拟DOM的概念,安插在javascript逻辑和实际的DOM之间,性能好. 2.跨浏览器兼容:虚拟DOM帮助我 ...
- React 实践心得:react-redux 之 connect 方法详解
Redux 是「React 全家桶」中极为重要的一员,它试图为 React 应用提供「可预测化的状态管理」机制. Redux 本身足够简单,除了 React,它还能够支持其他界面框架.所以如果要将 R ...
- React—组件生命周期详解
React—组件生命周期详解 转自 明明的博客 http://blog.csdn.net/slandove/article/details/50748473 (非原创) 版权声明:转载请注明出处,欢 ...
- react目录结构、demo实例详解、属性数据绑定方式
1.目录结构 2.demo实例详解 a)创建Home.js import React, { Component } from 'react'; //创建一个组件必须要集成Component组件,且组件 ...
随机推荐
- 276. Paint Fence篱笆涂色
[抄题]: There is a fence with n posts, each post can be painted with one of the k colors. You have to ...
- 运行jupyter
在mac 命令行中输入 jupyter notebook 即可 https://www.datacamp.com/community/tutorials/tutorial-jupyter-notebo ...
- 使用python把图片存入数据库-乾颐堂
一般情况下我们是把图片存储在文件系统中,而只在数据库中存储文件路径的,但是有时候也会有特殊的需求:把图片二进制存入数据库. 今天我们采用的是python+mysql的方式 MYSQL 是支持把图片存入 ...
- Python设计模式之"外观模式"实例讲解
Python中设计模式之外观模式主张以分多模块进行代码管理而减少耦合,下面用实例来进行说明. 应用特性: 在很多复杂而小功能需要调用需求时,而且这些调用往往还有一定相关性,即一调用就是一系列的. 结构 ...
- sed的模式空间和保持空间
摘自:https://blog.csdn.net/wanglelelihuanhuan/article/details/51591809 sed的模式空间和保持空间 2016年06月06日 17:15 ...
- understand的安装
1.win7 64位下安装 1)下载Understand.4.0.908.x64.rar. 2)解压之,直接运行里面的Understand-4.0.908-Windows-64bit.exe. 3)选 ...
- 使用Selenium&PhantomJS的方式爬取代理
前面已经爬取了代理,今天我们使用Selenium&PhantomJS的方式爬取快代理 :快代理 - 高速http代理ip每天更新. 首先分析一下快代理,如下 使用谷歌浏览器,检查,发现每个代理 ...
- SIGPIPE信号解析
当服务器close一个连接时,若client端接着发数据.根据TCP协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会发出一个SIGPIPE信号给进程,告诉进程这个连接已经 ...
- idea 启动报错问题
Artifact SpiderServer:war exploded: Error during artifact deployment. See server log for details. 1. ...
- 用word2013发布csdn博客
目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...