Answers:
您可以将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,
}
请参阅文档的“ 验证属性”部分。
更新
从开始react v15.5
,React.PropTypes
不推荐使用using ,而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,
}
arrayWithShape
为[](空数组),则不会失败。如果arrayWithShape
是{}(一个对象),则它确实会失败。如果 arrayWithShape
是[{dumb: 'something'}]
(没有正确道具的数组),它将失败。如果它arrayWithShape
是一个空数组,我需要它使验证失败。我只希望它通过的对象是带有props color
和的对象的非空数组时通过fontsize
。我想念什么?
是的,您需要使用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 这里
[undefined]
它将通过验证
在我的鼻子下面...
来自react docs本身: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: [],
}
}
如果我要为一个特定形状多次定义相同的原型,我喜欢将其抽象到一个原型文件中,这样,如果对象的形状发生变化,我只需要在一个地方更改代码即可。它有助于使代码库变干一点。
例:
// 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)
}
这也是我防止空数组的解决方案:
import React, { Component } from 'react';
import { arrayOf, shape, string, number } from 'prop-types';
ReactComponent.propTypes = {
arrayWithShape: (props, propName, componentName) => {
const arrayWithShape = props[propName]
PropTypes.checkPropTypes({ arrayWithShape:
arrayOf(
shape({
color: string.isRequired,
fontSize: number.isRequired,
}).isRequired
).isRequired
}, {arrayWithShape}, 'prop', componentName);
if(arrayWithShape.length < 1){
return new Error(`${propName} is empty`)
}
}
}
.isRequired
对的每个属性的使用React.PropTypes.shape
。我到达这里是因为我错误地认为通过使用.isRequired
onReact.PropTypes.arrayOf
,我不需要在里面使用它。为了获得完整的覆盖范围验证,实际上我最终也直接将其应用了React.PropTypes.shape
。