LÄs opp kraften i Reacts createRef for direkte DOM-tilgang og komponentinteraksjon. Denne guiden gir praktiske eksempler og beste praksis for utviklere verden over.
Mestre React createRef: En Omfattende Guide for Moderne Utvikling
I den dynamiske verdenen av front-end-utvikling fremstÄr React som et kraftig og allsidig JavaScript-bibliotek for Ä bygge brukergrensesnitt. En av nÞkkelfunksjonene som lar React-utviklere samhandle direkte med Document Object Model (DOM) og hÄndtere komponentatferd, er createRef
API-et. Denne guiden dykker ned i detaljene rundt createRef
, og gir en omfattende forstÄelse av bruken, fordelene og beste praksis for utviklere verden over.
ForstÄelse av React Refs
FĂžr vi dykker ned i createRef
, er det essensielt Ä forstÄ konseptet med refs i React. En ref gir en mÄte Ä fÄ tilgang til DOM-noder eller React-elementer som er opprettet i render-metoden. Denne tilgangen lar deg utfÞre operasjoner som Ä fokusere et input-felt, utlÞse animasjoner eller mÄle stÞrrelsen pÄ et element.
I motsetning til tradisjonell JavaScript DOM-manipulering, gir refs i React en kontrollert og effektiv mÄte Ä samhandle med DOM pÄ. Reacts virtuelle DOM abstraherer bort mange av kompleksitetene ved direkte DOM-manipulering, men refs tilbyr en bro nÄr direkte tilgang er nÞdvendig.
Introduksjon til createRef
createRef
er en funksjon levert av React som oppretter et ref-objekt. Dette ref-objektet har en current
-egenskap som holder DOM-noden eller React-komponentinstansen som ref-en er knyttet til. createRef
API-et ble introdusert som en del av React 16.3 og er den anbefalte mÄten Ä opprette refs i klassekomponenter. For funksjonelle komponenter gir useRef
(en React Hook) lignende funksjonalitet.
Opprette et Ref-objekt
For Ă„ opprette et ref-objekt, kaller du enkelt og greit createRef()
-funksjonen:
import React from 'react';
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.myRef = React.createRef();
}
render() {
return (
);
}
}
I dette eksempelet er this.myRef
et ref-objekt som er tildelt ref
-attributtet til input-elementet. current
-egenskapen til this.myRef
vil holde en referanse til input-elementet etter at komponenten er montert.
Tilgang til DOM-noden
NÄr komponenten er montert, kan du fÄ tilgang til DOM-noden gjennom current
-egenskapen til ref-objektet:
import React from 'react';
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.myRef = React.createRef();
this.focusInput = this.focusInput.bind(this);
}
componentDidMount() {
this.focusInput();
}
focusInput() {
this.myRef.current.focus();
}
render() {
return (
);
}
}
I dette eksempelet bruker focusInput
-metoden this.myRef.current
for Ä fÄ tilgang til input-elementet og kalle dessen focus()
-metode. Dette vil automatisk fokusere pÄ input-feltet nÄr komponenten monteres.
BruksomrÄder for createRef
createRef
er verdifull i ulike scenarier der direkte DOM-manipulering eller tilgang til komponentinstanser er pÄkrevd. Her er noen vanlige bruksomrÄder:
- Fokusering pÄ Tekstinput: Som vist i det forrige eksempelet, brukes
createRef
ofte for Ä programmatisk fokusere pÄ tekstinput. Dette er nyttig for Ä forbedre brukeropplevelsen ved Ä automatisk fokusere pÄ det fÞrste input-feltet i et skjema, eller fokusere pÄ et input-felt etter en spesifikk handling. - HÄndtering av Medieavspilling: Refs kan brukes til Ä kontrollere medieelementer som
<video>
eller<audio>
. Du kan bruke refs til Ä spille av, pause eller justere volumet pÄ medieelementer. For eksempel:import React from 'react'; class VideoPlayer extends React.Component { constructor(props) { super(props); this.videoRef = React.createRef(); this.playVideo = this.playVideo.bind(this); } playVideo() { this.videoRef.current.play(); } render() { return (
- UtlÞsing av Animasjoner: Refs kan brukes for Ä fÄ tilgang til DOM-elementer og utlÞse animasjoner ved hjelp av JavaScript eller CSS. Dette lar deg lage komplekse og interaktive animasjoner som responderer pÄ brukerhandlinger.
import React from 'react'; class AnimatedBox extends React.Component { constructor(props) { super(props); this.boxRef = React.createRef(); this.animate = this.animate.bind(this); } animate() { const box = this.boxRef.current; box.classList.add('animate'); } render() { return (
I dette eksempelet vil et klikk pÄ knappen legge til
animate
-klassen i bokselementet, noe som utlÞser en CSS-animasjon. - MÄling av ElementstÞrrelse og Posisjon: Refs er nyttige for Ä hente stÞrrelsen og posisjonen til DOM-elementer. Denne informasjonen kan brukes til layout-beregninger, dynamisk styling eller for Ä lage interaktive elementer.
import React from 'react'; class SizeReporter extends React.Component { constructor(props) { super(props); this.elementRef = React.createRef(); this.state = { width: 0, height: 0 }; this.reportSize = this.reportSize.bind(this); } componentDidMount() { this.reportSize(); } reportSize() { const element = this.elementRef.current; this.setState({ width: element.offsetWidth, height: element.offsetHeight }); } render() { return (
Bredde: {this.state.width}px, HĂžyde: {this.state.height}px
Denne komponenten rapporterer bredden og hÞyden pÄ div-elementet etter at det er montert.
- Integrering med Tredjepartsbiblioteker: Refs brukes ofte for Ä integrere React-komponenter med tredjepartsbiblioteker som krever direkte DOM-tilgang. For eksempel kan du bruke en ref for Ä fÄ tilgang til et DOM-element og initialisere en jQuery-plugin pÄ det.
import React from 'react'; import $ from 'jquery'; class MyComponent extends React.Component { constructor(props) { super(props); this.elementRef = React.createRef(); } componentDidMount() { $(this.elementRef.current).plugin(); // Initialiser jQuery-plugin } render() { return ; } }
createRef
vs. Callback Refs
FĂžr introduksjonen av createRef
, var callback refs en vanlig mÄte Ä fÄ tilgang til DOM-noder i React. Selv om callback refs fortsatt er gyldige, tilbyr createRef
en mer rett frem og mindre ordrik tilnĂŠrming, spesielt i klassekomponenter.
En callback ref er en funksjon som React kaller med DOM-noden eller komponentinstansen som et argument. Du tildeler denne funksjonen til ref
-attributtet til et element:
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.myRef = null;
this.setRef = element => {
this.myRef = element;
};
}
componentDidMount() {
if (this.myRef) {
this.myRef.focus();
}
}
render() {
return ;
}
}
Selv om denne tilnÊrmingen fungerer, kan den vÊre mer kompleks Ä administrere, spesielt nÄr man hÄndterer flere refs. createRef
forenkler denne prosessen ved Ă„ tilby et dedikert ref-objekt.
NĂžkkelforskjeller:
- Lesbarhet:
createRef
anses generelt for Ä vÊre mer lesbar og lettere Ä forstÄ. - Konsistens:
createRef
gir en konsekvent mÄte Ä opprette og fÄ tilgang til refs. - Ytelse: I noen tilfeller kan callback refs forÄrsake unÞdvendige re-rendere fordi callback-funksjonen er en ny funksjon ved hver render.
createRef
unngÄr dette problemet.
Beste Praksis for Bruk av createRef
For Ä sikre optimal ytelse og vedlikeholdbarhet, fÞlg disse beste praksisene nÄr du bruker createRef
:
- Bruk
createRef
i Klassekomponenter:createRef
er designet for bruk i klassekomponenter. For funksjonelle komponenter, brukuseRef
Hook. - UnngÄ Overforbruk av Refs: Refs bÞr brukes med mÄte. Overforbruk av refs kan fÞre til kode som er vanskelig Ä vedlikeholde og resonnere om. Foretrekk deklarative tilnÊrminger nÄr det er mulig.
- Null-sjekker: Sjekk alltid om
current
-egenskapen til ref-en er null fÞr du fÄr tilgang til den, spesielt icomponentDidMount
-livssyklusmetoden. DOM-noden er kanskje ikke tilgjengelig umiddelbart etter at komponenten er montert.componentDidMount() { if (this.myRef.current) { this.myRef.current.focus(); } }
- UnngÄ Ä Modifisere DOM Direkte: Selv om refs gir tilgang til DOM, bÞr du unngÄ Ä modifisere DOM direkte med mindre det er absolutt nÞdvendig. Reacts virtuelle DOM gir en effektiv mÄte Ä oppdatere UI-et pÄ, og direkte DOM-manipulering kan forstyrre Reacts render-prosess.
- Rydd Opp i Refs ved Behov: I noen tilfeller kan det vÊre nÞdvendig Ä rydde opp i refs nÄr en komponent avmonteres. Dette er spesielt viktig nÄr man hÄndterer tredjepartsbiblioteker som kan holde pÄ referanser til DOM-elementer.
createRef
i Funksjonelle Komponenter med Hooks
Selv om createRef
primÊrt brukes i klassekomponenter, kan funksjonelle komponenter oppnÄ lignende funksjonalitet ved hjelp av useRef
Hook. useRef
returnerer et muterbart ref-objekt hvis .current
-egenskap initialiseres med det gitte argumentet (initialValue
). Det returnerte objektet vil bestÄ gjennom hele komponentens levetid.
import React, { useRef, useEffect } from 'react';
function MyFunctionalComponent() {
const inputRef = useRef(null);
useEffect(() => {
if (inputRef.current) {
inputRef.current.focus();
}
}, []);
return ;
}
I dette eksempelet oppretter useRef(null)
et ref-objekt som tildeles inputRef
-variabelen. useEffect
Hook brukes til Ä fokusere pÄ input-feltet etter at komponenten har rendret. Den tomme avhengighetslisten []
sikrer at effekten kun kjÞres én gang, etter den fÞrste renderen.
Avanserte BruksomrÄder og Vurderinger
Utover de grunnleggende bruksomrÄdene kan createRef
benyttes i mer avanserte scenarier:
- Videresending av Refs (Forwarding Refs): React tilbyr en mekanisme kalt
React.forwardRef
som lar deg sende en ref gjennom en komponent til et av dens barn. Dette er nyttig nÄr du trenger tilgang til en DOM-node i en barnekomponent fra en forelderkomponent.import React, { forwardRef } from 'react'; const FancyInput = forwardRef((props, ref) => ( )); class ParentComponent extends React.Component { constructor(props) { super(props); this.inputRef = React.createRef(); } componentDidMount() { this.inputRef.current.focus(); } render() { return
; } } I dette eksempelet bruker
FancyInput
-komponentenforwardRef
for Ă„ videresende ref-en til det underliggende input-elementet.ParentComponent
kan deretter fÄ tilgang til og manipulere input-elementet gjennom ref-en. - Higher-Order Components (HOCs): NÄr du bruker Higher-Order Components (HOCs), kan det hende du mÄ hÄndtere refs nÞye. Hvis HOC-en omslutter en komponent som bruker refs, mÄ du sÞrge for at refs blir videresendt korrekt.
import React, { forwardRef } from 'react'; function withRef(WrappedComponent) { const WithRef = forwardRef((props, ref) => { return
; }); WithRef.displayName = `withRef(${WrappedComponent.displayName || WrappedComponent.name || 'Component'})`; return WithRef; } class MyComponent extends React.Component { render() { return Min Komponent; } } const EnhancedComponent = withRef(MyComponent); - Server-Side Rendering (SSR): NÄr du bruker server-side rendering, vÊr oppmerksom pÄ at refs kanskje ikke er tilgjengelige under den fÞrste renderen pÄ serveren. Dette er fordi DOM ikke er tilgjengelig pÄ serveren. Du bÞr kun fÄ tilgang til refs etter at komponenten er montert pÄ klienten.
Konklusjon
createRef
er et kraftig verktÞy for Ä fÄ tilgang til DOM-noder og komponentinstanser i React. Ved Ä forstÄ bruken, fordelene og beste praksis, kan du effektivt utnytte refs for Ä bygge mer interaktive og dynamiske brukergrensesnitt. Enten du fokuserer pÄ tekstinput, hÄndterer medieavspilling eller integrerer med tredjepartsbiblioteker, gir createRef
en kontrollert og effektiv mÄte Ä samhandle med DOM pÄ.
Husk Ă„ bruke createRef
med omhu, og foretrekk deklarative tilnÊrminger nÄr det er mulig. Ved Ä fÞlge retningslinjene som er beskrevet i denne guiden, kan du sikre at dine React-applikasjoner er ytelsesdyktige, vedlikeholdbare og skalerbare.
Etter hvert som du fortsetter din reise med React, vil mestring av createRef
utvilsomt vise seg Ä vÊre en verdifull ferdighet i ditt utviklerverktÞysett. Fortsett Ä eksperimentere, utforske forskjellige bruksomrÄder og finpusse din forstÄelse av denne essensielle React-funksjonen.