【问题标题】:Get list of optional props of a component in reactjs在 reactjs 中获取组件的可选道具列表
【发布时间】:2017-10-10 14:13:21
【问题描述】:

有没有办法获取引用可选属性(即未指定为必需)的任何 propTypes 的密钥?

例如,给定以下道具:

TestComponent.propTypes = {
    requiredProp: PropTypes.string.isRequired,
    optionalProp: PropTypes.func,
    optionalProp2: PropTypes.element
}

...我可以得到一个包含项目的数组吗:["optionalProp", "optionalProp2"]

如果没有内置的方法来做到这一点,是否有一个优雅的解决方案:

  1. 避免对它们的列表进行硬编码
  2. 避免从已实现此功能的自定义类派生
  3. 可以在我所有的 react 组件中使用

我正在考虑使用上下文来定义这样一个函数,然后像这样在当前组件上调用它:this.context.getOptionalProps.call(this)

但这似乎是对上下文的不好使用。

【问题讨论】:

  • 您使用的是react@15 PropTypes 还是新的prop-types 包?您可以通过 this.constructor.propTypes 访问 PropTypes,但将其与 isRequired 属性匹配可能会很困难
  • @CodingIntrigue 我正在使用新的prop-types 包,如果有帮助的话

标签: javascript reactjs ecmascript-6


【解决方案1】:

更新:以下解决方案仅适用于process.env.NODE_ENV !== 'production' 谨慎使用或不要使用

没有经过彻底测试,但我设法过滤掉了所需的道具键,并获得了一组可选道具,如下所示:

  /**
   * Given a PropTypes Object returns an array of optional
   * prop keys.
   *
   * @param propTypes
   */
  const optionalProps = propTypes => Object.keys(propTypes).filter(k => propTypes[k].isRequired);

  // console.log(optionalProps(TestComponent.PropTypes) output:
  // Array [
  //   "optionalProp",
  //   "optionalProp2",
  // ]

然后只需将其导出并导入以在您的 React 应用程序中的任何位置使用。

【讨论】:

  • 他工作吗?我很确定它至少不适用于 prop-types 包,因为 isRequired 返回一个函数
  • 我尝试使用 prop-types 包,它似乎工作正常。如果它没有经过彻底测试,我会更新答案以反映这一点。
  • 它只是为我返回了所有属性,不管 isRequired。看到这个RunKit example
  • 啊,看起来它在NODE_ENV !== 'production' 时有效,这就解释了为什么它对我有效。看到这个RunKit example
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-14
  • 1970-01-01
  • 1970-01-01
  • 2020-11-19
  • 1970-01-01
相关资源
最近更新 更多