Oporno vrtanje je lahko koristen trik, vendar boste morali paziti na nekatere nerodne pasti.
Upravljanje podatkov in izdelava močnih aplikacij, ki jih je mogoče vzdrževati, sta ključni veščini razvoja programske opreme. Običajen način modularizacije vaših aplikacij React je uporaba vrtanja z oporniki, ki pomaga prenesti podatke navzdol po drevesu komponent.
Ko pa projekti postajajo večji, ima lahko vrtanje s podpornim vrtanjem svoje pomanjkljivosti. Raziščite težave v zvezi z opornim vrtanjem in ugotovite, katere alternative so na voljo.
Razumevanje opornega vrtanja
Prop drilling je tehnika, ki posreduje podatke navzdol po drevesu komponent kot rekvizite, ne glede na to, ali vmesne komponente potrebujejo podatke ali ne.
Vrtanje vključuje posredovanje rekvizitov od nadrejenih k podrejenim komponentam in nižje po hierarhiji. Glavni cilj je omogočiti komponentam na nižjih ravneh drevesa dostop in uporabo podatkov, ki jih zagotavljajo komponente višje ravni.
Slabosti opornega vrtanja
Medtem ko prop drilling rešuje problem skupne rabe podatkov, uvaja več pomanjkljivosti, ki lahko ovirajo vzdržljivost kode in učinkovitost razvoja.
1. Povečana kompleksnost
Ko aplikacija raste, postaja oporno vrtanje težje upravljati. To lahko vodi do zapletenega spleta odvisnosti komponent, zaradi česar je kodo težko razumeti in spremeniti.
import ChildComponent from'./ChildComponent';
exportdefaultfunctionParentComponent = () => {
const data = 'Prop drilling!';
return ( <div><ChildComponentdata={data} />div> );
};import GrandChildComponent from'./GrandChildComponent';
exportdefaultfunctionChildComponent = ({ data }) => {
return ( <div><GrandChildComponentdata={data} />div> );
};import GreatGrandChildComponent from'./GreatGrandChildComponent';
exportdefaultfunctionGrandChildComponent = ({ data }) => {
return ( <div><GreatGrandChildComponentdata={data} />div> );
};
exportdefaultfunctionGreatGrandChildComponent = ({ data }) => {
return ( <div><p>{data}p>div> );
};
Tu se podatki iz ParentComponent na najvišji ravni premaknejo v GreatGrandChildComponent prek dveh vmesnih komponent.
Ko se hierarhija komponent poglobi in se več komponent zanaša na prop, postane težje slediti in upravljati pretok podatkov.
2. Tesna povezava
To se zgodi, ko so komponente odvisne druga od druge prek rekvizitov, zaradi česar jih je težko spremeniti ali ponovno uporabiti. To lahko oteži spreminjanje ene komponente brez vpliva na druge.
import ChildComponentA from'./ChildComponentA';
import ChildComponentB from'./ChildComponentB';exportdefaultfunctionParentComponent = () => {
const sharedData = 'Shared data';
return (
</div>
);
};
import GrandChildComponent from'./GrandChildComponent';
exportdefaultfunctionChildComponentA = ({ data }) => {
return (
Component A</p>
</div>
);
};
import GrandChildComponent from'./GrandChildComponent';
exportdefaultfunctionChildComponentB = ({ data }) => {
return (
Component B</p>
</div>
);
};
exportdefaultfunctionGrandChildComponent = ({ data }) => {
return (
<p>{data}p> </div>
);
};
Tukaj obe podrejeni komponenti prejmeta iste podatke od svoje nadrejene komponente in jih posredujeta GrandChildComponent.
Če se podatki posodobijo, je treba posodobiti tudi vse komponente v hierarhiji, tudi če nekatere ne uporabljajo podatkov. To je lahko težavno in dolgotrajno, poleg tega pa poveča tveganje za vnos hroščev.
3. Vzdrževanje kode
Vrtanje rekvizitov je težava pri vzdrževanju kode, ker nove komponente potrebujejo dostop do rekvizitov, ki se prenašajo skozi hierarhijo. To lahko povzroči napake, če morate spremeniti veliko komponent, in nedoslednosti, če se rekviziti spremenijo.
import ChildComponent from'./ChildComponent';
exportdefaultfunctionParentComponent = () => {
const [count, setCount] = useState(0);const incrementCount = () => {
setCount(count + 1);
};return (
</div>
);
};import GrandChildComponent from'./GrandChildComponent';
exportdefaultfunctionChildComponent = ({ count, incrementCount }) => {
return (
exportdefaultfunctionGrandChildComponent = ({ count }) => {
return (Count: {count}</p>
</div>
);
};
Tukaj ParentComponent posreduje vrednost štetja kot prop ChildComponent in nato GrandChildComponent.
Toda če se število spremeni ali če obstaja novo pravilo za posredovanje dodatnih rekvizitov, boste morali posodobiti vsako komponento v hierarhiji, ki uporablja rekvizit. Ta postopek je nagnjen k napakam, kar otežuje vzdrževanje kode in povečuje nedoslednosti ali napake.
Raziskovanje alternativ za oporno vrtanje
V ekosistemu React je veliko rešitev za upravljanje stanja, ki jih lahko uporabite za premagovanje pomanjkljivosti vrtanja z vrtanjem.
Kontekst reakcije
React Context je funkcija, ki omogoča skupno rabo stanja med komponentami brez posredovanja rekvizitov. Zagotavlja centralizirano shrambo, do katere lahko dostopajo komponente s kavljem useContext. To lahko izboljša zmogljivost in olajša upravljanje stanja.
Redux
Redux je knjižnica za upravljanje stanja, ki zagotavlja enotno globalno shrambo stanja. Komponente lahko dostopajo in posodabljajo stanje prek dejanj in reduktorjev. To lahko pomaga ohranjati vašo kodo organizirano in lahko olajša odpravljanje napak.
MobX
MobX je knjižnica za upravljanje stanja, ki uporablja opazovane podatke. To pomeni, da se komponente lahko naročijo na spremembe v stanju in ukrepajo v skladu s tem. Knjižnica lahko naredi vašo kodo bolj reaktivno in lahko izboljša zmogljivost.
Jotai
Jotai je knjižnica za upravljanje stanja za React, ki uporablja model atomskega stanja. Omogoča vam ustvarjanje atomov stanja, do katerih lahko komponente dostopajo in jih posodabljajo.
Z Jotaijem lahko zmanjšate potrebo po opornem vrtanju in dosežete bolj poenostavljen in učinkovit pristop upravljanja stanja. Zaradi njegove minimalistične zasnove in osredotočenosti na zmogljivost je prepričljiva izbira za upravljanje stanja v aplikacijah React.
Prop drilling je tehnika za prenos podatkov od nadrejenih komponent do podrejenih komponent. Je učinkovit pri izmenjavi podatkov, vendar ima več pomanjkljivosti, zaradi katerih je kodo težko vzdrževati in razvijati.
Če želite premagati te pomanjkljivosti, lahko uporabite alternative, kot so React Context, Redux in MobX. Te rešitve zagotavljajo bolj centraliziran način upravljanja podatkov, zaradi česar je lahko koda bolj vzdržljiva in razširljiva.