A React komponenskód elkülönítése robusztus rendszert hoz létre, de néha meg kell hajlítani a szabályokat.
A React egyirányú adatfolyamot használ szülőtől gyermekig, soha nem gyermektől szülőig. De mi történik, ha a gyermeknek kommunikálnia kell a szülőjével?
Ismerje meg, hogyan szüntesse meg az állapotot, hogy lehetővé tegye az alárendelt összetevő számára, hogy adatokat küldjön a szülőkomponensnek.
A React összetevői
A React egy hierarchiába rendezi az összetevőket, ahol a gyermekkomponensek a szülőkomponensek belsejébe ágyazódnak. Ez a hierarchia képezi az alkalmazás felhasználói felületének építőköveit.
</ParentComponent>
Minden egyes alárendelt komponens a szülőkomponensétől kap adatokat, az úgynevezett kellékeket. A React kellékek különféle típusú adatokat tartalmazhatnak, például tömböket, objektumokat, karakterláncokat vagy akár függvényeket. A gyermekkomponens nem tudja közvetlenül manipulálni ezeket az adatokat.
Tekintsük a következő, ún CounterButton:
const CounterButton = () => {
const [count, setCount] = useState(0)const handleIncrement = () => {
setCount(count + 1)
}
return (
A komponens egy elnevezésű állapotértéket tart fenn számol amely minden alkalommal növekszik, amikor a felhasználó a gombra kattint.
Tegyük fel, hogy a CounterButton összetevőt egy másik, Home nevű összetevőbe ágyazta be:
const Home = () => {
return (
)
}
Ha meg akarta jeleníteni a számértéket a CounterButton a Home komponensen belül, akkor kihívásba ütközik.
Amint már említettük, a React egyirányú adatáramlást kényszerít ki a szülőtől a gyermekig. Ezért a CounterButton összetevő nem oszthatja meg közvetlenül a számlálási állapot értékét a Home komponenssel.
Ennek megkerüléséhez fel kell emelni az államot.
Az állapot emelése az adatok megosztásához az összetevők között
Az emelési állapot egy komponens állapotának feljebb helyezését jelenti a komponensfában, egy szülőkomponenshez. Miután felemelte az állapotot, átadhatja azt a leszármazott összetevőknek prop értékként.
A korábbi számláló példában át kell helyeznie a számlálási állapotot és a handIncrement funkciót a Home komponenshez. Ezután át kell adnia a handleIncrement függvényt a CounterButton komponensnek támaszként.
const Home = () => {
const [count, setCount] = useState(0)const handleIncrement = () => {
setCount(count++)
}
return (
{count}</p>
)
}
Ezután módosítania kell a CounterButton komponenst, hogy elfogadja a handleIncrement függvényt, és meghívja azt, amikor a felhasználó rákattint a gombra.
const CounterButton = ({handleIncrement}) => {
return (
Az állam feloldása központosítja az adatokat és áthárítja a felelősséget az állam irányítása a gyerektől a szülőig.
Amellett, hogy segít az adatok megjelenítésében a szülőkomponensben, az állapot feloldása segíthet az adatok szinkronizálásában több összetevő között.
Tegyük fel, hogy van egy Fejléc és Lábléc komponens beágyazva a szülőkomponensbe, és ezek az összetevők mindegyike megjeleníti a megosztott számlálást is. Ennek az értéknek a megosztásához kellékként átadhatja ezeknek az összetevőknek.
const Home = () => {
const [count, setCount] = useState(0)const handleIncrement = () => {
setCount(count++)
}
return (
)
}
Azonban óvatosnak kell lennie az állapot felemelésével, hogy ne kerüljön a támasztékfúrásnak nevezett helyzetbe.
A Prop Drilling Challenge
Ahogy az alkalmazás növekszik, előfordulhat, hogy az összetevőfában mélyebben lévő több összetevőnek hozzáférésre van szüksége egy megosztott állapothoz. Ahhoz, hogy ez a megosztott állapot elérhető legyen a beágyazott összetevők számára, át kell adnia a kellékeket közvetítő összetevőkön. Ez a folyamat támasztékfúráshoz vezethet.
A támasztékfúrás megnehezíti az adatáramlás nyomon követését és nehezen karbantartható kódhoz vezethet.
Ha csökkenteni szeretné a támasztékfúrást, de továbbra is megoszthatja az adatokat az összetevők között, fontolja meg a React kontextus használatát. A React kontextus lehetővé teszi az állapot központosítását, hogy az a teljes alkalmazásban elérhető legyen.
Adatok megosztása In React segítségével Props
Ha meg kell osztania az utódkomponens adatait a szülőkomponenssel, emelje az állapotot a szülőkomponensre, majd adja át az állapotot frissítő függvényt az alárendelt összetevőnek kellékként.
Azokban az esetekben, amikor az alárendelt összetevő mélyen be van ágyazva az összetevőfába, használjon állapotkezelő eszközt, például a React Contextet, vagy egy harmadik féltől származó eszközt, például a React Reduxot, hogy megakadályozza a támasztékfúrást.