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


191

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

<Field data={data} />

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

propTypes: {
  data: React.PropTypes.object
}

但是,如果我想验证其中的值怎么办?即。data.id,data.title?

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

Answers:


359

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

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

更新资料

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

import PropTypes from 'prop-types';    

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

更多信息


1
精确答案@nilgun。您可以找到React的propTypes的文档:facebook.github.io/react/docs/reusable-components.html
wle8300 2015年

React.PropTypes现在已弃用。请PropTypesprop-types包装中使用。更多详情
克里斯(Chris

13

如果React.PropTypes.shape没有给您想要的类型检查级别,请看一下tcomb-react

它提供了一个toPropTypes()功能,使您可以利用React对定义自定义验证器的支持,使用tcomb库验证定义的模式,并使用propTypes tcomb验证

来自其文档的基本示例

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

4

要注意的是,嵌套的工作深度超过了一层。这在验证URL参数时对我很有用:

propTypes = {
  match: PropTypes.shape({
    params: PropTypes.shape({
      id: PropTypes.string.isRequired
    })
  })
};

这是否意味着id仅当存在match.params对象时才需要,还是isRequired级联,即带有道具matchparams对象才需要is 级联id?即,如果未提供任何参数,它将仍然有效吗?
S ..

这可以理解为“ match需要拥有paramsparams需要拥有id”。
datchung

嗨@datchung实际上,我后来发现(并测试了)它的读取方式,它是If match存在且If match包含params则它必须params包含一个字符串id
S ..

-7
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
    },
})

10
显然,已经为这个答案付出了很多努力,如果仅仅是代码,可能很难掌握。通常用几句话来评论解决方案。请编辑您的答案并添加一些说明。
米卡·桑德兰
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.