【问题标题】:Define proptypes for child's props为孩子的道具定义道具类型
【发布时间】:2020-11-06 20:24:10
【问题描述】:

我想使用一个元素的子元素的道具并想要验证这些道具。

是否可以通过prop-types 实现这一点?

export default function MyComponent(props) {

  return (
      <div>
        {React.Children.map(props.children, (c, i) => {
          // Want to do something with validated c.props.somePropThatNeedValidation (if exists of course)
          // c Is not an element that I wrote so I can't validate it there
          {React.cloneElement(c, {extras})}
        }
        )}
      </div>
  )
}


MyComponent.propTypes = {
  children: PropTypes.node,
  .
  .
  .
}

【问题讨论】:

    标签: javascript reactjs dictionary children react-proptypes


    【解决方案1】:

    简短的回答,是的,但您可能不应该这样做。 :)

    Prop-types 用于定义组件的契约。有点像静态类型为你做的事情(例如,Typescript)。如果您真的想验证 children 道具,您可以编写一个自定义验证器来执行此操作。来自the docs

      // You can also specify a custom validator. It should return an Error
      // object if the validation fails. Don't `console.warn` or throw, as this
      // won't work inside `oneOfType`.
      customProp: function(props, propName, componentName) {
        if (!/matchme/.test(props[propName])) {
          return new Error(
            'Invalid prop `' + propName + '` supplied to' +
            ' `' + componentName + '`. Validation failed.'
          );
        }
      },
    

    您可以为您的孩子道具做类似的事情(只需将 customProp 替换为 children,然后根据需要进行验证。

    ^^ 话虽如此,我强烈建议不要这样做,除非绝对必要children 属性是 React 世界中一个众所周知的、专门设计的属性。由于 prop-types 实际上只是用于开发人员的健全性检查,因此您最好花几分钟时间为您的组件编写可靠的单元测试。

    我能想到的唯一有效情况是,如果您提供一个框架并希望为您的消费者提供有用的调试消息。但是,好的文档和示例通常比控制台警告 FWIW 更多。

    如果我不明白你的意图,请告诉我。

    【讨论】:

    • 感谢您的回答!我想你很了解我。我正在创建一个可重用的组件模块。其中一个组件是子组件的包装器,可以为这些子组件提供一个道具,我的包装器应该在渲染时考虑该道具。 (或者也许根本不推荐这种模式?期望开发人员将道具添加到我的包装器的孩子)。
    • 这听起来像是一种反模式。父母不应该知道自己孩子的事情。父母可以传递东西给它的孩子(想想HOC)。父母可以创建它的孩子。任何其他方式都是自找麻烦。
    • 嗯.. 我理解你的方法,但因为它是一种反模式,所以我决定尽量避免这种情况。感谢您的回复,我会接受它,因为它似乎可以实现目标。
    猜你喜欢
    • 2020-01-22
    • 2019-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-01
    • 2018-01-13
    • 2019-09-05
    • 1970-01-01
    相关资源
    最近更新 更多