【问题标题】:React.Children.map vs children.map, what's the different?React.Children.map vs children.map,有什么不同?
【发布时间】:2019-06-10 19:19:44
【问题描述】:

React v16.2.0 中,有一个新的API 调用React.Children

我很好奇React.Children 和直接使用children 有什么区别。

例如,如果我想操纵子内容,我可以在这两种方法中都做到这一点。 example

const Child = () => (
  <div>child</div>
)

class App extends React.Component {
  render() {
    const template1 = React.Children.map(this.props.children, (child) => {
      return React.cloneElement(child);
    });

    const template2 = this.props.children.map((child) => {
      return React.cloneElement(child);
    });
    return [template1, template2];
  }
}

结果是一样的。

有人知道有什么不同吗?

或者react团队发布这个API的目的是什么。

谢谢。

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    React 组件的子节点是一个可能未定义或为空的节点。 React.Children.map 是一个实用函数,可帮助您处理不同的情况。

    React.Children.map

    对包含在此设置为 thisArg 的子项中的每个直接子项调用一个函数。如果 children 是一个数组,它将被遍历,并且将为数组中的每个孩子调用该函数。如果 children 为 null 或 undefined,此方法将返回 null 或 undefined 而不是数组。

    您应该始终使用 React.Children.map 在您的应用程序中遍历子项。当children不是数组时使用children.map会报错。

    【讨论】:

      【解决方案2】:

      请看一下这个例子,看看有什么不同

      将此粘贴​​到控制台浏览器:

      var children = null
      chidren.map(i => {return i}) // => VM370:1 Uncaught TypeError: Cannot read property 'map' of null
      React.Children.map(children, i => {return i;}) // return null
      

      结果如下:result

      所以 React.Children.map 会处理 children 为 null 或 undefined 的情况

      【讨论】:

      • 感谢您发布答案。但是,请不要发布指向其他页面的链接。在您自己的帖子中显示差异,并在那里给出解释
      • 这是图片不是其他页面,由于贡献点不够,我无法发布内嵌图片。
      【解决方案3】:

      据我所知,您的操作并没有真正的区别。但是,React.Children 提供了处理this.props.children 的实用程序。对于map 的使用,the documentation 中有一条我认为可能很有趣的评论:

      如果 children 是键控片段或数组,则会对其进行遍历

      所以他们的实现似乎比你刚刚使用 Array.prototype.map 做得更多。

      您可以阅读其他functionality React.Children provides 的内容,但它们似乎在很大程度上提供了便利功能,因此您不必担心遍历可能有孩子的孩子等等。

      【讨论】:

      • 你的回答现在似乎已经过时了,它说“如果孩子是一个片段,它将被视为一个孩子而不被遍历。”
      猜你喜欢
      • 2015-09-14
      • 2018-04-01
      • 2017-11-23
      • 2020-11-14
      • 1970-01-01
      • 2021-07-23
      • 2012-02-25
      • 1970-01-01
      • 2011-05-23
      相关资源
      最近更新 更多