React.Children详解

React Children是顶层API之一;this.props.的对象属性和组件属性是一一对应的,但是有一个例外,this.props.children是组件所有的子节点

React.Children.map

  • object React.Children.map(object children, function fn [, object context])
    *在每个直接子级调用fn函数,此处的this指的是上下文,若children是一个内嵌的数组或者对象,它将被遍历:不会传入容器对象到 fn 中。如果 children 参数是 null 或者 undefined,那么返回 null 或者 undefined 而不是一个空对象。另外,this.props.Childern的值有三种可能:a若此组件没有子节点就是undefined;b若此组件有一个子节点则数据类型:object;若此组件有多个子节点,数据类型就是Array
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
    <title>Hello React!</title>
    <script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
    <script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
    <script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
</head>
<body>

<div id="example"></div>
<script type="text/babel">
    class MyList extends React.Component {
        render() {
            return (<ul>{
                    React.Children.map(this.props.children, function(child){
                    console.log(child)  // MyList里面有节点,对这三个节点进行循环
                    return <li>child</li>;
                })
            }</ul>);
        }
    }
    ReactDOM.render(
        <MyList>
            <span>飞剑侠</span>
            <span>武尊神</span>
            <span>逆天魔</span>
        </MyList>
    ,document.getElementById('example'));

</script>

</body>
</html>

React.Children.forEach

  • React.Children.forEach(object children, function fn [, object context])
  • 遍历子元素,对每一个子元素执行回调,但不像上述的 map 那样最终返回一个新的集合
  • 类似于 React.Children.map(),但是不返回对象。
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
    <title>Hello React!</title>
    <script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
    <script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
    <script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
</head>
<body>

<div id="example"></div>
<script type="text/babel">

    class ToList extends React.Component {

        render() {
            return (<ul>{
                React.Children.forEach(this.props.children, function(child){ //无返回值,要是想封装,需要自己创建array
                    console.log(child.props, child.key)
                })
            }</ul>);
        }
    }

    ReactDOM.render(
        <ToList>
            <li key="test1">飞剑侠</li>
            <li key="test2">武尊神</li>
            <li key="test3">逆天魔</li>
        </ToList>
        ,document.getElementById('example'));

</script>

</body>
</html>

React.Children.count

  • React.Children.count(object children)
  • 返回子元素的总和
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
    <title>Hello React!</title>
    <script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
    <script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
    <script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
</head>
<body>

<div id="example"></div>
<script type="text/babel">

    class ToList extends React.Component {

        render() {
            console.log(this.props)
  
            const count = React.Children.count(this.props.children)
            return (<ul>
                <li>一共有{count}个子元素</li>
                {this.props.children}
            </ul>);
        }
    }

    ReactDOM.render(
        <ToList>
            <li>飞剑侠</li>
            <li>武尊神</li>
            <li>逆天魔</li>
        </ToList>
        ,document.getElementById('example'));

</script>

</body>
</html>

在这里插入图片描述

React.Children.only

  • object React.Children.only(object children)
  • 返回 children 中 仅有的子级。否则抛出异常。
  • 这里仅有的子级,only方法接受的参数只能是一个对象,不能是多个对象(数组)。
console.log(React.Children.only(this.props.children[0])); 
//输出对象this.props.children[0]

this.props.children

  • 上例子中打印的是this.props,this.props.children就是取出dom元素,这点很关键(自己理解)
    在这里插入图片描述

参考

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值