Building Your Learning Module...
Getting things ready for you!
Find videos you like?
Save to resource drawer for future reference!
In React, state should be treated as read-only. When you need to update an object in state, you must create a new object rather than modifying the existing one. This ensures React can detect changes and trigger re-renders.
React can't detect the change because the object reference is unchanged.
New object reference lets React detect the change.
The ... spread operator is your best friend for updating objects. It copies all existing properties into a new object, then you can override specific properties.
Copy all properties, then change active to false
✅ New reference = React detects change!
💡 Order is Critical!
Spread first, then override ✅
Override gets overwritten ❌
Update user information and see real-time changes
function UserProfile() {
const [user, setUser] = React.useState({
name: 'John Doe',
email: 'john@example.com',
role: 'Frontend Developer',
active: true,
avatar: '👨💻'
});
const toggleActive = () => {
setUser({
...user,
active: !user.active
});
};
const updateRole = (newRole) => {
setUser({
...user,
role: newRole
});
};
return (
<div className="container">
<h1>👤 User Profile Editor</h1>
<div className="profile-card">
<div className="avatar-section">
<div className="avatar">{user.avatar}</div>
<div className="status-badge">
{user.active ? '🟢 Active' : '🔴 Inactive'}
</div>
</div>
<div className="info-section">
<h2>{user.name}</h2>
<p className="email">{user.email}</p>
<p className="role">{user.role}</p>
</div>
</div>
<div className="form-section">
<div className="input-group">
<label>Name</label>
<input
type="text"
value={user.name}
onChange={(e) => setUser({
...user,
name: e.target.value
})}
placeholder="Enter name"
/>
</div>
<div className="input-group">
<label>Email</label>
<input
type="email"
value={user.email}
onChange={(e) => setUser({
...user,
email: e.target.value
})}
placeholder="Enter email"
/>
</div>
<div className="role-selector">
<label>Role</label>
<div className="role-buttons">
{['Frontend Developer', 'Backend Developer', 'Full Stack', 'Designer'].map(role => (
<button
key={role}
className={user.role === role ? 'active' : ''}
onClick={() => updateRole(role)}
>
{role}
</button>
))}
</div>
</div>
<button
className="toggle-btn"
onClick={toggleActive}
>
{user.active ? '🔴 Deactivate' : '🟢 Activate'} User
</button>
</div>
<div className="state-display">
<h3>📋 Current State</h3>
<pre>{JSON.stringify(user, null, 2)}</pre>
</div>
</div>
);
}
const root = createRoot(document.getElementById('root'));
root.render(<UserProfile />);Loading preview...
React doesn't update state immediately. Instead, it batches multiple state updates together for better performance. This means that calling setState multiple times in the same event might not work as you expect.
All three updates use the same count value (0), so the result is 1.
Using functional updates ensures each call gets the latest state.
Always create new objects. React uses reference equality to detect changes.
{ ...obj, key: value } copies and updates efficiently.
Use setState(prev => newState) when new state depends on previous.
React batches updates for performance. Multiple setStates may not update immediately.