useContext Hook का उपयोग
const MyContext = createContext(defaultValue);
<MyContext.Provider value={value}>
<ChildComponent />
</MyContext.Provider>
// In any nested component
const value = useContext(MyContext);
Creating and Providing Context
React.createContext(defaultValue) एक Context object बनाता है। आपके component tree के किसी हिस्से को <MyContext.Provider value={...}> में wrap करना उस value को इसके अंदर nested हर component के लिए available बनाता है, चाहे वह कितना भी levels deep हो।
value prop वाला एक Provider silently context की default value पर fall back करता है, जो debug करना confusing हो सकता है।उदाहरण: Creating and Providing Context
<!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">
const ThemeContext = React.createContext("light");
function App() {
return (
<ThemeContext.Provider value="dark">
<Toolbar />
</ThemeContext.Provider>
);
}
function Toolbar() {
const theme = React.useContext(ThemeContext);
return <p>Current theme: {theme}</p>;
}
ReactDOM.createRoot(document.getElementById('root')).render(<App />);
</script>
</body>
</html>
Reading Context with useContext
Matching Provider के अंदर nested कोई भी component current value directly पढ़ने के लिए useContext(MyContext) call कर सकता है, बिना उस value को हर intermediate component के props के through explicitly passed किए।
उदाहरण: Reading Context with useContext
<!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">
const UserContext = React.createContext({ name: "Guest" });
function DeeplyNestedGreeting() {
const user = React.useContext(UserContext);
return <p>Hello, {user.name}!</p>;
}
function App() {
return (
<UserContext.Provider value={{ name: "Sam" }}>
<div><div><DeeplyNestedGreeting /></div></div>
</UserContext.Provider>
);
}
ReactDOM.createRoot(document.getElementById('root')).render(<App />);
</script>
</body>
</html>
Avoiding Prop Drilling
Context के बिना, एक deeply nested component के साथ एक value share करने का मतलब है इसे बीच में हर component के through एक prop के रूप में pass करना, even वे जो इसे खुद उपयोग नहीं करते -- इसे 'prop drilling' कहा जाता है।
Context इसे solve करता है deeply nested component को value directly पढ़ने देकर।
उदाहरण: Avoiding Prop Drilling
<!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">
const CountContext = React.createContext(0);
function DeepDisplay() {
const count = React.useContext(CountContext);
return <p>Count from context: {count}</p>;
}
function App() {
const [count, setCount] = React.useState(0);
return (
<CountContext.Provider value={count}>
<button onClick={() => setCount(count + 1)}>Increment</button>
<div><DeepDisplay /></div>
</CountContext.Provider>
);
}
ReactDOM.createRoot(document.getElementById('root')).render(<App />);
</script>
</body>
</html>
- Value चाहने वाले components को matching Context.Provider में wrap करना भूल जाना।
- एक नया context बनाना लेकिन कभी एक value provide न करना, consumers को सिर्फ default value के साथ stuck छोड़ते हुए।
- बहुत frequently change होने वाली values के लिए context को overuse करना, हर consumer को अक्सर re-render करवाते हुए।
- Context आपको हर level पर manually props pass किए बिना कई components में एक value share करने देता है।
createContextएक Context object बनाता है;.Providerएक value supply करता है;useContextइसे पढ़ता है।- कोई भी descendant component useContext से context value पढ़ सकता है, चाहे कितना भी deeply nested हो।
- Context theme, logged-in user info, या language settings जैसे global-ish data के लिए ideal है।
createContext और useContext क्रमशः React 16.3 और React 16.8 से available हैं।
Chapter Quiz — Complete all 12 topics to unlock
0/12 topics done
Complete these topics first: