En komplett guide til React forwardRef. LÊr om formÄl, implementering, bruksomrÄder og beste praksis for Ä lage gjenbrukbare og vedlikeholdbare komponenter.
React forwardRef: Mestre videresending av ref for gjenbrukbare komponenter
I React-verdenen er det avgjĂžrende Ă„ lage gjenbrukbare og sammensettbare komponenter. Noen ganger trenger du imidlertid tilgang til den underliggende DOM-noden til en barnekomponent fra dens forelder. Det er her React.forwardRef
kommer til unnsetning. Denne omfattende guiden vil dykke ned i detaljene rundt forwardRef
, og forklare dens formÄl, implementering, bruksomrÄder og beste praksis.
Hva er videresending av ref?
Videresending av ref er en teknikk i React som lar en foreldrekomponent fÄ tilgang til DOM-noden eller React-komponentinstansen til en barnekomponent. I hovedsak "videresender" den en ref som er sendt til en komponent, ned til et av barna. Dette er spesielt nyttig nÄr du trenger Ä manipulere DOM-en til en barnekomponent direkte, som for eksempel Ä fokusere et input-felt eller mÄle dimensjonene.
Uten forwardRef
kan refs kun festes direkte til DOM-elementer eller klassekomponenter. Funksjonelle komponenter kan ikke motta eller eksponere refs direkte.
Hvorfor bruke forwardRef
?
Flere scenarioer krever bruk av forwardRef
:
- DOM-manipulasjon: NÄr du trenger Ä samhandle direkte med DOM-en til en barnekomponent. For eksempel Ä sette fokus pÄ et input-felt, utlÞse animasjoner eller mÄle elementer.
- Abstraksjon: NÄr du lager gjenbrukbare UI-komponenter som trenger Ä eksponere visse DOM-elementer for tilpasning eller integrering i andre deler av applikasjonen.
- HÞyere-ordens komponenter (HOCs): NÄr du pakker inn en komponent med en HOC og mÄ sikre at refs blir korrekt videresendt til den underliggende komponenten.
- Komponentbiblioteker: NÄr man bygger komponentbiblioteker, gjÞr videresending av ref det mulig for utviklere Ä fÄ tilgang til og tilpasse de underliggende DOM-elementene i komponentene dine, noe som gir stÞrre fleksibilitet.
Hvordan forwardRef
fungerer
React.forwardRef
er en hĂžyere-ordens komponent (HOC) som aksepterer en render-funksjon som sitt argument. Denne render-funksjonen mottar props
og ref
som argumenter. Render-funksjonen returnerer deretter et React-element. ref
-argumentet er den ref-en som ble sendt til komponenten fra dens forelder. Du kan deretter feste denne ref-en til en barnekomponent inne i render-funksjonen.
Her er en oversikt over prosessen:
- En foreldrekomponent oppretter en ref ved hjelp av
useRef
. - Foreldrekomponenten sender ref-en til en barnekomponent som en prop.
- Barnekomponenten er pakket inn i
React.forwardRef
. - Inne i render-funksjonen til
forwardRef
blir ref-en festet til et DOM-element eller en annen React-komponent. - Foreldrekomponenten kan nÄ fÄ tilgang til DOM-noden eller komponentinstansen via ref-en.
Implementering av forwardRef
: Et praktisk eksempel
La oss illustrere forwardRef
med et enkelt eksempel: en tilpasset input-komponent som lar foreldrekomponenten fokusere input-feltet programmatisk.
Eksempel: Tilpasset input-komponent med videresending av ref
FĂžrst, la oss lage den tilpassede input-komponenten:
import React, { forwardRef } from 'react';
const CustomInput = forwardRef((props, ref) => {
return (
<div>
<label htmlFor={props.id}>{props.label}</label>
<input type="text" id={props.id} ref={ref} {...props} />
</div>
);
});
CustomInput.displayName = "CustomInput"; // Anbefales for bedre feilsĂžking
export default CustomInput;
I dette eksempelet:
- Vi importerer
forwardRef
fra 'react'. - Vi pakker inn vÄr funksjonelle komponent med
forwardRef
. forwardRef
-funksjonen mottarprops
ogref
som argumenter.- Vi fester
ref
-en til<input>
-elementet. - Vi setter
displayName
for bedre feilsĂžking i React DevTools.
La oss nÄ se hvordan vi bruker denne komponenten i en foreldrekomponent:
import React, { useRef, useEffect } from 'react';
import CustomInput from './CustomInput';
const ParentComponent = () => {
const inputRef = useRef(null);
useEffect(() => {
// Fokuser input-feltet nÄr komponenten monteres
if (inputRef.current) {
inputRef.current.focus();
}
}, []);
return (
<div>
<CustomInput label="Name:" id="name" ref={inputRef} placeholder="Enter your name" />
</div>
);
};
export default ParentComponent;
I denne foreldrekomponenten:
- Vi oppretter en ref ved hjelp av
useRef
. - Vi sender
inputRef
tilCustomInput
-komponenten somref
-prop. - Inne i
useEffect
-hooken fÄr vi tilgang til den underliggende DOM-noden ved hjelp avinputRef.current
og kallerfocus()
-metoden.
NÄr ParentComponent
monteres, vil input-feltet i CustomInput
-komponenten automatisk bli fokusert.
BruksomrÄder for forwardRef
Her er noen vanlige bruksomrÄder der forwardRef
viser seg Ă„ vĂŠre uvurderlig:
1. Fokusere input-felt
Som vist i eksempelet over, lar forwardRef
deg programmatisk fokusere input-felt, noe som er nyttig for skjemavalidering, tilgjengelighet og forbedringer av brukeropplevelsen. For eksempel, etter at en bruker sender inn et skjema med feil, kan du fokusere det fĂžrste input-feltet med en feil for Ă„ veilede brukeren.
2. MÄle elementdimensjoner
Du kan bruke forwardRef
for Ä fÄ tilgang til DOM-noden til en barnekomponent og mÄle dens dimensjoner (bredde, hÞyde, osv.). Dette er nyttig for Ä lage responsive layouter, dynamisk stÞrrelsesjustering og tilpassede animasjoner. Du kan for eksempel trenge Ä mÄle hÞyden pÄ et dynamisk innholdsomrÄde for Ä justere layouten til andre elementer pÄ siden.
3. Integrasjon med tredjepartsbiblioteker
Mange tredjepartsbiblioteker krever direkte tilgang til DOM-noder for initialisering eller konfigurasjon. forwardRef
lar deg sÞmlÞst integrere disse bibliotekene med dine React-komponenter. Tenk deg Ä bruke et grafbibliotek som krever et DOM-element som mÄl for Ä rendere grafen. forwardRef
gjĂžr det mulig for deg Ă„ gi det DOM-elementet til biblioteket.
4. Lage tilgjengelige komponenter
Tilgjengelighet krever ofte direkte manipulasjon av DOM-attributter eller fokusstyring. forwardRef
kan brukes til Ă„ lage tilgjengelige komponenter som overholder tilgjengelighetsstandarder. For eksempel kan du trenge Ă„ sette aria-describedby
-attributtet pÄ et input-felt for Ä knytte det til en feilmelding. Dette krever direkte tilgang til input-feltets DOM-node.
5. HĂžyere-ordens komponenter (HOCs)
NÄr man lager HOCs, er det viktig Ä sikre at refs blir korrekt videresendt til den innpakkede komponenten. forwardRef
hjelper deg med Ä oppnÄ dette. La oss si du har en HOC som legger til styling pÄ en komponent. Ved Ä bruke forwardRef
sikrer du at eventuelle refs som sendes til den stylede komponenten, blir videresendt til den underliggende komponenten.
Beste praksis for bruk av forwardRef
For Ă„ sikre at du bruker forwardRef
effektivt, bĂžr du vurdere disse beste praksisene:
1. Bruk displayName
for feilsĂžking
Sett alltid displayName
-egenskapen pÄ dine forwardRef
-komponenter. Dette gjĂžr det enklere Ă„ identifisere dem i React DevTools. For eksempel:
CustomInput.displayName = "CustomInput";
2. VÊr bevisst pÄ ytelse
Selv om forwardRef
er et kraftig verktÞy, kan det potensielt pÄvirke ytelsen hvis det brukes overdrevent. UnngÄ unÞdvendig DOM-manipulasjon og optimaliser render-logikken din. Profiler applikasjonen din for Ä identifisere eventuelle ytelsesflaskehalser relatert til videresending av ref.
3. Bruk refs med omhu
Ikke bruk refs som en erstatning for Reacts dataflyt. Refs bÞr brukes sparsomt og kun nÄr det er nÞdvendig for DOM-manipulasjon eller integrasjon med tredjepartsbiblioteker. Stol pÄ props og state for Ä hÄndtere komponentdata og -atferd.
4. Dokumenter komponentene dine
Dokumenter tydelig nÄr og hvorfor du bruker forwardRef
i komponentene dine. Dette hjelper andre utviklere med Ä forstÄ koden din og bruke komponentene dine riktig. Inkluder eksempler pÄ hvordan du bruker komponenten og formÄlet med den videresendte ref-en.
5. Vurder alternativer
FĂžr du bruker forwardRef
, bÞr du vurdere om det finnes alternative lÞsninger som kan vÊre mer passende. For eksempel kan du kanskje oppnÄ Þnsket atferd ved Ä bruke props og state i stedet for Ä manipulere DOM-en direkte. Utforsk andre alternativer fÞr du tyr til forwardRef
.
Alternativer til forwardRef
Selv om forwardRef
ofte er den beste lĂžsningen for Ă„ videresende refs, finnes det alternative tilnĂŠrminger du kan vurdere i visse situasjoner:
1. Callback Refs
Callback refs gir en mer fleksibel mÄte Ä fÄ tilgang til DOM-noder pÄ. I stedet for Ä sende en ref
-prop, sender du en funksjon som mottar DOM-noden som et argument. Dette lar deg utfÞre tilpasset logikk nÄr DOM-noden festes eller fjernes. Imidlertid kan callback refs vÊre mer ordrike og mindre lesbare enn forwardRef
.
const MyComponent = () => {
let inputElement = null;
const setInputElement = (element) => {
inputElement = element;
};
useEffect(() => {
if (inputElement) {
inputElement.focus();
}
}, []);
return <input type="text" ref={setInputElement} />;
};
2. Komposisjon
I noen tilfeller kan du oppnÄ Þnsket atferd ved Ä komponere komponenter i stedet for Ä bruke forwardRef
. Dette innebÊrer Ä bryte ned en kompleks komponent i mindre, mer hÄndterbare komponenter og sende data og atferd mellom dem ved hjelp av props. Komposisjon kan fÞre til mer vedlikeholdbar og testbar kode, men det er kanskje ikke egnet for alle scenarioer.
3. Render Props
Render props lar deg dele kode mellom React-komponenter ved Ä bruke en prop hvis verdi er en funksjon. Du kan bruke render props for Ä eksponere DOM-noder eller komponentinstanser til foreldrekomponenten. Imidlertid kan render props gjÞre koden din mer kompleks og vanskeligere Ä lese, spesielt nÄr du hÄndterer flere render props.
Vanlige feil Ä unngÄ
NÄr du jobber med forwardRef
, er det viktig Ä unngÄ disse vanlige feilene:
1. Glemme Ă„ sette displayName
Som nevnt tidligere, kan det Ă„ glemme Ă„ sette displayName
-egenskapen gjĂžre feilsĂžking vanskelig. Sett alltid displayName
for dine forwardRef
-komponenter.
2. Overdreven bruk av refs
MotstÄ fristelsen til Ä bruke refs til alt. Refs bÞr brukes sparsomt og kun nÄr det er nÞdvendig for DOM-manipulasjon eller integrasjon med tredjepartsbiblioteker. Stol pÄ props og state for Ä hÄndtere komponentdata og -atferd.
3. Manipulere DOM-en direkte uten god grunn
Direkte DOM-manipulasjon kan gjÞre koden din vanskeligere Ä vedlikeholde og teste. Manipuler kun DOM-en nÄr det er absolutt nÞdvendig og unngÄ unÞdvendige DOM-oppdateringer.
4. Ikke hÄndtere null-refs
Sjekk alltid om ref-en er null fÞr du fÄr tilgang til den underliggende DOM-noden eller komponentinstansen. Dette forhindrer feil nÄr komponenten ennÄ ikke er montert eller har blitt avmontert.
if (inputRef.current) {
inputRef.current.focus();
}
5. Skape sirkulĂŠre avhengigheter
VÊr forsiktig nÄr du bruker forwardRef
i kombinasjon med andre teknikker som HOCs eller render props. UnngÄ Ä skape sirkulÊre avhengigheter mellom komponenter, da dette kan fÞre til ytelsesproblemer eller uventet atferd.
Eksempler fra hele verden
Prinsippene for React og forwardRef
er universelle, men tenk pÄ hvordan utviklere fra forskjellige regioner kan tilpasse bruken:
- Lokalisering og internasjonalisering (i18n): Utviklere som bygger flersprÄklige applikasjoner i Europa eller Asia, kan bruke
forwardRef
for Ä mÄle stÞrrelsen pÄ lokaliserte tekstelementer for Ä dynamisk justere layouter for forskjellige sprÄk, og slik sikre at tekst ikke flyter utenfor containere. For eksempel har tyske ord en tendens til Ä vÊre lengre enn engelske ord, noe som krever justeringer. - HÞyre-til-venstre (RTL) layouter: I MidtÞsten og deler av Asia mÄ applikasjoner ofte stÞtte RTL-layouter.
forwardRef
kan brukes til Ä programmatisk justere posisjoneringen av elementer basert pÄ gjeldende layout-retning. - Tilgjengelighet for ulike brukere: Globalt er tilgjengelighet en voksende bekymring. Utviklere kan bruke
forwardRef
for Ă„ forbedre tilgjengeligheten for brukere med nedsatt funksjonsevne, for eksempel ved Ă„ programmatisk fokusere elementer for skjermlesere eller justere tabulatorrekkefĂžlgen i skjemafelt. - Integrasjon med regionspesifikke API-er: Utviklere som integrerer med lokale API-er (f.eks. betalingslĂžsninger, karttjenester) kan bruke
forwardRef
for Ä fÄ tilgang til DOM-elementer som kreves av disse API-ene, og dermed sikre kompatibilitet og sÞmlÞs integrasjon.
Konklusjon
React.forwardRef
er et kraftig verktÞy for Ä lage gjenbrukbare og sammensettbare React-komponenter. Ved Ä la foreldrekomponenter fÄ tilgang til DOM-nodene eller komponentinstansene til barna sine, muliggjÞr forwardRef
et bredt spekter av bruksomrÄder, fra DOM-manipulasjon til integrasjon med tredjepartsbiblioteker. Ved Ä fÞlge beste praksis som er beskrevet i denne guiden, kan du utnytte forwardRef
effektivt og unngÄ vanlige feil. Husk Ä bruke refs med omhu, dokumentere komponentene dine tydelig, og vurdere alternative lÞsninger nÄr det er hensiktsmessig. Med en solid forstÄelse av forwardRef
kan du bygge mer robuste, fleksible og vedlikeholdbare React-applikasjoner.