React.Children
是顶层API之一,为处理 this.props.children
这个封闭的数据结构提供了有用的工具。
this.props
对象的属性与组件的属性一一对应,但是有一个例外,就是 this.props.children
属性。它表示组件的所有子节点。
1.React.Children.map
我们已经知道React.Children是为了处理this.props.children准备的,
React.Children.map他就是为了遍历我们的子节点,这样才可以加入一些功能(比如事件处理):
import React from 'react'; import ReactDOM from 'react-dom'; import './index.css'; import registerServiceWorker from './registerServiceWorker'; //设置组件 class Slot extends React.Component { render() { return <div> { React.Children.map(this.props.children,function (child) { return <div>{child}</div>; }) } </div> } } ReactDOM.render( <div> <Slot><span>分发内容1</span><span>分发内容2</span><span>分发内容3</span></Slot> </div>,document.getElementById('root') ); registerServiceWorker();
React.Children.map循环我们的this.props.children,在回调会得到child对象,render会自己解析。
2.为什么使用React.Children.map
拿上面的举例子,我们分发含有三个子节点,我想给第一个子节点加一个点击事件,这样我们的React.Children.map的作用就体现出来了:
import React from 'react'; import ReactDOM from 'react-dom'; import './index.css'; import registerServiceWorker from './registerServiceWorker'; //设置组件 class Slot extends React.Component { alertval() { alert("我是第一个") } render() { return <div> { React.Children.map(this.props.children,function (child,index) { if(index===0){ return <div onClick={this.alertval}>{child}索引{index}</div>; }else{ return <div>{child}索引{index}</div>; } }.bind(this)) } </div> } } ReactDOM.render( <div> <Slot><span>分发内容1</span><span>分发内容2</span><span>分发内容3</span></Slot> </div>,document.getElementById('root') ); registerServiceWorker();
这里是注意点,避免this的指向问题,我们必须给map的回调函数bind一次:
这时候我们的第一个子节点有事件,其他的节点没有事件。
我们可以console.log(child)加入更多处理判断。