Odkrijte moč Reactove funkcije createRef za neposreden dostop do DOM-a in interakcijo med komponentami. Ta vodnik ponuja praktične primere in najboljše prakse za razvijalce po vsem svetu.
Obvladovanje React createRef: Obsežen vodnik za sodoben razvoj
V dinamičnem svetu front-end razvoja React izstopa kot močna in vsestranska JavaScript knjižnica za gradnjo uporabniških vmesnikov. Ena ključnih funkcij, ki razvijalcem v Reactu omogoča neposredno interakcijo z objektnim modelom dokumenta (DOM) in upravljanje obnašanja komponent, je API createRef
. Ta vodnik se poglablja v podrobnosti funkcije createRef
ter ponuja celovito razumevanje njene uporabe, prednosti in najboljših praks za razvijalce po vsem svetu.
Razumevanje React refov
Preden se poglobimo v createRef
, je bistveno razumeti koncept refov v Reactu. Ref omogoča dostop do DOM vozlišč ali React elementov, ustvarjenih v metodi render. Ta dostop vam omogoča izvajanje operacij, kot so fokusiranje vnosnega polja, sprožanje animacij ali merjenje velikosti elementa.
Za razliko od tradicionalne manipulacije DOM-a v JavaScriptu, refi v Reactu zagotavljajo nadzorovan in učinkovit način interakcije z DOM-om. Reactov virtualni DOM abstrahira večino zapletenosti neposredne manipulacije DOM-a, vendar refi ponujajo most, kadar je neposreden dostop nujen.
Predstavitev createRef
createRef
je funkcija, ki jo ponuja React in ustvari ref objekt. Ta ref objekt ima lastnost current
, ki vsebuje DOM vozlišče ali primerek React komponente, na katerega je ref pritrjen. API createRef
je bil predstavljen kot del Reacta 16.3 in je priporočen način za ustvarjanje refov v razrednih komponentah. Za funkcijske komponente podobno funkcionalnost ponuja useRef
(React Hook).
Ustvarjanje ref objekta
Za ustvarjanje ref objekta preprosto pokličite funkcijo createRef()
:
import React from 'react';
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.myRef = React.createRef();
}
render() {
return (
);
}
}
V tem primeru je this.myRef
ref objekt, ki je dodeljen atributu ref
vnosnega elementa. Lastnost current
objekta this.myRef
bo po vgradnji komponente vsebovala referenco na vnosni element.
Dostopanje do DOM vozlišča
Ko je komponenta vgrajena, lahko do DOM vozlišča dostopate preko lastnosti current
ref objekta:
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 (
);
}
}
V tem primeru metoda focusInput
uporablja this.myRef.current
za dostop do vnosnega elementa in klic njegove metode focus()
. To bo samodejno fokusiralo vnosno polje, ko bo komponenta vgrajena.
Primeri uporabe createRef
createRef
je dragocen v različnih scenarijih, kjer je potrebna neposredna manipulacija DOM-a ali dostop do primerkov komponent. Tukaj je nekaj pogostih primerov uporabe:
- Fokusiranje vnosnih polj z besedilom: Kot je prikazano v prejšnjem primeru, se
createRef
pogosto uporablja za programsko fokusiranje vnosnih polj. To je uporabno za izboljšanje uporabniške izkušnje s samodejnim fokusiranjem prvega vnosnega polja v obrazcu ali fokusiranjem vnosnega polja po določenem dejanju. - Upravljanje predvajanja medijev: Refi se lahko uporabljajo za nadzor medijskih elementov, kot sta
<video>
ali<audio>
. Refe lahko uporabite za predvajanje, pavziranje ali prilagajanje glasnosti medijskih elementov. Na primer: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 (
- Sprožanje animacij: Refi se lahko uporabljajo za dostop do DOM elementov in sprožanje animacij z uporabo JavaScripta ali CSS. To vam omogoča ustvarjanje kompleksnih in interaktivnih animacij, ki se odzivajo na dejanja uporabnikov.
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 (
V tem primeru bo klik na gumb dodal razred
animate
elementu 'box', kar bo sprožilo CSS animacijo. - Merjenje velikosti in položaja elementov: Refi so uporabni za pridobivanje velikosti in položaja DOM elementov. Te informacije se lahko uporabijo za izračune postavitve, dinamično stiliziranje ali ustvarjanje interaktivnih elementov.
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 (
Width: {this.state.width}px, Height: {this.state.height}px
Ta komponenta poroča o širini in višini elementa div, potem ko je bil vgrajen.
- Integracija s knjižnicami tretjih oseb: Refi se pogosto uporabljajo za integracijo React komponent s knjižnicami tretjih oseb, ki zahtevajo neposreden dostop do DOM-a. Na primer, ref lahko uporabite za dostop do DOM elementa in na njem inicializirate jQuery vtičnik.
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(); // Initialize jQuery plugin } render() { return ; } }
createRef
v primerjavi s povratnimi (callback) refi
Pred uvedbo createRef
so bili povratni refi pogost način za dostop do DOM vozlišč v Reactu. Čeprav so povratni refi še vedno veljavni, createRef
ponuja bolj enostaven in manj zgovoren pristop, zlasti v razrednih komponentah.
Povratni ref je funkcija, ki jo React pokliče z DOM vozliščem ali primerkom komponente kot argumentom. To funkcijo dodelite atributu ref
elementa:
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 ;
}
}
Čeprav ta pristop deluje, je lahko upravljanje bolj zapleteno, zlasti pri delu z več refi. createRef
poenostavi ta postopek z zagotavljanjem namenskega ref objekta.
Ključne razlike:
- Berljivost:
createRef
se na splošno šteje za bolj berljivega in lažjega za razumevanje. - Doslednost:
createRef
zagotavlja dosleden način za ustvarjanje in dostopanje do refov. - Zmogljivost: V nekaterih primerih lahko povratni refi povzročijo nepotrebna ponovna upodabljanja, ker je povratna funkcija nova funkcija pri vsakem upodabljanju.
createRef
se tej težavi izogne.
Najboljše prakse za uporabo createRef
Za zagotovitev optimalne zmogljivosti in vzdržljivosti upoštevajte te najboljše prakse pri uporabi createRef
:
- Uporabljajte
createRef
v razrednih komponentah:createRef
je zasnovan za uporabo v razrednih komponentah. Za funkcijske komponente uporabite HookuseRef
. - Izogibajte se prekomerni uporabi refov: Refe je treba uporabljati zmerno. Prekomerna uporaba refov lahko vodi do kode, ki jo je težko vzdrževati in razumeti. Kadarkoli je mogoče, dajte prednost deklarativnim pristopom.
- Preverjanje za null: Vedno preverite, ali je lastnost
current
refa null, preden do nje dostopate, zlasti v življenjski metodicomponentDidMount
. DOM vozlišče morda ne bo na voljo takoj po vgradnji komponente.componentDidMount() { if (this.myRef.current) { this.myRef.current.focus(); } }
- Izogibajte se neposrednemu spreminjanju DOM-a: Čeprav refi omogočajo dostop do DOM-a, se izogibajte neposrednemu spreminjanju DOM-a, razen če je to nujno potrebno. Reactov virtualni DOM zagotavlja učinkovit način za posodabljanje uporabniškega vmesnika, neposredna manipulacija DOM-a pa lahko moti Reactov proces upodabljanja.
- Po potrebi počistite refe: V nekaterih primerih boste morda morali počistiti refe, ko se komponenta odstrani. To je še posebej pomembno pri delu s knjižnicami tretjih oseb, ki lahko hranijo reference na DOM elemente.
createRef
v funkcijskih komponentah s Hooki
Čeprav se createRef
primarno uporablja v razrednih komponentah, lahko funkcijske komponente dosežejo podobno funkcionalnost z uporabo Hooka useRef
. useRef
vrne spremenljiv ref objekt, katerega lastnost .current
je inicializirana s posredovanim argumentom (initialValue
). Vrnjeni objekt bo obstajal skozi celotno življenjsko dobo komponente.
import React, { useRef, useEffect } from 'react';
function MyFunctionalComponent() {
const inputRef = useRef(null);
useEffect(() => {
if (inputRef.current) {
inputRef.current.focus();
}
}, []);
return ;
}
V tem primeru useRef(null)
ustvari ref objekt, ki je dodeljen spremenljivki inputRef
. Hook useEffect
se uporablja za fokusiranje vnosnega polja, potem ko se komponenta upodobi. Prazna matrika odvisnosti []
zagotavlja, da se učinek izvede samo enkrat, po začetnem upodabljanju.
Napredni primeri uporabe in premisleki
Poleg osnovnih primerov uporabe se lahko createRef
uporablja tudi v bolj naprednih scenarijih:
- Posredovanje refov: React ponuja mehanizem, imenovan
React.forwardRef
, ki omogoča posredovanje refa skozi komponento enemu od njenih otrok. To je uporabno, kadar morate dostopati do DOM vozlišča znotraj otroške komponente iz starševske komponente.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
; } } V tem primeru komponenta
FancyInput
uporabljaforwardRef
za posredovanje refa osnovnemu vnosnemu elementu.ParentComponent
lahko nato dostopa do vnosnega elementa in ga manipulira preko refa. - Komponente višjega reda (HOC): Pri uporabi komponent višjega reda (HOC) boste morda morali pazljivo ravnati z refi. Če HOC ovije komponento, ki uporablja refe, morate zagotoviti, da so refi pravilno posredovani.
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 My Component; } } const EnhancedComponent = withRef(MyComponent); - Upodabljanje na strani strežnika (SSR): Pri uporabi upodabljanja na strani strežnika se zavedajte, da refi morda ne bodo na voljo med začetnim upodabljanjem na strežniku. To je zato, ker DOM na strežniku ni na voljo. Do refov dostopajte šele, ko je komponenta vgrajena na odjemalcu.
Zaključek
createRef
je močno orodje za dostopanje do DOM vozlišč in primerkov komponent v Reactu. Z razumevanjem njegove uporabe, prednosti in najboljših praks lahko učinkovito izkoristite refe za gradnjo bolj interaktivnih in dinamičnih uporabniških vmesnikov. Ne glede na to, ali fokusirate vnosna polja, upravljate predvajanje medijev ali se integrirate s knjižnicami tretjih oseb, createRef
zagotavlja nadzorovan in učinkovit način interakcije z DOM-om.
Ne pozabite uporabljati createRef
preudarno in dajati prednost deklarativnim pristopom, kadarkoli je to mogoče. Z upoštevanjem smernic, opisanih v tem vodniku, lahko zagotovite, da so vaše React aplikacije zmogljive, vzdržljive in razširljive.
Ko nadaljujete svojo pot z Reactom, se bo obvladovanje createRef
nedvomno izkazalo za dragoceno veščino v vašem razvijalskem orodjarniku. Nadaljujte z eksperimentiranjem, raziskovanjem različnih primerov uporabe in izpopolnjevanjem svojega razumevanja te bistvene funkcije Reacta.