【问题标题】:Extract/read React propTypes提取/读取 React propTypes
【发布时间】:2015-12-15 10:45:01
【问题描述】:

我想直观地测试 React 组件。用户可以使用表单更改组件的道具。我希望能够(例如)基于React.PropTypes.oneOf(['green', 'blue', 'yellow']) 渲染<select>

当我阅读MyComponent.propTypes 时,它返回一个由 React 定义的函数。有没有办法提取/读取道具类型?

【问题讨论】:

标签: reactjs react-proptypes


【解决方案1】:

您不能直接从propTypes 读取,因为正如您所说,它们被定义为函数。

您可以改为以中间格式定义 propTypes,从中生成 propTypes static。

var myPropTypes = {
  color: {
    type: 'oneOf',
    value: ['green', 'blue', 'yellow'],
  },
};

function processPropTypes(propTypes) {
  var output = {};
  for (var key in propTypes) {
    if (propTypes.hasOwnProperty(key)) {
      // Note that this does not support nested propTypes validation
      // (arrayOf, objectOf, oneOfType and shape)
      // You'd have to create special cases for those
      output[key] = React.PropTypes[propTypes[key].type](propTypes[key].value);
    }
  }
  return output;
}

var MyComponent = React.createClass({
  propTypes: processPropTypes(myPropTypes),

  static: {
    myPropTypes: myPropTypes,
  },
});

然后您可以通过MyComponent.myPropTypeselement.type.myPropTypes 访问您的自定义propTypes 格式。

这里有一个助手可以让这个过程变得更简单。

function applyPropTypes(myPropTypes, Component) {
  Component.propTypes = processPropTypes(myPropTypes);
  Component.myPropTypes = propTypes;
}

applyPropTypes(myPropTypes, MyComponent);

【讨论】:

  • 我希望中间步骤不是必需的,但可惜,它清晰、简单且可维护,所以为什么不...谢谢。
  • 我希望有更好的方法。我们实际上在我的团队中考虑过一个,我们会尝试一下。如果更好,我会在这里提供反馈。
  • @Vadorequest 你能想出一个解决方案吗?
  • @DanLee 不。当时应用 Alexandre 的解决方案太费时间了,所以我就忘记了。但 IMO 它是最接近的解决方案,我不喜欢使用新方式更新所有组件的必要性。我希望 React 能在某个时候提供一些东西。
  • 你可以使用 npmjs.com/package/axe-prop-types
【解决方案2】:

也许添加一个代码示例来说明您正在尝试做的事情,因为我不太明白,但您为什么要访问 propTypes? PropTypes 不包含值,而是对传递给组件的不同 props 的值类型的期望。

如果您有一个表单可以让您更改道具,我假设您将道具传递到将呈现选择组件的组件中。您可以通过道具对象访问这些道具。

如果您尝试验证可以具有不同类型形式的 propTypes,则可以使用以下内容:

optionalUnion: React.PropTypes.oneOfType([
  React.PropTypes.string,
  React.PropTypes.number,
  React.PropTypes.instanceOf(Message)
])

【讨论】:

  • 他想动态显示定义的 React 组件的propTypes,以便将组件的属性显示给最终用户。出于文档目的,我实际上也想做同样的事情。
  • 没错!不过,最近没有对此进行研究或进一步研究。
【解决方案3】:

看看:https://www.npmjs.com/package/axe-prop-types 这将允许您提取所有道具类型

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-25
    • 2018-07-01
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    相关资源
    最近更新 更多