首页 文章

如何验证ReactJS中嵌套对象的PropTypes?

提问于
浏览
153

我正在使用数据对象作为ReactJS中组件的道具 .

<Field data={data} />

我知道很容易验证PropTypes对象本身:

propTypes: {
  data: React.PropTypes.object
}

但是如果我想验证里面的值呢?即 . data.id,data.title?

props[propName]: React.PropTypes.number.required // etc...

3 回答

  • 288

    您可以使用 React.PropTypes.shape 来验证属性:

    propTypes: {
        data: React.PropTypes.shape({
          id: React.PropTypes.number.isRequired,
          title: React.PropTypes.string
        })
    }
    

    Update

    正如@Chris在评论中指出的那样,从React版本15.5.0开始 React.PropTypes 已经转移到包 prop-types .

    import PropTypes from 'prop-types';    
    
    propTypes: {
        data: PropTypes.shape({
          id: PropTypes.number.isRequired,
          title: PropTypes.string
        })
    }
    

    More info

  • 13

    如果 React.PropTypes.shape 没有为您提供所需的类型检查级别,请查看tcomb-react .

    它提供了一个toPropTypes()函数,它允许您通过使用React支持定义custom propTypes validators,使用tcomb-validation运行验证来验证使用tcomb库定义的模式 .

    Basic example from its docs

    // define the component props
    var MyProps = struct({
      foo: Num,
      bar: subtype(Str, function (s) { return s.length <= 3; }, 'Bar')
    });
    
    // a simple component
    var MyComponent = React.createClass({
    
      propTypes: toPropTypes(MyProps), // <--- !
    
      render: function () {
        return (
          <div>
            <div>Foo is: {this.props.foo}</div>
            <div>Bar is: {this.props.bar}</div>
          </div>
        );
      }    
    });
    
  • -6
    user: React.PropTypes.shap({
        age: (props, propName) => {
           if (!props[propName] > 0 && props[propName] > 100) {
              return new Error(`${propName} must be betwen 1 and 99`)
           }
           return null
        },
    })
    

相关问题