Props
In React, "props" is short for "properties." Props are a way to pass data from one component to another, essentially making them a mechanism for component-to-component communication. They are similar to function arguments: just as you pass arguments to a function, you pass props to a React component.
Basic Usage
Here's a simple example to demonstrate how props work:
// A functional component that takes a prop 'name'
function Greeting(props) {
return <h1>Hello, {props.name}!</h1>;
}
// Using the component and passing a 'name' prop to it
const element = <Greeting name="John" />;
In this example, the Greeting component has a props parameter. When the component is used, you can pass a name prop to it, which will be accessible within the component as props.name.
Immutable Nature
It's important to note that props are "read-only," which means that a component should never modify the props passed to it. Doing so is considered bad practice and can lead to unpredictable behavior.
// Don't do this
function BadGreeting(props) {
props.name = "Default Name"; // Modifying props is bad practice
return <h1>Hello, {props.name}!</h1>;
}
Passing Different Types of Data
Props can be of any data type, including:
- Strings
- Numbers
- Booleans
- Arrays
- Objects
- Functions
function Profile(props) {
return (
<div>
<h1>{props.name}</h1>
<p>Age: {props.age}</p>
<p>Skills: {props.skills.join(", ")}</p>
</div>
);
}
const element = <Profile name="John" age={30} skills={["JavaScript", "React"]} />;
Passing Booleans
Booleans are often used for conditional rendering or toggling features on and off.
// Parent Component
function App() {
return <ChildComponent isActive={true} />;
}
function ChildComponent() {
return <ChildComponent isActive />; // Here the isActive is property of ChildComponent of type boolean, and it will take true when mentioned but not passed any value
// return <ChildComponent isActive={false} />; // set props.isActie to false
// return <ChildComponent />; // set props.isActie to default value if set or undefined which is a javascript falsy value.
}
// Child Component
function ChildComponent({ isActive }) {
return <div>{isActive ? "Active" : "Inactive"}</div>;
}
Passing Arrays
Arrays are useful for rendering lists of items.
// Parent Component
function App() {
const fruits = ["Apple", "Banana", "Cherry"];
return <ChildComponent items={fruits} />;
}
// Child Component
function ChildComponent({ items }) {
return (
<ul>
{items.map((item, index) => (
<li key={index}>{item}</li>
))}
</ul>
);
}
Passing Objects
Objects can be used to pass multiple related values as a single prop.
// Parent Component
function App() {
const user = { name: "John", age: 30 };
return <ChildComponent userInfo={user} />;
}
// Child Component
function ChildComponent({ userInfo }) {
return (
<div>
<p>Name: {userInfo.name}</p>
<p>Age: {userInfo.age}</p>
</div>
);
}
Passing Functions
Functions are often passed as props to handle events or modify parent component state.
// Parent Component
function App() {
const [count, setCount] = useState(0);
const incrementCount = () => {
setCount(count + 1);
};
return <ChildComponent onIncrement={incrementCount} />;
}
// Child Component
function ChildComponent({ onIncrement }) {
return <button onClick={onIncrement}>Increment</button>;
}
Important Notes:
-
Immutability: When passing arrays or objects, remember that React assumes that props are immutable. If you need to modify an array or object, it's good practice to create a new one.
-
Function Binding: When passing functions, especially to class components, you may need to bind the function to the current instance using
.bind(this)or arrow functions. -
Type Checking: For better maintainability and debugging, you can use
PropTypesto specify the expected type of each prop.
Default Props
You can set default values for props using the defaultProps attribute on a component.
function Greeting(props) {
return <h1>Hello, {props.name}!</h1>;
}
Greeting.defaultProps = {
name: "Guest",
};
Destructuring Props
You can use JavaScript's destructuring assignment to unpack values from the props object, making your code cleaner.
function Greeting({ name }) {
return <h1>Hello, {name}!</h1>;
}
Children Prop
The children prop is special and allows you to pass components as data to other components, rather than through attributes.
function Card(props) {
return <div className="card">{props.children}</div>;
}
const element = (
<Card>
<h1>Hello!</h1>
<p>Welcome to React.</p>
</Card>
);
In this example, the Card component uses props.children to render whatever you include between the opening and closing <Card> tags.
Props are a fundamental concept in React, enabling you to create reusable and interactive UI components.
PropTypes
In React, PropTypes are a way to enforce type-checking on the props passed to a component. They help catch bugs early by ensuring that the data you expect to be passed to a component is actually being received. PropTypes are especially useful in larger codebases or when working with multiple developers, as they serve as a form of documentation on how a component should be used.
To use PropTypes, you first need to import the prop-types package. If it's not already installed, you can install it via npm:
npm install prop-types
Then, you can specify the expected types for each prop your component receives:
import PropTypes from 'prop-types';
const MyComponent = ({ name, age, isActive }) => {
return (
<div>
<p>Name: {name}</p>
<p>Age: {age}</p>
<p>Active: {isActive ? 'Yes' : 'No'}</p>
</div>
);
};
MyComponent.propTypes = {
name: PropTypes.string.isRequired,
age: PropTypes.number,
isActive: PropTypes.bool
};
In this example, the MyComponent component expects three props:
name: A required stringage: A number (optional)isActive: A boolean (optional)
Supported Prop Types
Here are some commonly used PropTypes:
PropTypes.string: Validates that the prop is a string.PropTypes.number: Validates that the prop is a number.PropTypes.bool: Validates that the prop is a boolean.PropTypes.array: Validates that the prop is an array.PropTypes.object: Validates that the prop is an object.PropTypes.func: Validates that the prop is a function.PropTypes.node: Validates that the prop can be rendered (e.g., a number, string, element, or an array of these).PropTypes.element: Validates that the prop is a React element.PropTypes.oneOf([...]): Validates that the prop is one of the specified values.PropTypes.oneOfType([...]): Validates that the prop is one of the specified types.PropTypes.arrayOf(PropTypes.number): Validates that the prop is an array of numbers.PropTypes.objectOf(PropTypes.string): Validates that the prop is an object with values of a certain type.
Default Props
You can also specify default values for optional props using the defaultProps property:
MyComponent.defaultProps = {
age: 30,
isActive: false
};
Custom Validators
You can even write custom validation functions for more complex validation:
MyComponent.propTypes = {
customProp: function(props, propName, componentName) {
if (!/matchme/.test(props[propName])) {
return new Error(
`Invalid prop ${propName} supplied to ${componentName}. Validation failed.`
);
}
}
};