这就是用例:组件TableGroup
应该要求用户指定data
属性,该属性是要在表或 requestDataUrl
属性中呈现的对象数组,组件将从其中获取该对象数组。简而言之,这两个属性中的一个是必需的,但不是两者都需要。如何在下面的component.propTypes
对象中实现这一点?
TableGroup.propTypes = {
fieldNames: React.PropTypes.array.isRequired,
dataFields: React.PropTypes.array.isRequired,
uniqueField: React.PropTypes.string.isRequired,
data: React.PropTypes.array,
requestUrlSource: http://someurl/api/resource
}
发布于 2020-08-13 16:34:19
使用isRequiredIf
。
有一个4年前的按下 @evcohen将isRequiredIf
添加到PropTypes库。不幸的是,即使在那个时候,他们也在将PropTypes库置于维护模式中,并且不会将它合并到其中。
我为之工作的公司仍然使用PropTypes,因此我们分叉了PropTypes库的master
分支,并在其中添加了这个功能。
所以现在你可以这样做了:
data: PropTypes.array.isRequiredIf( props => !props.requestUrlSource ),
requestUrlSource: PropTypes.string.isRequiredIf( props => !props.data )
超级干净和最小。
可以在您自己的项目中使用我们的叉子,方法是使用以下内容更新您的package.json
:
"prop-types": "github:cntral/prop-types#isRequiredIf"
注意:它不接受布尔param,只接受传递道具并需要返回布尔值的函数。
发布于 2017-05-06 07:08:57
要达到预期效果,请使用下面的选项
function dataOrRequest(props, propName, componentName) {
return (!props.hasOwnProperty('data') &&
!props.hasOwnProperty('requestUrlSource'))
&& new Error(`Either "data" or "requestUrlSource" is required`);
}
TableGroup.propTypes = {
fieldNames: React.PropTypes.array.isRequired,
dataFields: React.PropTypes.array.isRequired,
uniqueField: React.PropTypes.string.isRequired,
data: dataOrRequest,
requestUrlSource: dataOrRequest
}
发布于 2017-05-06 07:30:26
根据React的文档,我认为customProp
应该为您完美地工作。
dataOrRequest: function(props, propName, componentName) {
function checkDataOrRequest() {
return (!props.hasOwnProperty('data')
&& !props.hasOwnProperty('requestUrlSource'))
&& new Error(`Either "data" or "requestUrlSource" is required`);
}
function checkTypes() {
if ((propName === 'data' && props.constructor !== Array) ||
(propName === 'requestUrlSource' && props.constructor !== String)) {
return new Error(
'Invalid prop `' + propName + '` supplied to' +
' `' + componentName + '`. Validation failed.'
);
}
return false;
}
return checkDataOrRequest() && checkTypes();
}
在声明自定义验证fn之后,现在可以将其用于
TableGroup.propTypes = {
data: dataOrRequest,
requestUrlSource: dataOrRequest
}
https://stackoverflow.com/questions/43817365
复制相似问题