State को ऊपर Lift करना
In this page:
function Parent() {
const [state, setState] = useState(initialValue);
return (
<>
<ChildA value={state} />
<ChildB onChange={setState} />
</>
);
}
Problem: Siblings को Shared Data चाहिए
जब दो sibling components को दोनों को same piece of state का access चाहिए, हर एक में separate copies रखना उन्हें out of sync होने का कारण बनता है -- एक को update करना दूसरे को affect नहीं करेगा।
React में sibling components के एक-दूसरे से directly बात करने का कोई built-in तरीका नहीं है।
उदाहरण: The Problem: Siblings Need Shared Data
<!DOCTYPE html>
<html>
<head>
<script src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
<body>
<div id="root"></div>
<script type="text/babel">
function TemperatureDisplay({ celsius }) {
return <p>{celsius}°C is {(celsius * 9/5 + 32).toFixed(1)}°F</p>;
}
function App() {
const [celsius] = React.useState(20);
return <TemperatureDisplay celsius={celsius} />;
}
ReactDOM.createRoot(document.getElementById('root')).render(<App />);
</script>
</body>
</html>
State को Common Parent में Move करना
Sync problem fix करने के लिए, state को (lifted) up किया जाता है closest component तक जो हर उस चीज़ का ancestor है जिसे इसकी ज़रूरत है। वह parent फिर current value को एक prop के रूप में हर child को pass करता है जो इसे display या use करता है।
उदाहरण: Moving State to the Common Parent
<!DOCTYPE html>
<html>
<head>
<script src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
<body>
<div id="root"></div>
<script type="text/babel">
function Display({ value }) { return <p>Current: {value}</p>; }
function App() {
const [value, setValue] = React.useState(0);
return (
<div>
<Display value={value} />
<button onClick={() => setValue(value + 1)}>Increase</button>
</div>
);
}
ReactDOM.createRoot(document.getElementById('root')).render(<App />);
</script>
</body>
</html>
Updater को भी Pass करना
अक्सर एक child को shared state change करनी होती है, सिर्फ इसे display नहीं करना होता। Parent अपना setter function एक prop के रूप में pass करता है, ताकि child इसे call कर सके -- parent को state का single owner रखते हुए भी children को updates trigger करने की allow करते हुए।
onIncrease, directly setValue expose करने के बजाय।setValue function को नीचे pass करना काम करता है, लेकिन इसे clearly एक event-like prop (जैसे onChange) के रूप में नाम देना component के API को समझना आसान बनाता है।उदाहरण: Passing the Updater Down Too
<!DOCTYPE html>
<html>
<head>
<script src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
<body>
<div id="root"></div>
<script type="text/babel">
function IncreaseButton({ onIncrease }) {
return <button onClick={onIncrease}>+1</button>;
}
function Display({ value }) { return <p>Value: {value}</p>; }
function App() {
const [value, setValue] = React.useState(0);
return (
<div>
<Display value={value} />
<IncreaseButton onIncrease={() => setValue(value + 1)} />
</div>
);
}
ReactDOM.createRoot(document.getElementById('root')).render(<App />);
</script>
</body>
</html>
- same piece of data को दो sibling components के separate state में duplicated रखना इसे उनके shared parent तक lift करने के बजाय।
- state lift up करने के बाद value AND updater function दोनों को prop के रूप में pass करना भूल जाना।
- state को ज़रूरत से ज़्यादा ऊंचा lift करना, पूरे app के top तक, जब एक closer common parent काम कर जाता।
- जब दो components को same data चाहिए, वह data उनके closest common parent में रहना चाहिए।
- Parent value को एक prop के रूप में नीचे pass करता है, और इसे update करने के लिए एक function दूसरे prop के रूप में।
- इसे 'lifting state up' कहा जाता है और यह एक core React data-flow pattern है।
- यह sibling components में same data की duplicated, out-of-sync copies से बचाता है।
कोई browser-specific restrictions नहीं -- useState और props पर बना एक data-flow pattern।
Chapter Quiz — Complete all 10 topics to unlock
0/10 topics done
Complete these topics first: