Hyödynnä Reactin createRef-funktion teho suoraan DOM-käsittelyyn ja komponenttien vuorovaikutukseen. Tämä opas tarjoaa käytännön esimerkkejä ja parhaita käytäntöjä.
Reactin createRef-funktion hallinta: Kattava opas moderniin kehitykseen
Frontend-kehityksen dynaamisessa maailmassa React erottuu tehokkaana ja monipuolisena JavaScript-kirjastona käyttöliittymien rakentamiseen. Yksi avainominaisuuksista, joka mahdollistaa React-kehittäjien suoran vuorovaikutuksen Document Object Modelin (DOM) kanssa ja komponenttien käyttäytymisen hallinnan, on createRef
-API. Tämä opas syventyy createRef
-funktion yksityiskohtiin ja tarjoaa kattavan ymmärryksen sen käytöstä, hyödyistä ja parhaista käytännöistä kehittäjille maailmanlaajuisesti.
Reactin ref-attribuuttien ymmärtäminen
Ennen createRef
-funktioon syventymistä on tärkeää ymmärtää ref-attribuuttien käsite Reactissa. Ref tarjoaa tavan päästä käsiksi render-metodissa luotuihin DOM-solmuihin tai React-elementteihin. Tämä mahdollistaa toimenpiteitä, kuten syöttökentän kohdistamisen, animaatioiden käynnistämisen tai elementin koon mittaamisen.
Toisin kuin perinteinen JavaScriptin DOM-manipulaatio, Reactin refit tarjoavat hallitun ja tehokkaan tavan olla vuorovaikutuksessa DOMin kanssa. Reactin virtuaalinen DOM piilottaa monet suoran DOM-manipulaation monimutkaisuudet, mutta refit tarjoavat sillan, kun suora pääsy on välttämätöntä.
Esittelyssä createRef
createRef
on Reactin tarjoama funktio, joka luo ref-olion. Tällä ref-oliolla on current
-ominaisuus, joka sisältää DOM-solmun tai React-komponentin instanssin, johon ref on liitetty. createRef
-API esiteltiin osana React 16.3:a, ja se on suositeltu tapa luoda ref-attribuutteja luokkakomponenteissa. Funktionaalisille komponenteille useRef
(React Hook) tarjoaa vastaavan toiminnallisuuden.
Ref-olion luominen
Luodaksesi ref-olion, kutsu yksinkertaisesti createRef()
-funktiota:
import React from 'react';
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.myRef = React.createRef();
}
render() {
return (
);
}
}
Tässä esimerkissä this.myRef
on ref-olio, joka on määritetty input-elementin ref
-attribuuttiin. this.myRef
-olion current
-ominaisuus sisältää viittauksen input-elementtiin komponentin liittämisen jälkeen.
DOM-solmuun käsiksi pääseminen
Kun komponentti on liitetty, voit päästä käsiksi DOM-solmuun ref-olion current
-ominaisuuden kautta:
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 (
);
}
}
Tässä esimerkissä focusInput
-metodi käyttää this.myRef.current
-ominaisuutta päästäkseen käsiksi input-elementtiin ja kutsuakseen sen focus()
-metodia. Tämä kohdistaa syöttökentän automaattisesti, kun komponentti on liitetty.
createRef
-funktion käyttötapauksia
createRef
on arvokas monissa tilanteissa, joissa vaaditaan suoraa DOM-manipulaatiota tai pääsyä komponentti-instansseihin. Tässä on joitakin yleisiä käyttötapauksia:
- Tekstinsyöttökenttien kohdistaminen: Kuten edellisessä esimerkissä nähtiin,
createRef
-funktiota käytetään yleisesti tekstinsyöttökenttien ohjelmalliseen kohdistamiseen. Tämä on hyödyllistä käyttäjäkokemuksen parantamiseksi kohdistamalla automaattisesti lomakkeen ensimmäinen syöttökenttä tai kohdistamalla syöttökenttä tietyn toiminnon jälkeen. - Median toiston hallinta: Refejä voidaan käyttää mediaelementtien, kuten
<video>
tai<audio>
, ohjaamiseen. Voit käyttää refejä mediaelementtien toistamiseen, keskeyttämiseen tai äänenvoimakkuuden säätämiseen. Esimerkiksi: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 (
- Animaatioiden käynnistäminen: Refejä voidaan käyttää DOM-elementteihin pääsemiseen ja animaatioiden käynnistämiseen JavaScriptin tai CSS:n avulla. Tämä mahdollistaa monimutkaisten ja interaktiivisten animaatioiden luomisen, jotka reagoivat käyttäjän toimiin.
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 (
Tässä esimerkissä napin painaminen lisää
animate
-luokan laatikkoelementtiin, mikä käynnistää CSS-animaation. - Elementin koon ja sijainnin mittaaminen: Refit ovat hyödyllisiä DOM-elementtien koon ja sijainnin selvittämiseen. Tätä tietoa voidaan käyttää asettelulaskelmissa, dynaamisessa tyylittelyssä tai interaktiivisten elementtien luomisessa.
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
Tämä komponentti raportoi div-elementin leveyden ja korkeuden sen liittämisen jälkeen.
- Integrointi kolmannen osapuolen kirjastojen kanssa: Refejä käytetään usein React-komponenttien integroimiseen kolmannen osapuolen kirjastoihin, jotka vaativat suoran pääsyn DOMiin. Voit esimerkiksi käyttää refiä päästäksesi käsiksi DOM-elementtiin ja alustaaksesi siinä jQuery-laajennuksen.
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
vs. takaisinkutsurefit (Callback Refs)
Ennen createRef
-funktion käyttöönottoa takaisinkutsurefit (callback refs) olivat yleinen tapa päästä käsiksi DOM-solmuihin Reactissa. Vaikka takaisinkutsurefit ovat edelleen päteviä, createRef
tarjoaa suoraviivaisemman ja vähemmän monisanaisen lähestymistavan, erityisesti luokkakomponenteissa.
Takaisinkutsuref on funktio, jota React kutsuu antaen argumentiksi DOM-solmun tai komponentti-instanssin. Määrität tämän funktion elementin ref
-attribuuttiin:
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 ;
}
}
Vaikka tämä lähestymistapa toimii, se voi olla monimutkaisempi hallita, erityisesti useiden refien kanssa. createRef
yksinkertaistaa tätä prosessia tarjoamalla erillisen ref-olion.
Keskeiset erot:
- Luettavuus:
createRef
-funktiota pidetään yleensä luettavampana ja helpommin ymmärrettävänä. - Johdonmukaisuus:
createRef
tarjoaa johdonmukaisen tavan luoda ja käyttää refejä. - Suorituskyky: Joissakin tapauksissa takaisinkutsurefit voivat aiheuttaa tarpeettomia uudelleenrenderöintejä, koska takaisinkutsufunktio on uusi funktio jokaisella renderöinnillä.
createRef
välttää tämän ongelman.
Parhaat käytännöt createRef
-funktion käyttöön
Varmistaaksesi optimaalisen suorituskyvyn ja ylläpidettävyyden, noudata näitä parhaita käytäntöjä käyttäessäsi createRef
-funktiota:
- Käytä
createRef
-funktiota luokkakomponenteissa:createRef
on suunniteltu käytettäväksi luokkakomponenteissa. Funktionaalisissa komponenteissa käytäuseRef
-Hookia. - Vältä refien liikakäyttöä: Refejä tulisi käyttää säästeliäästi. Refien liikakäyttö voi johtaa koodiin, jota on vaikea ylläpitää ja ymmärtää. Suosi deklaratiivisia lähestymistapoja aina kun mahdollista.
- Nollatarkistukset: Tarkista aina, onko refin
current
-ominaisuus null ennen sen käyttöä, erityisesticomponentDidMount
-elinkaarimetodissa. DOM-solmu ei välttämättä ole saatavilla heti komponentin liittämisen jälkeen.componentDidMount() { if (this.myRef.current) { this.myRef.current.focus(); } }
- Vältä DOMin suoraa muokkaamista: Vaikka refit antavat pääsyn DOMiin, vältä DOMin suoraa muokkaamista, ellei se ole ehdottoman välttämätöntä. Reactin virtuaalinen DOM tarjoaa tehokkaan tavan päivittää käyttöliittymää, ja suora DOM-manipulaatio voi häiritä Reactin renderöintiprosessia.
- Siivoa refit tarvittaessa: Joissakin tapauksissa saatat joutua siivoamaan refit, kun komponentti poistetaan. Tämä on erityisen tärkeää käsiteltäessä kolmannen osapuolen kirjastoja, jotka saattavat pitää viittauksia DOM-elementteihin.
createRef
funktionaalisissa komponenteissa Hookien avulla
Vaikka createRef
-funktiota käytetään pääasiassa luokkakomponenteissa, funktionaaliset komponentit voivat saavuttaa samanlaisen toiminnallisuuden käyttämällä useRef
-Hookia. useRef
palauttaa muuttuvan ref-olion, jonka .current
-ominaisuus alustetaan annetulla argumentilla (initialValue
). Palautettu olio säilyy komponentin koko elinkaaren ajan.
import React, { useRef, useEffect } from 'react';
function MyFunctionalComponent() {
const inputRef = useRef(null);
useEffect(() => {
if (inputRef.current) {
inputRef.current.focus();
}
}, []);
return ;
}
Tässä esimerkissä useRef(null)
luo ref-olion, joka on määritetty inputRef
-muuttujaan. useEffect
-Hookia käytetään syöttökentän kohdistamiseen komponentin renderöinnin jälkeen. Tyhjä riippuvuustaulukko []
varmistaa, että efekti suoritetaan vain kerran, alkuperäisen renderöinnin jälkeen.
Edistyneet käyttötapaukset ja huomioitavat asiat
Peruskäyttötapausten lisäksi createRef
-funktiota voidaan käyttää edistyneemmissä skenaarioissa:
- Refien edelleenlähetys (Forwarding Refs): React tarjoaa mekanismin nimeltä
React.forwardRef
, jonka avulla voit välittää refin komponentin läpi yhdelle sen lapsista. Tämä on hyödyllistä, kun sinun on päästävä käsiksi lapsikomponentin sisällä olevaan DOM-solmuun vanhempikomponentista.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
; } } Tässä esimerkissä
FancyInput
-komponentti käyttääforwardRef
-funktiota välittääkseen refin alla olevalle input-elementille.ParentComponent
voi sitten käyttää ja manipuloida input-elementtiä refin kautta. - Higher-Order Components (HOCs): Käytettäessä Higher-Order Components -komponentteja (HOC), saatat joutua käsittelemään refejä huolellisesti. Jos HOC käärii komponentin, joka käyttää refejä, sinun on varmistettava, että refit välitetään oikein.
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); - Palvelinpuolen renderöinti (SSR): Käytettäessä palvelinpuolen renderöintiä on syytä huomioida, että refit eivät välttämättä ole saatavilla palvelimella tapahtuvan alkuperäisen renderöinnin aikana. Tämä johtuu siitä, että DOM ei ole saatavilla palvelimella. Refejä tulisi käyttää vasta, kun komponentti on liitetty asiakaspuolella.
Yhteenveto
createRef
on tehokas työkalu DOM-solmuihin ja komponentti-instansseihin pääsemiseksi Reactissa. Ymmärtämällä sen käytön, hyödyt ja parhaat käytännöt voit tehokkaasti hyödyntää refejä rakentaaksesi interaktiivisempia ja dynaamisempia käyttöliittymiä. Olitpa sitten kohdistamassa tekstinsyöttökenttiä, hallitsemassa median toistoa tai integroimassa kolmannen osapuolen kirjastoja, createRef
tarjoaa hallitun ja tehokkaan tavan olla vuorovaikutuksessa DOMin kanssa.
Muista käyttää createRef
-funktiota harkitusti ja suosia deklaratiivisia lähestymistapoja aina kun mahdollista. Noudattamalla tässä oppaassa esitettyjä ohjeita voit varmistaa, että React-sovelluksesi ovat suorituskykyisiä, ylläpidettäviä ja skaalautuvia.
Kun jatkat matkaasi Reactin parissa, createRef
-funktion hallinta osoittautuu epäilemättä arvokkaaksi taidoksi kehitystyökalupakissasi. Jatka kokeilemista, erilaisten käyttötapausten tutkimista ja tämän olennaisen React-ominaisuuden ymmärryksen syventämistä.