Building Your Learning Module...
Getting things ready for you!
Find videos you like?
Save to resource drawer for future reference!
When multiple components need to share the same data, lift the state up to their closest common ancestor. The parent manages the state and passes it down via props!
State lifted from children to parent
// Simple Example: Sharing Count
function Parent() {
const [count, setCount] = useState(0);
return (
<div>
<Display count={count} />
<Button1 count={count} setCount={setCount} />
<Button2 count={count} setCount={setCount} />
</div>
);
}
function Display({ count }) {
return <h1>Count: {count}</h1>;
}
function Button1({ count, setCount }) {
return <button onClick={() => setCount(count + 1)}>+1</button>;
}
function Button2({ count, setCount }) {
return <button onClick={() => setCount(count + 5)}>+5</button>;
}Parent owns the shared count and both buttons update it
const { useState } = React;
function ParentPreview() {
const [count, setCount] = useState(0);
return (
<div className="preview">
<Display count={count} />
<div className="actions">
<ActionButton label="+1" onClick={() => setCount((c) => c + 1)} />
<ActionButton label="+5" onClick={() => setCount((c) => c + 5)} />
</div>
</div>
);
}
function Display({ count }) {
return (
<div className="display">
<p>Shared Count</p>
<strong>{count}</strong>
</div>
);
}
function ActionButton({ label, onClick }) {
return (
<button onClick={onClick} className="preview-btn">
{label}
</button>
);
}
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<ParentPreview />);
Loading preview...
Lifting state enables two-way sync and derived calculations
// ❌ Before: State in child components (can't share)
function TemperatureInput({ scale }) {
const [temperature, setTemperature] = useState('');
// Problem: Other component can't access this!
return <input value={temperature} onChange={e => setTemperature(e.target.value)} />;
}
// ✅ After: Lift state to parent (shared!)
function Calculator() {
const [temperature, setTemperature] = useState('');
const [scale, setScale] = useState('c');
const celsius = scale === 'f' ? (temperature - 32) * 5/9 : temperature;
const fahrenheit = scale === 'c' ? (temperature * 9/5) + 32 : temperature;
return (
<div>
<TemperatureInput
scale="c"
temperature={celsius}
onTemperatureChange={(temp) => {
setTemperature(temp);
setScale('c');
}}
/>
<TemperatureInput
scale="f"
temperature={fahrenheit}
onTemperatureChange={(temp) => {
setTemperature(temp);
setScale('f');
}}
/>
<BoilingVerdict celsius={parseFloat(celsius)} />
</div>
);
}
function TemperatureInput({ scale, temperature, onTemperatureChange }) {
return (
<fieldset>
<legend>Enter temperature in {scale === 'c' ? 'Celsius' : 'Fahrenheit'}:</legend>
<input
value={temperature}
onChange={e => onTemperatureChange(e.target.value)}
/>
</fieldset>
);
}
function BoilingVerdict({ celsius }) {
if (celsius >= 100) {
return <p>The water would boil.</p>;
}
return <p>The water would not boil.</p>;
}State lives in one place, shared via props
Closest common ancestor owns the state
Children call functions to update parent state
All components see the same state