reactjs 条件React属性类型

irlmq6kh  于 2022-12-12  发布在  React
关注(0)|答案(4)|浏览(140)

我有一个React组件,我希望强制提供两个属性中的一个-如果两个都没有提供,我希望能够触发PropType警告:

MyComponent.propTypes = {
  firstProp: PropTypes.string.isRequired, // required only if `otherProp` not provided
  otherProp: PropTypes.string.isRequired, // required only if `firstProp` not provided
}

我相信这是可能的与AirBnB的prop-types,但我想知道这是否可以做到只有React属性类型。

f45qwnt8

f45qwnt81#

Here is one用于基于 prop 的条件 prop 类型。下面是我如何在一个项目中使用它来确定广告大小 prop 类型的一个例子。

import React, { Component } from 'react';
import isRequiredIf from 'react-proptype-conditional-require';
import PropTypes from 'prop-types';

class AdSlot extends Component {
  // React component stuff
}

const slotPropTypes = PropTypes.oneOfType([
  PropTypes.string, // e.g. 'fluid'
  PropTypes.arrayOf(PropTypes.number), // e.g. [300, 250]
  PropTypes.arrayOf(PropTypes.array), // e.g. [[300, 250], [1650, 300]]
  PropTypes.arrayOf(PropTypes.oneOfType([ // e.g. ['fluid', [300, 250]]
    PropTypes.string.isRequired,
    PropTypes.array,
  ])),
]);

const responsiveSizesPropTypes = PropTypes.arrayOf(PropTypes.oneOfType([
  PropTypes.number,
  PropTypes.array,
  PropTypes.string,
]));

const doesNotHaveResponsiveSizes = props => !(props.hasOwnProperty('responsiveSizes'));
const doesNotHaveSlotSizes = props => !(props.hasOwnProperty('slotSizes'));

AdSlot.proptypes = {
  slotSizes: isRequiredIf(slotPropTypes, doesNotHaveResponsiveSizes),
  responsiveSizes: isRequiredIf(responsiveSizesPropTypes, doesNotHaveSlotSizes),
}

export default AdSlot;
kmynzznz

kmynzznz2#

请使用isRequiredIf

4年前@evcohen写了一个PR,它将isRequiredIf添加到PropTypes库中。不幸的是,即使在那个时候,他们也将PropTypes库置于维护模式,不会将其合并。
company I work for仍然使用PropTypes,因此我们派生了PropTypes库的master分支,并在中添加了此功能。
现在你可以这样做:

MyComponent.propTypes = {
  firstProp: PropTypes.string.isRequiredIf( props => !props.otherProp ), // required only if `otherProp` not provided
  otherProp: PropTypes.string.isRequiredIf( props => !props.firstProp ), // required only if `firstProp` not provided
}

超级干净,很小。
您可以在自己的项目中使用our fork,方法是使用以下内容更新您的package.json

"prop-types": "github:cntral/prop-types#isRequiredIf"
  • 注意:它不接受布尔参数,只接受传递了属性并需要返回布尔值的函数。*
1zmg4dgp

1zmg4dgp3#

这里最初的问题可能是关于JavaScript React的,但如果您正在编写TS React代码并让TypeScript检查您的props类型,则可以使用区分类型联合来描述您的需求。
第一个

dbf7pr2w

dbf7pr2w4#

您可以将此实现应用于许多不同的情况。例如,如果您传递了10个属性,但您只想接受其中的一些,则需要确定实现中的count变量

MyComponent.propTypes = {
  firstProp: PropTypes.string,
  otherProp: PropTypes.string,
  // we are destructuring the props
  checkOnlyOneVariant: ({ firstProp, otherProp }) => {
    const count = Number(!!firstProp) + Number(!!otherProp);
    // if you passed both, count will be 2. but we do not want count to be greater than 1
    if (count > 1) {
      return new Error("MyComponent accepts either of firstProp or otherProp");
    }
  },
};

相关问题