हर state के टुकड़े को निकटतम साझा पूर्वज में रखें ताकि कई कंपोनेंट के बीच बिना डुप्लिकेट किए डेटा साझा हो सके।
इस पाठ को Kodokon में खोलेंदो भाई कंपोनेंट को एक ही डेटा दिखाना है: उदाहरण के लिए, एक सर्च फ़ील्ड और वह सूची जिसे यह फ़िल्टर करती है। हर एक में स्थानीय state काम नहीं कर सकती, क्योंकि वे एक-दूसरे को नहीं देख सकते। समाधान है state को उनके निकटतम साझा पूर्वज में ऊपर उठाना: पैरेंट डेटा का मालिक होता है और उसे props के माध्यम से नीचे लौटाता है।
import { useState } from "react";
function ProductPage({ products }) {
const [query, setQuery] = useState("");
return (
<>
<SearchBar query={query} onChange={setQuery} />
<ProductList products={products} query={query} />
</>
);
}तब बच्चे नियंत्रित कंपोनेंट बन जाते हैं: वे मान केवल-पढ़ने योग्य रूप में प्राप्त करते हैं और, इसे बदलने के लिए, पैरेंट द्वारा प्रदान किए गए कॉलबैक फ़ंक्शन को कॉल करते हैं। डेटा props के माध्यम से नीचे बहता है, बदलाव के अनुरोध फ़ंक्शन के माध्यम से ऊपर बहते हैं। यह एकतरफ़ा प्रवाह एप्लिकेशन के व्यवहार को समझना आसान बनाता है।
function SearchBar({ query, onChange }) {
return (
<input
value={query}
onChange={(e) => onChange(e.target.value)}
placeholder="Search for a product"
/>
);
}
function ProductList({ products, query }) {
const visible = products.filter((p) =>
p.name.toLowerCase().includes(query.toLowerCase())
);
return (
<ul>
{visible.map((p) => <li key={p.id}>{p.name}</li>)}
</ul>
);
}हर डेटा के टुकड़े का सत्य का एकमात्र स्रोत होना चाहिए। यदि दो कंपोनेंट प्रत्येक एक ही state की अपनी-अपनी प्रति संग्रहीत करते हैं, तो प्रतियाँ अंततः अलग हो जाएँगी: एक अपडेट हो जाती है, दूसरी नहीं, और इंटरफ़ेस असंगत हो जाता है। state को ऊपर उठाना उस जोखिम को हटा देता है। जब डेटा को कई स्तरों को पार करना पड़ता है, तो कंपोज़िशन (अगला पाठ) और फिर context props पास करने को हल्का करते हैं।