通过自定义检查扩展反应道具类型验证

时间:2019-07-31 17:35:26

标签: reactjs react-proptypes

我正在尝试对组件中的 array prop 的propTypes进行验证。我的propTypes验证看起来像这样

Foo.propTypes = {
 columns: PropTypes.arrayOf(
    PropTypes.shape({
      identifier: PropTypes.string,
      displayName: PropTypes.string,
      type: PropTypes.string,
      align: PropTypes.oneOf(['right', 'left', 'center']),
      sort: PropTypes.bool
    })
  )
}

现在,我想通过自定义验证来扩展此验证,方法是验证 sort 属性的列数组中只有一个值应为true

我有一个选择是编写整个列数组的自定义验证,该验证将执行PropTypes.arrayOfPropTypes.shape验证,然后执行sort验证并抛出error或{ {1}}

但是我不想做任何工作,并且想利用内置的null进行所有验证,然后添加我的自定义验证

2 个答案:

答案 0 :(得分:1)

prop-types用于运行时类型检查,您要完成的工作不在该领域之内,而更像是数据验证。即使可能,我也不建议使用prop-types。

我特别要警告这一点,因为道具类型只会在发展中发出警告。如果您的数据无效,我想您会想要更多的结果,例如取消设置除一列之外的所有列的排序,或向用户显示内容。

答案 1 :(得分:1)

您也可以在自定义验证程序中使用PropTypes软件包。所以用下面的代码解决了我的问题

Foo.propTypes = {
 columns: function(propValue, key, componentName, location, propFullName) {
    PropTypes.arrayOf(
      PropTypes.shape({
        identifier: PropTypes.string,
        displayName: PropTypes.string,
        type: PropTypes.string,
        align: PropTypes.oneOf(['right', 'left', 'center']),
        sort: PropTypes.bool
      })
    );
    if (propValue.columns.filter(i => i.sort === true).length > 1) {
      return new Error(
        `Invalid prop ${propFullName} supplied to ${componentName}. Only single object can have sort value as true`
      );
    }
    return null;
  }
}