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

IT技术 reactjs
2021-04-22 07:39:57

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

<Field data={data} />

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

propTypes: {
  data: React.PropTypes.object
}

但是如果我想验证里面的值怎么办?IE。数据.id,数据.标题?

props[propName]: React.PropTypes.number.required // etc...
4个回答

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

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

更新

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

import PropTypes from 'prop-types';    

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

更多信息

准确答案@nilgun。你可以找到 React 的 propTypes 的文档:facebook.github.io/react/docs/reusable-components.html
2021-05-30 07:39:57
React.PropTypes现在已弃用。请改用PropTypesprop-types包中。更多在这里
2021-06-09 07:39:57

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

它提供了一个toPropTypes()功能,它可以让你验证与所定义的模式tcomb通过使用作出react的定义支持的库定制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>
    );
  }    
});

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

propTypes = {
  match: PropTypes.shape({
    params: PropTypes.shape({
      id: PropTypes.string.isRequired
    })
  })
};
这是否意味着id只有在有match.params对象时才需要,或者isRequired级联,这意味着matchisRequired 与params带有id道具对象即,如果没有提供参数,它仍然有效吗?
2021-05-28 07:39:57
嗨@datchung 实际上我已经发现(并测试了)它是如何读取的,并且 Ifmatch存在并且 If matchcontains paramsthen it is required paramscontains a string id
2021-06-01 07:39:57
这可以理解为“match需要拥有paramsparams需要拥有id”。
2021-06-06 07:39:57
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
    },
})
由于这个答案显然已经付出了很多努力,如果它只是代码,可能很难掌握。通常用几句话来评论解决方案。请编辑您的答案并添加一些解释。
2021-06-07 07:39:57