Note:
React.PropTypes
has moved into a different package since React v15.5. Please use theprop-types
library instead.We provide a codemod script to automate the conversion.
As your app grows, you can catch a lot of bugs with typechecking. For some applications, you can use JavaScript extensions like Flow or TypeScript to typecheck your whole application. But even if you don’t use those, React has some built-in typechecking abilities. To run typechecking on the props for a component, you can assign the special propTypes
property:
import
PropTypes from
'prop-types'
;
class
Greeting
extends
React
.
Component {
render
(
)
{
return
(
<
h1>
Hello,
{
this
.
props.
name}
</
h1>
)
;
}
}
Greeting.
propTypes =
{
name
:
PropTypes.
string
}
;
In this example, we are using a class component, but the same functionality could also be applied to function components, or components created by React.memo
or React.forwardRef
.
PropTypes
exports a range of validators that can be used to make sure the data you receive is valid. In this example, we’re using PropTypes.string
. When an invalid value is provided for a prop, a warning will be shown in the JavaScript console. For performance reasons, propTypes
is only checked in development mode.
Tóm Tắt
PropTypes
Here is an example documenting the different validators provided:
import
PropTypes from
'prop-types'
;
MyComponent.
propTypes =
{
optionalArray
:
PropTypes.
array,
optionalBool
:
PropTypes.
bool,
optionalFunc
:
PropTypes.
func,
optionalNumber
:
PropTypes.
number,
optionalObject
:
PropTypes.
object,
optionalString
:
PropTypes.
string,
optionalSymbol
:
PropTypes.
symbol,
optionalNode
:
PropTypes.
node,
optionalElement
:
PropTypes.
element,
optionalElementType
:
PropTypes.
elementType,
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
}
)
,
optionalObjectWithStrictShape
:
PropTypes.
exact
(
{
name
:
PropTypes.
string,
quantity
:
PropTypes.
number
}
)
,
requiredFunc
:
PropTypes.
func.
isRequired,
requiredAny
:
PropTypes.
any.
isRequired,
customProp
:
function
(
props
,
propName,
componentName)
{
if
(
!
/
matchme
/
.
test
(
props[
propName]
)
)
{
return
new
Error
(
'Invalid prop `'
+
propName +
'` supplied to'
+
' `'
+
componentName +
'`. Validation failed.'
)
;
}
}
,
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.'
)
;
}
}
)
}
;
Requiring Single Child
With PropTypes.element
you can specify that only a single child can be passed to a component as 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
}
;
Default Prop Values
You can define default values for your props
by assigning to the special defaultProps
property:
class
Greeting
extends
React
.
Component {
render
(
)
{
return
(
<
h1>
Hello,
{
this
.
props.
name}
</
h1>
)
;
}
}
Greeting.
defaultProps =
{
name
:
'Stranger'
}
;
const
root =
ReactDOM.
createRoot
(
document.
getElementById
(
'example'
)
)
;
root.
render
(
<
Greeting
/>
)
;
Since ES2022 you can also declare defaultProps
as static property within a React component class. For more information, see the class public static fields. This modern syntax will require a compilation step to work within older browsers.
class
Greeting
extends
React
.
Component {
static
defaultProps =
{
name
:
'stranger'
}
render
(
)
{
return
(
<
div>
Hello,
{
this
.
props.
name}
</
div>
)
}
}
The defaultProps
will be used to ensure that this.props.name
will have a value if it was not specified by the parent component. The propTypes
typechecking happens after defaultProps
are resolved, so typechecking will also apply to the defaultProps
.
Function Components
If you are using function components in your regular development, you may want to make some small changes to allow PropTypes to be properly applied.
Let’s say you have a component like this:
export
default
function
HelloWorldComponent
(
{
name }
)
{
return
(
<
div>
Hello,
{
name}
</
div>
)
}
To add PropTypes, you may want to declare the component in a separate function before exporting, like this:
function
HelloWorldComponent
(
{
name }
)
{
return
(
<
div>
Hello,
{
name}
</
div>
)
}
export
default
HelloWorldComponent
Then, you can add PropTypes directly to the HelloWorldComponent
:
import
PropTypes from
'prop-types'
function
HelloWorldComponent
(
{
name }
)
{
return
(
<
div>
Hello,
{
name}
</
div>
)
}
HelloWorldComponent.
propTypes =
{
name
:
PropTypes.
string
}
export
default
HelloWorldComponent