React使用PropTypes實(shí)現(xiàn)類(lèi)型檢查功能
使用 PropTypes 進(jìn)行類(lèi)型檢查
- react 內(nèi)置類(lèi)型檢查功能
- 要在組件的 props 上進(jìn)行類(lèi)型檢查,你只需配置特定的 propTypes 屬性
- propTypes 僅在開(kāi)發(fā)模式下進(jìn)行檢查
import PropTypes from 'prop-types'
class Greeting extends React.Component {
render() {
return (
<h1>Hello, {this.props.name}</h1>
);
}
}
Greeting.propTypes = {
name: PropTypes.string
}
// 當(dāng)傳入的 prop 值類(lèi)型不正確時(shí),JavaScript 控制臺(tái)將會(huì)顯示警告
PropTypes
import PropTypes from 'prop-types';
MyComponent.propTypes = {
// 你可以將屬性聲明為 JS 原生類(lèi)型,默認(rèn)情況下
// 這些屬性都是可選的。
optionalArray: PropTypes.array,
optionalBool: PropTypes.bool,
optionalFunc: PropTypes.func,
optionalNumber: PropTypes.number,
optionalObject: PropTypes.object,
optionalString: PropTypes.string,
optionalSymbol: PropTypes.symbol,
// 任何可被渲染的元素(包括數(shù)字、字符串、元素或數(shù)組)
// (或 Fragment) 也包含這些類(lèi)型。
optionalNode: PropTypes.node,
// 一個(gè) React 元素。
optionalElement: PropTypes.element,
// 一個(gè) React 元素類(lèi)型(即,MyComponent)。
optionalElementType: PropTypes.elementType,
// 你也可以聲明 prop 為類(lèi)的實(shí)例,這里使用
// JS 的 instanceof 操作符。
optionalMessage: PropTypes.instanceOf(Message),
// 你可以讓你的 prop 只能是特定的值,指定它為
// 枚舉類(lèi)型。
optionalEnum: PropTypes.oneOf(['News', 'Photos']),
// 一個(gè)對(duì)象可以是幾種類(lèi)型中的任意一個(gè)類(lèi)型
optionalUnion: PropTypes.oneOfType([
PropTypes.string,
PropTypes.number,
PropTypes.instanceOf(Message)
]),
// 可以指定一個(gè)數(shù)組由某一類(lèi)型的元素組成
optionalArrayOf: PropTypes.arrayOf(PropTypes.number),
// 可以指定一個(gè)對(duì)象由某一類(lèi)型的值組成
optionalObjectOf: PropTypes.objectOf(PropTypes.number),
// 可以指定一個(gè)對(duì)象由特定的類(lèi)型值組成
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` ,確保
// 這個(gè) prop 沒(méi)有被提供時(shí),會(huì)打印警告信息。
requiredFunc: PropTypes.func.isRequired,
// 任意類(lèi)型的數(shù)據(jù)
requiredAny: PropTypes.any.isRequired,
// 你可以指定一個(gè)自定義驗(yàn)證器。它在驗(yàn)證失敗時(shí)應(yīng)返回一個(gè) Error 對(duì)象。
// 請(qǐng)不要使用 `console.warn` 或拋出異常,因?yàn)檫@在 `onOfType` 中不會(huì)起作用。
customProp: function(props, propName, componentName) {
if (!/matchme/.test(props[propName])) {
return new Error(
'Invalid prop `' + propName + '` supplied to' +
' `' + componentName + '`. Validation failed.'
);
}
},
// 你也可以提供一個(gè)自定義的 `arrayOf` 或 `objectOf` 驗(yàn)證器。
// 它應(yīng)該在驗(yàn)證失敗時(shí)返回一個(gè) Error 對(duì)象。
// 驗(yàn)證器將驗(yàn)證數(shù)組或?qū)ο笾械拿總€(gè)值。驗(yàn)證器的前兩個(gè)參數(shù)
// 第一個(gè)是數(shù)組或?qū)ο蟊旧?
// 第二個(gè)是他們當(dāng)前的鍵。
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.'
);
}
})
};限制單個(gè)元素
通過(guò) PropTypes.element 來(lái)確保傳遞給組件的 children 中只包含一個(gè)元素
import PropTypes from 'prop-types';
class MyComponent extends React.Component {
render() {
// 這必須只有一個(gè)元素,否則控制臺(tái)會(huì)打印警告。
const children = this.props.children;
return (
<div>
{children}
</div>
);
}
}
MyComponent.propTypes = {
children: PropTypes.element.isRequired
};
默認(rèn) Prop 值
可以通過(guò)配置特定的 defaultProps 屬性來(lái)定義 props 的默認(rèn)值
class Greeting extends React.Component {
render() {
return (
<h1>Hello, {this.props.name}</h1>
);
}
}
// 指定 props 的默認(rèn)值:
Greeting.defaultProps = {
name: 'Stranger'
};
// 渲染出 "Hello, Stranger":
ReactDOM.render(
<Greeting />,
document.getElementById('example')
);
defaultProps 用于確保 this.props.name 在父組件沒(méi)有指定其值時(shí),有一個(gè)默認(rèn)值。propTypes 類(lèi)型檢查發(fā)生在 defaultProps 賦值后,所以類(lèi)型檢查也適用于 defaultProps。
到此這篇關(guān)于React使用PropTypes實(shí)現(xiàn)類(lèi)型檢查功能的文章就介紹到這了,更多相關(guān)React PropTypes類(lèi)型檢查內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
redux持久化之redux-persist結(jié)合immutable使用問(wèn)題
這篇文章主要為大家介紹了redux持久化之redux-persist結(jié)合immutable使用問(wèn)題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
詳解react-router如何實(shí)現(xiàn)按需加載
本篇文章主要介紹了react-router如何實(shí)現(xiàn)按需加載,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06
基于React實(shí)現(xiàn)表單數(shù)據(jù)的添加和刪除詳解
這篇文章主要給大家介紹了基于React實(shí)現(xiàn)表單數(shù)據(jù)的添加和刪除的方法,文中給出了詳細(xì)的示例供大家參考,相信對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-03-03
詳解react中的state的簡(jiǎn)寫(xiě)方式
React是一個(gè)狀態(tài)機(jī)主要體現(xiàn)在state上,通過(guò)與用戶(hù)交易實(shí)現(xiàn)不同的狀態(tài),state是組件的私有屬性,是用來(lái)初始化的,本文重點(diǎn)給大家介紹react中的state的簡(jiǎn)寫(xiě)方式,感興趣的朋友一起看看吧2021-08-08
React實(shí)現(xiàn)前端選區(qū)的示例代碼
本文主要介紹了React實(shí)現(xiàn)前端選區(qū)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
react+typescript中使用echarts的實(shí)現(xiàn)步驟
本文主要介紹了react+typescript中使用echarts的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08

