When a React component receives multiple props, you can access them through the props object. However, writing props. repeatedly can make a component harder to read.
React allows you to use JavaScript destructuring to extract individual values from the props object.
This is called props destructuring.
For example, without destructuring:
function User(props) {
return (
<div>
<h2>{props.name}</h2>
<p>{props.role}</p>
<p>{props.location}</p>
</div>
);
}
With destructuring:
function User({ name, role, location }) {
return (
<div>
<h2>{name}</h2>
<p>{role}</p>
<p>{location}</p>
</div>
);
}
Both components receive exactly the same props and produce the same result.
The difference is how the component accesses those values.
What Is Props Destructuring?
Props destructuring means extracting specific properties from the props object directly in the component’s function parameter.
Suppose the parent passes:
<User
name="Karimulla"
role="Frontend Developer"
/>
React provides those values to the component through props.
Without destructuring:
function User(props) {
return (
<div>
<h2>{props.name}</h2>
<p>{props.role}</p>
</div>
);
}
With destructuring:
function User({ name, role }) {
return (
<div>
<h2>{name}</h2>
<p>{role}</p>
</div>
);
}
The syntax:
function User({ name, role }) {
means that the component wants to extract name and role from the props object.
Understanding the Props Object
Before understanding destructuring, it helps to understand what props look like conceptually.
When you write:
<User
name="Karimulla"
role="Developer"
/>
you can think of the props object as:
{
name: "Karimulla",
role: "Developer"
}
Without destructuring, you access the properties like this:
props.name
props.role
Destructuring extracts those properties into local variables:
const { name, role } = props;
Now you can simply use:
name
role
React components commonly perform this destructuring directly in the function parameter.
Destructuring Props in the Function Parameter
The most common approach is to destructure props directly in the component function.
For example:
function Course({ title, level, duration }) {
return (
<div>
<h2>{title}</h2>
<p>Level: {level}</p>
<p>Duration: {duration}</p>
</div>
);
}
The component receives three props:
titlelevelduration
These become local variables inside the component.
You can then use them directly.
Destructuring vs Props Object
These two components are equivalent.
Using the Props Object
function Course(props) {
return (
<div>
<h2>{props.title}</h2>
<p>{props.level}</p>
<p>{props.duration}</p>
</div>
);
}
Using Destructuring
function Course({ title, level, duration }) {
return (
<div>
<h2>{title}</h2>
<p>{level}</p>
<p>{duration}</p>
</div>
);
}
The output is the same.
The main difference is readability.
With destructuring, you don’t need to repeatedly write:
props.title
props.level
props.duration
Instead, you can use:
title
level
duration
Destructuring Multiple Props
You can destructure as many props as the component needs.
function Profile({
name,
role,
location,
experience,
email
}) {
return (
<div>
<h2>{name}</h2>
<p>{role}</p>
<p>{location}</p>
<p>{experience} years experience</p>
<p>{email}</p>
</div>
);
}
The parent can provide all of these values:
<Profile
name="Karimulla"
role="Frontend Developer"
location="Hyderabad"
experience={1}
email="karimulla@example.com"
/>
The component can then use each value directly.
Destructuring Props with Different Data Types
Destructuring works regardless of the type of prop.
For example:
function Course({
title,
lessons,
progress,
available
}) {
return (
<div>
<h2>{title}</h2>
<p>Lessons: {lessons}</p>
<p>Progress: {progress}%</p>
<p>
{available ? "Available" : "Unavailable"}
</p>
</div>
);
}
The parent can pass:
<Course
title="React"
lessons={40}
progress={75}
available={true}
/>
The destructured variables retain their original data types.
title → String
lessons → Number
progress → Number
available → Boolean
Destructuring Props with Default Values
You can provide default values while destructuring props.
For example:
function Welcome({ name = "Guest" }) {
return <h2>Welcome, {name}</h2>;
}
If the parent passes:
<Welcome name="Karimulla" />
the component displays:
Welcome, Karimulla
If the parent doesn’t provide the prop:
<Welcome />
the default value is used:
Welcome, Guest
This is a convenient way to handle optional props.
Destructuring Props Inside the Component
You don’t have to destructure props in the function parameter.
You can also receive the complete props object and destructure it inside the component.
function Course(props) {
const {
title,
level,
duration
} = props;
return (
<div>
<h2>{title}</h2>
<p>{level}</p>
<p>{duration}</p>
</div>
);
}
This is equivalent to destructuring in the function parameter:
function Course({ title, level, duration }) {
return (
<div>
<h2>{title}</h2>
<p>{level}</p>
<p>{duration}</p>
</div>
);
}
The second approach is often shorter and easier to read.
When Should You Destructure Props?
Destructuring is particularly useful when a component uses several props.
For example:
function TutorialCard({
title,
category,
difficulty,
duration,
author
}) {
return (
<article>
<span>{category}</span>
<h2>{title}</h2>
<p>{difficulty}</p>
<p>{duration}</p>
<p>By {author}</p>
</article>
);
}
The component’s inputs are immediately visible.
You don’t have to search through the function to determine which props it uses.
Destructuring and the children Prop
The children prop can also be destructured.
For example:
function Card({ title, children }) {
return (
<div className="card">
<h2>{title}</h2>
<div>{children}</div>
</div>
);
}
The parent can provide:
<Card title="React">
<p>Learn React step by step.</p>
</Card>
The component receives:
titleas a regular prop.childrenas the nested content.
Both can be destructured together.
Destructuring Object Props
Sometimes one of the props itself is an object.
For example:
function App() {
const user = {
name: "Karimulla",
role: "Frontend Developer"
};
return <Profile user={user} />;
}
The child can first destructure the user prop:
function Profile({ user }) {
return (
<div>
<h2>{user.name}</h2>
<p>{user.role}</p>
</div>
);
}
You can also destructure the nested object:
function Profile({ user: { name, role } }) {
return (
<div>
<h2>{name}</h2>
<p>{role}</p>
</div>
);
}
This syntax is more advanced, so it is often easier for beginners to start with:
function Profile({ user }) {
const { name, role } = user;
return (
<div>
<h2>{name}</h2>
<p>{role}</p>
</div>
);
}
Choose the form that keeps the component readable.
Renaming Destructured Props
JavaScript also allows you to rename a destructured property.
Suppose a component receives a prop called name:
function User({ name: userName }) {
return <h2>{userName}</h2>;
}
Here:
name → userName
The actual prop is still called name.
Only the local variable has been renamed to userName.
This can be useful when a variable name would otherwise conflict with another variable in the same scope.
Destructuring Props with Rest Syntax
Sometimes a component needs a few specific props while also wanting access to the remaining props.
JavaScript’s rest syntax can help.
For example:
function Button({ children, variant, ...otherProps }) {
return (
<button
className={`button ${variant}`}
{...otherProps}
>
{children}
</button>
);
}
Now you could use:
<Button
variant="primary"
type="button"
aria-label="Start learning"
>
Start Learning
</Button>
Here:
childrenis extracted.variantis extracted.typeandaria-labelremain insideotherProps.
This is an advanced but useful pattern for reusable components.
Destructuring Does Not Change Props
Destructuring doesn’t create a new way of passing props.
The parent still passes props normally:
<Course
title="React"
level="Beginner"
/>
Destructuring only changes how the child accesses those values:
function Course({ title, level }) {
return (
<div>
<h2>{title}</h2>
<p>{level}</p>
</div>
);
}
The data flow remains:
Parent
↓
Props
↓
Child
↓
Destructure
↓
Use Values
Destructuring Props and Readability
One of the biggest advantages of destructuring is readability.
Compare:
function Course(props) {
return (
<article>
<h2>{props.title}</h2>
<p>{props.description}</p>
<p>{props.level}</p>
<p>{props.duration}</p>
<p>{props.lessons} lessons</p>
</article>
);
}
with:
function Course({
title,
description,
level,
duration,
lessons
}) {
return (
<article>
<h2>{title}</h2>
<p>{description}</p>
<p>{level}</p>
<p>{duration}</p>
<p>{lessons} lessons</p>
</article>
);
}
The second version clearly communicates the component’s inputs at the top of the function.
This can make larger components easier to understand.
When Not to Destructure
Destructuring is useful, but you don’t have to use it everywhere.
If a component needs the complete props object, keeping props can be clearer.
For example:
function DebugPanel(props) {
console.log(props);
return <pre>{JSON.stringify(props, null, 2)}</pre>;
}
Here, the entire props object is useful, so destructuring every property would not provide much benefit.
The goal is readability, not using destructuring simply because it exists.
Common Mistakes with Props Destructuring
Forgetting the Curly Braces
Correct:
function User({ name }) {
return <h2>{name}</h2>;
}
Incorrect:
function User(name) {
return <h2>{name}</h2>;
}
The second example doesn’t destructure the props object. It receives the entire props object as name.
Using the Wrong Property Name
If the parent provides:
<User username="Karimulla" />
the child should destructure username:
function User({ username }) {
return <h2>{username}</h2>;
}
Using { name } would not retrieve the username prop.
Confusing Renaming Syntax
This:
function User({ name: userName }) {
does not mean the parent must pass userName.
The parent still passes:
<User name="Karimulla" />
The syntax simply creates a local variable named userName.
Trying to Modify Destructured Props
Destructuring does not make props writable.
Avoid:
function Course({ title }) {
title = "JavaScript";
return <h2>{title}</h2>;
}
Treat values received through props as read-only inputs.
Best Practices for Props Destructuring
- Destructure props when it makes the component easier to read.
- Use descriptive variable names.
- Keep the destructured prop list organized.
- Provide default values for optional props when appropriate.
- Use nested destructuring carefully.
- Don’t use advanced destructuring simply to make code shorter.
- Use the complete
propsobject when the component genuinely needs it. - Remember that destructuring doesn’t change React’s one-way data flow.
- Treat destructured props as read-only.
- Keep component APIs focused and understandable.
Web4Learners Practical Example
Imagine Web4Learners has a reusable tutorial card.
The parent provides several props:
function App() {
return (
<TutorialCard
title="Props Destructuring"
category="React"
difficulty="Beginner"
duration="12 minutes"
lessons={8}
/>
);
}
The component can destructure all of them:
function TutorialCard({
title,
category,
difficulty,
duration,
lessons
}) {
return (
<article className="tutorial-card">
<span>{category}</span>
<h2>{title}</h2>
<p>Difficulty: {difficulty}</p>
<p>Duration: {duration}</p>
<p>{lessons} lessons</p>
</article>
);
}
The same component can be reused for another tutorial:
<TutorialCard
title="React State"
category="React"
difficulty="Intermediate"
duration="15 minutes"
lessons={10}
/>
The component structure doesn’t change.
Only the prop values change.
This is why props destructuring is particularly useful when building reusable React components.
Image Placement
Place the image immediately after the section “What Is Props Destructuring?”
Create a modern 16:9 Web4Learners-style React infographic showing a props object being destructured into individual variables. On the left, show:
props = {
name,
role,
location
}
In the center, show the destructuring syntax:
function User({ name, role, location })
On the right, show the resulting variables being used inside JSX. Use arrows to make the transformation clear. Keep the design clean, modern, and developer-focused with minimal text.
Caption: Destructuring props makes individual prop values easier to access inside React components.
Alt text: React props destructuring showing props converted into individual component variables.
Practice Exercise
Create a reusable CourseCard component that receives:
titlelevellessonsdurationprogress
Start with:
function App() {
return (
<CourseCard
title="React"
level="Beginner"
lessons={40}
duration="8 Weeks"
progress={75}
/>
);
}
Your task is to:
- Destructure all five props.
- Display the course title.
- Display the level.
- Display the number of lessons.
- Display the duration.
- Display the progress percentage.
- Create another
CourseCardwith different values. - Rewrite the component once using the complete
propsobject. - Compare both versions and decide which one you find easier to read.
Props Destructuring Cheat Sheet
| Task | Example |
|---|---|
| Receive props | function User(props) |
| Destructure one prop | function User({ name }) |
| Destructure multiple props | function User({ name, role }) |
| Default value | function User({ name = "Guest" }) |
| Destructure inside component | const { name } = props |
| Rename a prop | { name: userName } |
Destructure children | { children } |
| Nested object | { user: { name } } |
| Rest props | { title, ...otherProps } |
| Read destructured value | {name} |
Key Takeaways
- Props destructuring is a JavaScript technique used to extract values from the props object.
- You can destructure props directly in a component’s function parameter.
function User({ name })extracts thenameprop into a local variable.- Destructuring avoids repeatedly writing
props.propName. - You can destructure multiple props at the same time.
- Default values can be provided during destructuring.
- The
childrenprop can also be destructured. - Object props can be destructured further when necessary.
- Props can be renamed during destructuring.
- Rest syntax can collect remaining props.
- Destructuring doesn’t change how props are passed or React’s one-way data flow.
- Destructured props should still be treated as read-only.
- Use destructuring when it improves clarity, not simply because it is available.