ReactJs:PropTypes对于this.props.children应该是什么?

d3m*_*ing 208 jsx reactjs react-proptypes

给出一个渲染其子代的简单组件:

class ContainerComponent extends Component {
  static propTypes = {
    children: PropTypes.object.isRequired,
  }

  render() {
    return (
      <div>
        {this.props.children}
      </div>
    );
  }
}

export default ContainerComponent;
Run Code Online (Sandbox Code Playgroud)

问题:儿童道具的propType应该是什么?

当我将其设置为对象时,当我使用具有多个子元素的组件时,它会失败:

<ContainerComponent>
  <div>1</div>
  <div>2</div>
</ContainerComponent>
Run Code Online (Sandbox Code Playgroud)

警告:失败的道具类型: 提供children的类型的无效道具,预期.arrayContainerComponentobject

如果我将它设置为一个数组,如果我只给它一个孩子,它将会失败,即:

<ContainerComponent>
  <div>1</div>
</ContainerComponent>
Run Code Online (Sandbox Code Playgroud)

警告:失败的道具类型:提供给ContainerComponent的类型对象的无效道具子项,预期数组.

请指教,如果我不打算对儿童元素进行propTypes检查?

Ale*_*sky 300

利用oneOfType或尝试这样的事情PropTypes.node

import PropTypes from 'prop-types'

...

static propTypes = {
    children: PropTypes.oneOfType([
        PropTypes.arrayOf(PropTypes.node),
        PropTypes.node
    ]).isRequired
}
Run Code Online (Sandbox Code Playgroud)

要么

static propTypes = {
    children: PropTypes.node.isRequired,
}
Run Code Online (Sandbox Code Playgroud)

  • 那很有效!最简单的解决方案是`children:PropTypes.node`,它适用于两种情况.谢谢你的建议=) (17认同)
  • 唯一可以使这个答案更清楚的是,如果你包含一个类似于@ggilberth的答案的说明来解释`React.PropTypes.node`描述任何可渲染对象. (5认同)
  • 不需要数组,只需“PropTypes.node”。它处理以下更正:无、字符串、单个元素、多个元素、片段、组件。 (2认同)
  • 我需要把这个答案挂在我房间墙上的某个地方。我一次又一次地回到这里。:) (2认同)

ggi*_*rth 26

对我来说,这取决于组件.如果您知道需要填充的内容,那么您应该尝试使用以下方式专门指定或使用以下类型:

PropTypes.oneOfType 
Run Code Online (Sandbox Code Playgroud)

但是我发现,通过更多通用组件可以拥有多种类型的孩子,我很乐意使用:

PropTypes.any
Run Code Online (Sandbox Code Playgroud)

如果你想引用一个React组件,那么你将会寻找

PropTypes.element
Run Code Online (Sandbox Code Playgroud)

虽然,

PropTypes.node
Run Code Online (Sandbox Code Playgroud)

描述可以渲染的任何东西 - 字符串,数字,元素或这些东西的数组.如果这适合你,那么就是这样.

  • `Proptypes.any`是太常见的类型.Eslint对此并不满意. (6认同)
  • 如果您要使用“any”,您应该完全节省使用 propTypes 的时间。 (2认同)

小智 13

PropTypes文档具有以下内容

// Anything that can be rendered: numbers, strings, elements or an array
// (or fragment) containing these types.
optionalNode: PropTypes.node,
Run Code Online (Sandbox Code Playgroud)

因此,您可以PropTypes.node用来检查对象或对象数组

static propTypes = {
   children: PropTypes.node.isRequired,
}
Run Code Online (Sandbox Code Playgroud)


d3v*_*kit 8

这里的答案似乎并不能完全涵盖对孩子的确切检查。node而且object太宽容了,我想检查确切的元素。这是我最终使用的内容:

  • 使用oneOfType([])允许单个或儿童阵列
  • 分别用于shape和分别arrayOf(shape({}))用于单个和一组子代
  • 使用oneOf的子元素本身

最后,是这样的:

import PropTypes from 'prop-types'
import MyComponent from './MyComponent'

children: PropTypes.oneOfType([
  PropTypes.shape({
    type: PropTypes.oneOf([MyComponent]),
  }),
  PropTypes.arrayOf(
    PropTypes.shape({
      type: PropTypes.oneOf([MyComponent]),
    })
  ),
]).isRequired
Run Code Online (Sandbox Code Playgroud)

这个问题帮助我更清楚地了解了这一点:https : //github.com/facebook/react/issues/2979


And*_*uca 6

如果要完全匹配组件类型,请检查此

MenuPrimary.propTypes = {
  children: PropTypes.oneOfType([
    PropTypes.arrayOf(MenuPrimaryItem),
    PropTypes.objectOf(MenuPrimaryItem)
  ])
}
Run Code Online (Sandbox Code Playgroud)

如果您想完全匹配某些组件类型,请检查此

const HeaderTypes = [
  PropTypes.objectOf(MenuPrimary),
  PropTypes.objectOf(UserInfo)
]

Header.propTypes = {
  children: PropTypes.oneOfType([
    PropTypes.arrayOf(PropTypes.oneOfType([...HeaderTypes])),
    ...HeaderTypes
  ])
}
Run Code Online (Sandbox Code Playgroud)


Rob*_*uch 6

如果你想包含 render prop 组件:

  children: PropTypes.oneOfType([
    PropTypes.arrayOf(PropTypes.node),
    PropTypes.node,
    PropTypes.func
  ])
Run Code Online (Sandbox Code Playgroud)