--description--
React provides useful type-checking features to verify that components receive props of the correct type. For example, your application makes an API call to retrieve data that you expect to be in an array, which is then passed to a component as a prop. You can set propTypes
on your component to require the data to be of type array
. This will throw a useful warning when the data is of any other type.
It's considered a best practice to set propTypes
when you know the type of a prop ahead of time. You can define a propTypes
property for a component in the same way you defined defaultProps
. Doing this will check that props of a given key are present with a given type. Here's an example to require the type function
for a prop called handleClick
:
MyComponent.propTypes = { handleClick: PropTypes.func.isRequired }
In the example above, the PropTypes.func
part checks that handleClick
is a function. Adding isRequired
tells React that handleClick
is a required property for that component. You will see a warning if that prop isn't provided. Also notice that func
represents function
. Among the seven JavaScript primitive types, function
and boolean
(written as bool
) are the only two that use unusual spelling. In addition to the primitive types, there are other types available. For example, you can check that a prop is a React element. Please refer to the documentation for all of the options.
Note: As of React v15.5.0, PropTypes
is imported independently from React, like this: import PropTypes from 'prop-types';
--instructions--
Define propTypes
for the Items
component to require quantity
as a prop and verify that it is of type number
.
--hints--
The ShoppingCart
component should render.
assert(
(function () {
const mockedComponent = Enzyme.mount(React.createElement(ShoppingCart));
return mockedComponent.find('ShoppingCart').length === 1;
})()
);
The Items
component should render.
assert(
(function () {
const mockedComponent = Enzyme.mount(React.createElement(ShoppingCart));
return mockedComponent.find('Items').length === 1;
})()
);
The Items
component should include a propTypes
check to require a value for quantity
and ensure that its value is a number.
(getUserInput) =>
assert(
(function () {
const noWhiteSpace = __helpers.removeWhiteSpace(getUserInput('index'));
return (
noWhiteSpace.includes('quantity:PropTypes.number.isRequired') &&
noWhiteSpace.includes('Items.propTypes=')
);
})()
);
--seed--
--before-user-code--
var PropTypes = {
number: { isRequired: true }
};
--after-user-code--
ReactDOM.render(<ShoppingCart />, document.getElementById('root'))
--seed-contents--
const Items = (props) => {
return <h1>Current Quantity of Items in Cart: {props.quantity}</h1>
};
// Change code below this line
// Change code above this line
Items.defaultProps = {
quantity: 0
};
class ShoppingCart extends React.Component {
constructor(props) {
super(props);
}
render() {
return <Items />
}
};
--solutions--
const Items = (props) => {
return <h1>Current Quantity of Items in Cart: {props.quantity}</h1>
};
// Change code below this line
Items.propTypes = {
quantity: PropTypes.number.isRequired
};
// Change code above this line
Items.defaultProps = {
quantity: 0
};
class ShoppingCart extends React.Component {
constructor(props) {
super(props);
}
render() {
return <Items />
}
};