Props.children 和组件组成

组件的组件可在特殊支柱 props.children 上获得。这个 prop 对于合成组件非常有用,并且可以使 JSX 标记更直观或反映 DOM 的预期最终结构:

var SomeComponent = function () {
    return (
        <article className="textBox">
            <header>{this.props.heading}</header>
            <div className="paragraphs">
                {this.props.children}
            </div>
        </article>
    );
}

这允许我们在以后使用组件时包含任意数量的子元素:

var ParentComponent = function () {
    return (
        <SomeComponent heading="Amazing Article Box" >
            <p className="first"> Lots of content </p>
            <p> Or not </p>
        </SomeComponent>
    );
}

Props.children 也可以由组件操作。因为 props.children 可能是也可能不是数组 ,React 为它们提供了实用函数 React.Children 。在前面的例子中考虑一下我们是否想要将每个段落包装在自己的 <section> 元素中:

var SomeComponent = function () {
    return (
        <article className="textBox">
            <header>{this.props.heading}</header>
            <div className="paragraphs">
                {React.Children.map(this.props.children, function (child) {
                    return (
                        <section className={child.props.className}>
                            React.cloneElement(child)
                        </section>
                    );
                })}
            </div>
        </article>
    );
}

注意使用 React.cloneElement 从子 <p> 标签中删除道具 - 因为道具是不可变的,这些值不能直接更改。相反,必须使用没有这些道具的克隆。

此外,在循环中添加元素时,请注意 React 在重新渲染过程中如何协调子项 ,并强烈考虑在循环中添加的子元素中包含全局唯一的 key prop。