提取/读取React propTypes

时间:2015-12-15 10:45:02

标签: reactjs react-proptypes

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

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

3 个答案:

答案 0 :(得分:6)

您无法直接从propTypes阅读,因为正如您所说,它们被定义为函数。

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

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);

答案 1 :(得分:2)

也许添加一个代码示例,说明您要尝试做什么,因为我不太了解,但为什么要访问propTypes? PropTypes不包含值,而是期望您的值类型应该是传递给组件的不同道具的类型。

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

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

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

答案 2 :(得分:0)

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