什么是 {this.props.children} 以及何时应该使用它?

IT技术 javascript reactjs react-redux frontend
2021-01-28 23:08:26

作为 React 世界的初学者,我想深入了解使用时会发生{this.props.children}什么以及使用相同的情况。它在下面的代码片段中有什么相关性?

render() {
  if (this.props.appLoaded) {
    return (
      <div>
        <Header
          appName={this.props.appName}
          currentUser={this.props.currentUser}
        />
        {this.props.children}
      </div>
    );
  }
}
4个回答

甚至什么是“孩子”?

React 文档说你可以props.children在代表“通用框”并且提前不知道他们的孩子的组件上使用。对我来说,这并没有真正弄清楚事情。我敢肯定,对某些人来说,这个定义很有意义,但对我来说却不是。

对它的简单解释this.props.children它用于在调用组件时显示您在开始和结束标记之间包含的任何内容。

一个简单的例子:

这是用于创建组件的无状态函数的示例。同样,由于这是一个函数,因此没有this关键字,因此只需使用props.children

const Picture = (props) => {
  return (
    <div>
      <img src={props.src}/>
      {props.children}
    </div>
  )
}

该组件包含一个<img>正在接收一些props然后显示的{props.children}

每当调用此组件{props.children}时,也将显示,这只是对组件开始和结束标记之间内容的引用。

//App.js
render () {
  return (
    <div className='container'>
      <Picture key={picture.id} src={picture.src}>
          //what is placed here is passed as props.children  
      </Picture>
    </div>
  )
}

<Picture />如果您调用它会完全打开和关闭标签,而不是使用自关闭标签调用组件,<Picture> </Picture>然后您可以在它之间放置更多代码。

这将<Picture>组件与其内容分离并使其更可重用。

参考:React 的 props.children 快速介绍

@Nimmy 使用 {props.children} 时我们没有性能问题,只需要将组件作为道具传递。当我们可以在子组件中使用 children 时不需要使用 {props.children}
2021-03-19 23:08:26
@AlpitAnand 您可以在答案末尾看到参考:|
2021-03-27 23:08:26
这解释得很好@SoroushChehresa,谢谢。文档应该更频繁地使用“简单的解释”......
2021-03-28 23:08:26
示例来自codeburst.io/...
2021-04-02 23:08:26
我喜欢你在文本中使用引号的方式。
2021-04-11 23:08:26

我假设您在 React 组件的render方法中看到了这一点,就像这样(编辑:您编辑的问题确实表明了这一点)

class Example extends React.Component {
  render() {
    return <div>
      <div>Children ({this.props.children.length}):</div>
      {this.props.children}
    </div>;
  }
}

class Widget extends React.Component {
  render() {
    return <div>
      <div>First <code>Example</code>:</div>
      <Example>
        <div>1</div>
        <div>2</div>
        <div>3</div>
      </Example>
      <div>Second <code>Example</code> with different children:</div>
      <Example>
        <div>A</div>
        <div>B</div>
      </Example>
    </div>;
  }
}

ReactDOM.render(
  <Widget/>,
  document.getElementById("root")
);
<div id="root"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

children是 React 组件的一个特殊属性,它包含在组件内定义的任何子元素,例如上面divsinside Example{this.props.children}包括渲染结果中的那些孩子。

...什么情况下使用相同

当您想直接将子元素包含在渲染输出中时,您会这样做;如果你没有。

@ssk:啊!好东西。Nimmy - 是的,您可以直接在您的 中写入孩子render,但在每种情况下它们都是相同的孩子。通过接受子元素(在适当的情况下),组件的每个实例都可以有不同的内容。我已经更新了答案中的示例。
2021-03-14 23:08:26
如果不考虑子节点的可重用性,那么从子组件调用 {props.children} 与在子组件内部使用它相比有什么性能差异吗?
2021-03-16 23:08:26
@Nimmy 我假设你在想为什么我应该把 {this.props.children} 写下来,我知道。如果是这种情况,请这样做并在性能上略有优势。但是您的组件将是静态的,它不能与代码库中不同位置的一组不同子项一起重用。
2021-03-20 23:08:26
@Nimmy:对不起,我不知道你说的 *"...而不是在子组件中使用它"是什么意思。
2021-03-30 23:08:26
我的意思是“在子组件中调用 {this.props.children} 而不是直接在相应的子组件中编写节点”。
2021-03-31 23:08:26

props.children 表示调用/渲染组件时开始和结束标记之间的内容:

const Foo = props => (
  <div>
    <p>I'm {Foo.name}</p>
    <p>abc is: {props.abc}</p>

    <p>I have {props.children.length} children.</p>
    <p>They are: {props.children}.</p>
    <p>{Array.isArray(props.children) ? 'My kids are an array.' : ''}</p>
  </div>
);

const Baz = () => <span>{Baz.name} and</span>;
const Bar = () => <span> {Bar.name}</span>;

调用/调用/渲染Foo

<Foo abc={123}>
  <Baz />
  <Bar />
</Foo>

props 和 props.children

谢谢。那要简单得多,更简洁,而且是一个有用的演示。
2021-03-29 23:08:26

这是回答,但想添加一个优化示例。您可以分解内联以仅获取特定属性而不是整个 props 对象(这意味着您不必继续编写props)。

const MyView = ({title, children}) => {
  return (
    <>
      <h1>{title}</h1>
      {children}
    </>
  );
}

然后你会像这样使用它:

import { MyView } from './MyView';

const MyParentView = () => {
  return (
    <MyView title="Hello">
      <h2>World</h2>
    </MyView>
  );
}

最终结果将是呈现出如下内容的 HTML:

<div>
  <h1>Hello</h1>
  <h2>World</h2>
</div>