web前端高级React - React从入门到进阶之使用PropTypes进行类型检查
第二部分:React进阶
系列文章目录
第一章:React从入门到进阶之初识React
第一章:React从入门到进阶之JSX简介
第三章:React从入门到进阶之元素渲染
第四章:React从入门到进阶之JSX虚拟DOM渲染为真实DOM的原理和步骤
第五章:React从入门到进阶之组件化开发及Props属性传值
第六章:React从入门到进阶之state及组件的生命周期
第七章:React从入门到进阶之React事件处理
第八章:React从入门到进阶之React条件渲染
第九章:React从入门到进阶之React中的列表与key
第十章:React从入门到进阶之表单及受控组件和非受控组件
第十一章:React从入门到进阶之组件的状态提升
第十二章:React从入门到进阶之组件的组合使用
第十三章:React从入门到进阶之组件的组件的懒加载及上下文Context
第十四章:React从入门到进阶之Refs&DOM以及Refs转发
第十五章:React从入门到进阶之高阶组件
第十六章:React从入门到进阶之Render Props
第十七章:React从入门到进阶之使用PropTypes进行类型检查
PropTypes
- 随着我们应用程序的不断扩大,有时候我们想给组件的属性添加一些类型限制,通过类型检查可以帮助我们捕获或避免一些错误。现在比较流行的是可以使用Flow或TypeScript等JavaScript扩展来做类型检查。但是如果我们不想用这些JavaScript扩展,指向用原生的JavaScript来实现类型检测也是可以的。React为我们提供了一套内置的检查功能 - propTypes。
- 要想使用PropTypes进行类型检查,首先我们需要通过npm install 或yarn add 来安装prop-types库
- 然后再通过import导入prop-types
- 比如我们想限制一个组件的name prop为string类型,可以这样:
import PropTypes from 'prop-types';
class Greeting extends React.Component{
render(){
return <h1>Hello {this.props.name}</h1>
}
}
//这里使用proptypes进行类型限制
Greeting.protTypes = {
name: PropTypes.string
}
使用起来很简单。PropTypes提供了一系列验证群,可以用于确保组件接收到的数据类型是有效的。在本例中,我们使用了PropTypes.stirng。 当传入的prop的值类型不是string时,JavaScript控制台将会打出警告。
- 出于性能方面考虑,PropTypes进制开发模式下进行检查
PropTypes
PropTypes 为我们提供了如下不同的验证器
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,
// 任何可被渲染的元素(包括数字、字符串、元素或数组)
// (或 Fragment) 也包含这些类型。
optionalNode: PropTypes.node,
// 一个 React 元素。
optionalElement: PropTypes.element,
// 一个 React 元素类型(即,MyComponent)。
optionalElementType: PropTypes.elementType,
// 也可以声明 prop 为类的实例,这里使用
// JS 的 instanceof 操作符。
optionalMessage: PropTypes.instanceOf(Message),
// 可以让 prop 只能是特定的值,指定它为
// 枚举类型。
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
}),
// An object with warnings on extra properties
optionalObjectWithStrictShape: PropTypes.exact({
name: PropTypes.string,
quantity: PropTypes.number
}),
// 可以在任何 PropTypes 属性后面加上 `isRequired` ,确保
// 这个 prop 没有被提供时,会打印警告信息。
requiredFunc: PropTypes.func.isRequired,
// 任意类型的数据
requiredAny: PropTypes.any.isRequired,
// 可以指定一个自定义验证器。它在验证失败时应返回一个 Error 对象。
// 请不要使用 `console.warn` 或抛出异常,因为这在 `onOfType` 中不会起作用。
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.'
);
}
})
}
限制单个元素
可以通过 PropTypes.element 来确保传递给组件的 children 中只包含一个元素
import PropTypes from 'prop-types';
class MyComponent extends React.Component {
render() {
// 这必须只有一个元素,否则控制台会打印警告。
const children = this.props.children;
return (
<div>
{children}
</div>
);
}
}
MyComponent.propTypes = {
children: PropTypes.element.isRequired
};
默认 Prop 值
我们可以通过配置特定的 defaultProps 属性来定义 props 的默认值
class Greeting extends React.Component {
render() {
return (
<h1>Hello, {this.props.name}</h1>
);
}
}
// 指定 props 的默认值:
Greeting.defaultProps = {
name: 'Alvin'
};
- defaultProps 用于确保 prop 属性 在父组件没有指定值时,有一个默认值。
- propTypes 类型检查发生在 defaultProps 赋值后,所以类型检查也适用于 defaultProps
关于类型检查就到这里
下一章节开始我们将开始学习React中专门用来配合函数组件使用的钩子函数(HOOK)
上一篇: ### matlab
下一篇: 模板总结——AC自动机