React propTypes:objectOf vs shape?

DMa*_*yer 58 reactjs react-proptypes

PropTypes.objectOf和之间有什么区别PropTypes.shape?在文档中:

// An object with property values of a certain type
optionalObjectOf: PropTypes.objectOf(PropTypes.number)
Run Code Online (Sandbox Code Playgroud)

VS

// An object taking on a particular shape
optionalObjectWithShape: PropTypes.shape({
  color: PropTypes.string,
  fontSize: PropTypes.number
})
Run Code Online (Sandbox Code Playgroud)

objectOf应该何时使用,何时使用shape

djf*_*dev 103

PropTypes.objectOf 在描述属性类型相同的对象时使用.

const objectOfProp = {
  latitude: 37.331706,
  longitude: -122.030783
}

// PropTypes.objectOf(PropTypes.number)
Run Code Online (Sandbox Code Playgroud)

PropTypes.shape 在描述其键提前已知的对象时使用,并且可以表示不同的类型.

const shapeProp = {
  name: 'Jane',
  age: 25
}

// PropTypes.shape({ name: PropTypes.string, age: PropTypes.number })
Run Code Online (Sandbox Code Playgroud)

  • 好吧,`objectOf` 用于所有值都具有相同类型的字典对象。 (2认同)

Lev*_*ler 35

只是想给出一个给出以下对象的例子:

{
    petStore: {
        animals: {
           '23': { name: 'Snuffles', type: 'dog', age 13 }
           '29': { name: 'Mittens', type: 'cat', age: 7 }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

ObjectOf和Shape

当对象可以具有不同的属性名称但每个属性的一组一致属性时使用:

const animalItemShape = {
    name: PropTypes.string,
    type: PropTypes.string,
    age: PropTypes.number
}

const petStoreShape = {
    animals: PropTypes.objectOf(PropTypes.shape(animalItemShape))
}
Run Code Online (Sandbox Code Playgroud)

如您所见,animals是一个由多个属性组成的对象,每个属性都符合该animalItemShape类型.

希望能帮助到你!

  • 我刚刚再次尝试:使用 `PropTypes.objectOf(PropTypes.shape({...}))` 会出现错误的“无效道具...”红色错误,而 `PropTypes.shape({...} )` 工作完美(没有显示错误)。同样,文档说“objectOf”应该像“PropTypes.objectOf(PropTypes.number)”一样使用,并且用于“具有特定类型属性值的对象”。在我看来,不需要用“objectOf”包装“PropTypes.shape({...})”——直接使用“PropTypes.shape({...})”即可。 (3认同)
  • 我使用了 `PropTypes.objectOf(PropTypes.shape({...}))` 并且它不起作用 - 当我传递字符串时收到错误警告,说我正在“传递对象但需要字符串”。[文档](https://reactjs.org/docs/typechecking-with-proptypes.html) 说“objectOf”代表“具有某种类型属性值的对象”,如“PropTypes.number”。我认为你只需要 `PropTypes.shape({...})` 而不需要 `objectOf`,这对我有用。 (2认同)