首页 文章

提取/读取React propTypes

提问于
浏览
15

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

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

2 回答

  • 2

    您无法直接从 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);
    
  • 7

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

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

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

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

相关问题