【React系列】Props 验证

react

Props 验证使用 propTypes,它可以保证我们的应用组件被正确使用,React.PropTypes 提供很多验证器 (validator) 来验证传入数据是否有效。当向 props 传入无效数据时,JavaScript 控制台会抛出警告。

常见的验证器:

React.createClass({

propTypes: {

// 可以声明 prop 为指定的 JS 基本数据类型,默认情况,这些数据是可选的

optionalArray: React.PropTypes.array,

optionalBool: React.PropTypes.bool,

optionalFunc: React.PropTypes.func,

optionalNumber: React.PropTypes.number,

optionalObject: React.PropTypes.object,

optionalString: React.PropTypes.string,

// 可以被渲染的对象 numbers, strings, elements 或 array

optionalNode: React.PropTypes.node,

// React 元素

optionalElement: React.PropTypes.element,

// 用 JS 的 instanceof 操作符声明 prop 为类的实例。

optionalMessage: React.PropTypes.instanceOf(Message),

// 用 enum 来限制 prop 只接受指定的值。

optionalEnum: React.PropTypes.oneOf(['News', 'Photos']),

// 可以是多个对象类型中的一个

optionalUnion: React.PropTypes.oneOfType([

React.PropTypes.string,

React.PropTypes.number,

React.PropTypes.instanceOf(Message)

]),

// 指定类型组成的数组

optionalArrayOf: React.PropTypes.arrayOf(React.PropTypes.number),

// 指定类型的属性构成的对象

optionalObjectOf: React.PropTypes.objectOf(React.PropTypes.number),

// 特定 shape 参数的对象

optionalObjectWithShape: React.PropTypes.shape({

color: React.PropTypes.string,

fontSize: React.PropTypes.number

}),

// 任意类型加上 `isRequired` 来使 prop 不可空。

requiredFunc: React.PropTypes.func.isRequired,

// 不可空的任意类型

requiredAny: React.PropTypes.any.isRequired,

// 自定义验证器。如果验证失败需要返回一个 Error 对象。不要直接使用 `console.warn` 或抛异常,

// 因为这样 `oneOfType` 会失效。

customProp: function(props, propName, componentName) {

if (!/matchme/.test(props[propName])) {

return new Error('Validation failed!');

}

}

}

});

注意: React.PropTypes 自 React v15.5 起已弃用。请使用 prop-types 库代替。

import PropTypes from 'prop-types';

MyComponent.propTypes = {

// 你可以将属性声明为以下 JS 原生类型

optionalArray: PropTypes.array,

optionalBool: PropTypes.bool,

optionalFunc: PropTypes.func,

optionalNumber: PropTypes.number,

optionalObject: PropTypes.object,

optionalString: PropTypes.string,

optionalSymbol: PropTypes.symbol,

// 任何可被渲染的元素(包括数字、字符串、子元素或数组)。

optionalNode: PropTypes.node,

// 一个 React 元素

optionalElement: PropTypes.element,

// 你也可以声明属性为某个类的实例,这里使用 JS 的

// instanceof 操作符实现。

optionalMessage: PropTypes.instanceOf(Message),

// 你也可以限制你的属性值是某个特定值之一

optionalEnum: PropTypes.oneOf(['News', 'Photos']),

// 限制它为列举类型之一的对象

optionalUnion: PropTypes.oneOfType([

PropTypes.string,

PropTypes.number,

PropTypes.instanceOf(Message)

]),

// 一个指定元素类型的数组

optionalArrayOf: PropTypes.arrayOf(PropTypes.number),

// 一个指定类型的对象

optionalObjectOf: PropTypes.objectOf(PropTypes.number),

// 一个指定属性及其类型的对象

optionalObjectWithShape: PropTypes.shape({

color: PropTypes.string,

fontSize: PropTypes.number

}),

// 你也可以在任何 PropTypes 属性后面加上 `isRequired`

// 后缀,这样如果这个属性父组件没有提供时,会打印警告信息

requiredFunc: PropTypes.func.isRequired,

// 任意类型的数据

requiredAny: PropTypes.any.isRequired,

// 你也可以指定一个自定义验证器。它应该在验证失败时返回

// 一个 Error 对象而不是 `console.warn` 或抛出异常。

// 不过在 `oneOfType` 中它不起作用。

customProp: function(props, propName, componentName) {

if (!/matchme/.test(props[propName])) {

return new Error(

'Invalid prop `' + propName + '` supplied to' +

' `' + componentName + '`. Validation failed.'

);

}

},

// 不过你可以提供一个自定义的 `arrayOf` 或 `objectOf`

// 验证器,它应该在验证失败时返回一个 Error 对象。 它被用

// 于验证数组或对象的每个值。验证器前两个参数的第一个是数组

// 或对象本身,第二个是它们对应的键。

customArrayProp: PropTypes.arrayOf(function(propValue, key, componentName, location, propFullName) {

if (!/matchme/.test(propValue[key])) {

return new Error(

'Invalid prop `' + propFullName + '` supplied to' +

' `' + componentName + '`. Validation failed.'

);

}

})

};

来源:https://segmentfault.com/a/1190000010921839

以上是 【React系列】Props 验证 的全部内容, 来源链接: utcz.com/z/384074.html

回到顶部