首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在React组件PropTypes中定义所需的替代属性?

如何在React组件PropTypes中定义所需的替代属性?
EN

Stack Overflow用户
提问于 2017-05-06 06:12:40
回答 4查看 2.9K关注 0票数 5

这就是用例:组件TableGroup应该要求用户指定data属性,该属性是要在表 requestDataUrl属性中呈现的对象数组,组件将从其中获取该对象数组。简而言之,这两个属性中的一个是必需的,但不是两者都需要。如何在下面的component.propTypes对象中实现这一点?

代码语言:javascript
运行
复制
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
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-08-13 16:34:19

使用isRequiredIf

有一个4年前的按下 @evcohen将isRequiredIf添加到PropTypes库。不幸的是,即使在那个时候,他们也在将PropTypes库置于维护模式中,并且不会将它合并到其中。

我为之工作的公司仍然使用PropTypes,因此我们分叉了PropTypes库的master分支,并在其中添加了这个功能。

所以现在你可以这样做了:

代码语言:javascript
运行
复制
data:             PropTypes.array.isRequiredIf( props => !props.requestUrlSource ),
requestUrlSource: PropTypes.string.isRequiredIf( props => !props.data )

超级干净和最小。

可以在您自己的项目中使用我们的叉子,方法是使用以下内容更新您的package.json

代码语言:javascript
运行
复制
"prop-types": "github:cntral/prop-types#isRequiredIf"

注意:它不接受布尔param,只接受传递道具并需要返回布尔值的函数。

票数 2
EN

Stack Overflow用户

发布于 2017-05-06 07:08:57

要达到预期效果,请使用下面的选项

代码语言:javascript
运行
复制
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
}
票数 6
EN

Stack Overflow用户

发布于 2017-05-06 07:30:26

根据React的文档,我认为customProp应该为您完美地工作。

代码语言:javascript
运行
复制
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之后,现在可以将其用于

代码语言:javascript
运行
复制
TableGroup.propTypes = {
  data: dataOrRequest,
  requestUrlSource: dataOrRequest
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43817365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档