用形状react proptype 数组

IT技术 arrays reactjs react-proptypes
2021-03-29 16:04:25

是否有使用 proptypes 的内置方法来确保传递给组件的对象数组实际上是特定形状的对象数组?

也许是这样的?

annotationRanges: PropTypes.array(PropTypes.shape({
    start: PropTypes.number.isRequired,
    end: PropTypes.number.isRequired,
})),

我在这里错过了一些非常明显的东西吗?看来这会很受追捧。

6个回答

您可以将其React.PropTypes.shape()用作以下参数React.PropTypes.arrayOf()

// an array of a particular shape.
ReactComponent.propTypes = {
   arrayWithShape: React.PropTypes.arrayOf(React.PropTypes.shape({
     color: React.PropTypes.string.isRequired,
     fontSize: React.PropTypes.number.isRequired,
   })).isRequired,
}

请参阅文档Prop Validation部分。

更新

截至react v15.5, usingReact.PropTypes已弃用,prop-types应改用独立包

// an array of a particular shape.
import PropTypes from 'prop-types'; // ES6 
var PropTypes = require('prop-types'); // ES5 with npm
ReactComponent.propTypes = {
   arrayWithShape: PropTypes.arrayOf(PropTypes.shape({
     color: PropTypes.string.isRequired,
     fontSize: PropTypes.number.isRequired,
   })).isRequired,
}
值得注意的是,您还可以将这些作为命名导入导入。IEimport { shape } from 'prop-types';
2021-05-22 16:04:25
值得指出.isRequired. 的每个属性上的使用React.PropTypes.shape我来到这里是因为我错误地认为通过使用.isRequiredon React.PropTypes.arrayOf,我不需要它。为了实现完全覆盖验证,我实际上最终也将其直接应用于React.PropTypes.shape
2021-06-14 16:04:25
这个例子对我来说没有正确地失败验证。如果 ifarrayWithShape是 [] (一个空数组)它不会失败。如果arrayWithShape是 {}(一个对象),它确实失败了。如果 arrayWithShape[{dumb: 'something'}](一个没有正确道具的数组)它会失败。如果arrayWithShape是空数组,我需要它来验证失败我只希望它通过,如果它是一个非空数组,对象有 propscolorfontsize. 我错过了什么?
2021-06-14 16:04:25
是的,我正在做与您完全相同的事情,但是有可能仅根据需要标记您想要的键,它的功能更强大。顺便说一句,对我来说,显式总是比隐式好。
2021-06-21 16:04:25

是的,您需要在代码中使用PropTypes.arrayOf而不是PropTypes.array,您可以执行以下操作:

import PropTypes from 'prop-types';

MyComponent.propTypes = {
  annotationRanges: PropTypes.arrayOf(
    PropTypes.shape({
      start: PropTypes.string.isRequired,
      end: PropTypes.number.isRequired
    }).isRequired
  ).isRequired
}

此外如需详细了解proptypes,访问类型检查有了PropTypes 这里

将 .isRequired 添加到 PropTypes.shape 对象的原因是什么?
2021-06-16 16:04:25
@makovkastar 因为没有它,[undefined]将通过验证
2021-06-20 16:04:25

它就在……就在我的鼻子底下:

从react文档本身:https : //facebook.github.io/react/docs/reusable-components.html

// An array of a certain type
    optionalArrayOf: React.PropTypes.arrayOf(React.PropTypes.number),

有一个 ES6 速记导入,你可以参考。更具可读性和易于打字。

import React, { Component } from 'react';
import { arrayOf, shape, number } from 'prop-types';

class ExampleComponent extends Component {
  static propTypes = {
    annotationRanges: arrayOf(shape({
      start: number,
      end: number,
    })).isRequired,
  }

  static defaultProps = {
     annotationRanges: [],
  }
}
请查看我如何写出一个好的答案不鼓励仅使用代码的答案,因为它们没有解释如何解决问题中的问题。您应该更新您的答案以解释它的作用以及它如何改进此问题已有的投票答案。
2021-06-14 16:04:25

如果我要为一个特定的形状多次定义相同的 proptype,我喜欢将它抽象到一个 proptypes 文件中,这样如果对象的形状发生变化,我只需要在一个地方更改代码。它有助于使代码库变干一点。

例子:

// Inside my proptypes.js file
import PT from 'prop-types';

export const product = {
  id: PT.number.isRequired,
  title: PT.string.isRequired,
  sku: PT.string.isRequired,
  description: PT.string.isRequired,
};


// Inside my component file
import PT from 'prop-types';
import { product } from './proptypes;


List.propTypes = {
  productList: PT.arrayOf(product)
}