Odemkněte sílu React createRef pro přímý přístup k DOM. Tento průvodce nabízí praktické příklady a osvědčené postupy pro vývojáře.
Zvládnutí React createRef: Komplexní průvodce pro moderní vývoj
V dynamickém světě front-endového vývoje vyniká React jako výkonná a všestranná JavaScriptová knihovna pro tvorbu uživatelských rozhraní. Jednou z klíčových funkcí, která vývojářům v Reactu umožňuje přímou interakci s Document Object Model (DOM) a správu chování komponent, je API createRef. Tento průvodce se podrobně zabývá složitostmi createRef a poskytuje komplexní porozumění jeho použití, výhodám a osvědčeným postupům pro vývojáře po celém světě.
Porozumění refům v Reactu
Než se ponoříme do createRef, je nezbytné porozumět konceptu refů v Reactu. Ref poskytuje způsob, jak přistupovat k uzlům DOM nebo React elementům vytvořeným v metodě render. Tento přístup vám umožňuje provádět operace, jako je zaměření (focus) na vstupní pole, spouštění animací nebo měření velikosti prvku.
Na rozdíl od tradiční manipulace s DOM v JavaScriptu poskytují refy v Reactu kontrolovaný a efektivní způsob interakce s DOM. Virtuální DOM v Reactu abstrahuje mnoho složitostí přímé manipulace s DOM, ale refy nabízejí most, když je přímý přístup nezbytný.
Představení createRef
createRef je funkce poskytovaná Reactem, která vytváří ref objekt. Tento ref objekt má vlastnost current, která obsahuje uzel DOM nebo instanci React komponenty, ke které je ref připojen. API createRef bylo představeno jako součást Reactu 16.3 a je doporučeným způsobem vytváření refů v třídních komponentách. Pro funkcionální komponenty poskytuje podobnou funkcionalitu useRef (React Hook).
Vytvoření ref objektu
Pro vytvoření ref objektu jednoduše zavolejte funkci createRef():
import React from 'react';
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.myRef = React.createRef();
}
render() {
return (
);
}
}
V tomto příkladu je this.myRef ref objekt, který je přiřazen atributu ref vstupního prvku. Vlastnost current objektu this.myRef bude po připojení (mount) komponenty obsahovat odkaz na vstupní prvek.
Přístup k uzlu DOM
Jakmile je komponenta připojena (mounted), můžete přistupovat k uzlu DOM prostřednictvím vlastnosti current ref objektu:
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 tomto příkladu metoda focusInput používá this.myRef.current pro přístup k vstupnímu prvku a volání jeho metody focus(). Tím se automaticky zaměří na vstupní pole po připojení komponenty.
Případy použití createRef
createRef je cenný v různých scénářích, kde je vyžadována přímá manipulace s DOM nebo přístup k instancím komponent. Zde jsou některé běžné případy použití:
- Zaměřování textových vstupů: Jak bylo ukázáno v předchozím příkladu,
createRefse běžně používá k programovému zaměření na textové vstupy. To je užitečné pro zlepšení uživatelského zážitku automatickým zaměřením na první vstupní pole ve formuláři nebo zaměřením na vstupní pole po určité akci. - Správa přehrávání médií: Refy lze použít k ovládání mediálních prvků, jako jsou
<video>nebo<audio>. Pomocí refů můžete přehrávat, pozastavovat nebo upravovat hlasitost mediálních prvků. Například: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 (); } } - Spouštění animací: Refy lze použít k přístupu k prvkům DOM a spouštění animací pomocí JavaScriptu nebo CSS. To vám umožňuje vytvářet složité a interaktivní animace, které reagují na akce uživatele.
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 tomto příkladu kliknutí na tlačítko přidá třídu
animatek prvku box, což spustí CSS animaci. - Měření velikosti a pozice prvku: Refy jsou užitečné pro získání velikosti a pozice prvků DOM. Tyto informace lze použít pro výpočty rozložení, dynamické stylování nebo vytváření interaktivních prvků.
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
Tato komponenta hlásí šířku a výšku divu poté, co byl připojen.
- Integrace s knihovnami třetích stran: Refy se často používají k integraci React komponent s knihovnami třetích stran, které vyžadují přímý přístup k DOM. Například můžete použít ref pro přístup k prvku DOM a inicializaci jQuery pluginu na něm.
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. Callback Refy
Před zavedením createRef byly callback refy běžným způsobem přístupu k uzlům DOM v Reactu. Ačkoli jsou callback refy stále platné, createRef nabízí přímočařejší a méně rozvláčný přístup, zejména v třídních komponentách.
Callback ref je funkce, kterou React volá s uzlem DOM nebo instancí komponenty jako argumentem. Tuto funkci přiřadíte atributu ref prvku:
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 ;
}
}
Ačkoli tento přístup funguje, jeho správa může být složitější, zejména při práci s více refy. createRef tento proces zjednodušuje poskytnutím dedikovaného ref objektu.
Klíčové rozdíly:
- Čitelnost:
createRefje obecně považován za čitelnější a snáze pochopitelný. - Konzistence:
createRefposkytuje konzistentní způsob vytváření a přístupu k refům. - Výkon: V některých případech mohou callback refy způsobit zbytečné znovuvykreslení, protože callback funkce je při každém vykreslení novou funkcí.
createReftomuto problému předchází.
Osvědčené postupy pro používání createRef
Pro zajištění optimálního výkonu a udržovatelnosti dodržujte při používání createRef tyto osvědčené postupy:
- Používejte
createRefv třídních komponentách:createRefje navržen pro použití v třídních komponentách. Pro funkcionální komponenty použijte HookuseRef. - Vyvarujte se nadměrného používání refů: Refy by se měly používat střídmě. Nadměrné používání refů může vést ke kódu, který je obtížné udržovat a pochopit. Kdykoli je to možné, upřednostňujte deklarativní přístupy.
- Kontrola na null: Vždy zkontrolujte, zda je vlastnost
currentrefu null, než k ní přistoupíte, zejména v metodě životního cyklucomponentDidMount. Uzel DOM nemusí být dostupný ihned po připojení komponenty.componentDidMount() { if (this.myRef.current) { this.myRef.current.focus(); } } - Vyhněte se přímé úpravě DOM: Ačkoli refy poskytují přístup k DOM, vyhněte se přímé úpravě DOM, pokud to není absolutně nezbytné. Virtuální DOM Reactu poskytuje efektivní způsob aktualizace UI a přímá manipulace s DOM může narušit proces vykreslování Reactu.
- Vyčistěte refy, když je to nutné: V některých případech může být nutné vyčistit refy při odpojení (unmount) komponenty. To je zvláště důležité při práci s knihovnami třetích stran, které mohou držet odkazy na prvky DOM.
createRef ve funkcionálních komponentách s Hooky
Ačkoli se createRef primárně používá v třídních komponentách, funkcionální komponenty mohou dosáhnout podobné funkcionality pomocí Hooku useRef. useRef vrací měnitelný ref objekt, jehož vlastnost .current je inicializována předaným argumentem (initialValue). Vrácený objekt přetrvá po celou dobu životnosti komponenty.
import React, { useRef, useEffect } from 'react';
function MyFunctionalComponent() {
const inputRef = useRef(null);
useEffect(() => {
if (inputRef.current) {
inputRef.current.focus();
}
}, []);
return ;
}
V tomto příkladu useRef(null) vytváří ref objekt, který je přiřazen proměnné inputRef. Hook useEffect se používá k zaměření na vstupní pole poté, co se komponenta vykreslila. Prázdné pole závislostí [] zajišťuje, že se efekt spustí pouze jednou, po prvním vykreslení.
Pokročilé případy použití a úvahy
Kromě základních případů použití může být createRef použit i v pokročilejších scénářích:
- Předávání refů (Forwarding Refs): React poskytuje mechanismus zvaný
React.forwardRef, který umožňuje předat ref skrze komponentu jednomu z jejích potomků. To je užitečné, když potřebujete přistupovat k uzlu DOM v potomkovské komponentě z rodičovské komponenty.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 tomto příkladu komponenta
FancyInputpoužíváforwardRefk předání refu podkladovému prvku input. Rodičovská komponentaParentComponentpak může přistupovat k prvku input a manipulovat s ním prostřednictvím refu. - Komponenty vyššího řádu (HOCs): Při použití komponent vyššího řádu (HOCs) může být nutné s refy zacházet opatrně. Pokud HOC obaluje komponentu, která používá refy, musíte zajistit, že jsou refy správně předány.
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); - Vykreslování na straně serveru (SSR): Při použití vykreslování na straně serveru mějte na paměti, že refy nemusí být dostupné během počátečního vykreslení na serveru. Je to proto, že DOM není na serveru k dispozici. K refům byste měli přistupovat až poté, co byla komponenta připojena na klientovi.
Závěr
createRef je mocný nástroj pro přístup k uzlům DOM a instancím komponent v Reactu. Porozuměním jeho použití, výhodám a osvědčeným postupům můžete efektivně využívat refy k vytváření interaktivnějších a dynamičtějších uživatelských rozhraní. Ať už se zaměřujete na textové vstupy, spravujete přehrávání médií nebo integrujete s knihovnami třetích stran, createRef poskytuje kontrolovaný a efektivní způsob interakce s DOM.
Nezapomeňte používat createRef uvážlivě a upřednostňovat deklarativní přístupy, kdykoli je to možné. Dodržováním pokynů uvedených v tomto průvodci můžete zajistit, že vaše aplikace v Reactu budou výkonné, udržovatelné a škálovatelné.
Jak budete pokračovat ve své cestě s Reactem, zvládnutí createRef se nepochybně ukáže jako cenná dovednost ve vašem vývojářském arzenálu. Pokračujte v experimentování, zkoumání různých případů použití a zdokonalování svého porozumění této základní funkci Reactu.