Prozkoumejte výkonné nástroje pro vykreslování DOM v React ReactDOM. Naučte se používat metody render, hydrate, unmountComponentAtNode a findDOMNode.
React ReactDOM: Komplexní průvodce nástroji pro vykreslování DOM
React je výkonná JavaScriptová knihovna pro tvorbu uživatelských rozhraní. Ve svém jádru React abstrahuje od přímé manipulace s Document Object Modelem (DOM), což umožňuje vývojářům soustředit se na popis požadovaného stavu jejich UI. Samotný React však potřebuje způsob, jak interagovat s DOM prohlížeče, aby tyto popisy UI oživil. A právě zde přichází na řadu ReactDOM. Tento balíček poskytuje specifické metody pro vykreslování React komponent do DOM a správu jejich interakce s ním.
Pochopení role ReactDOM
ReactDOM funguje jako most mezi světem komponent Reactu a DOM prohlížeče. Nabízí funkcionality pro vykreslování React komponent do specifických DOM uzlů, jejich aktualizaci při změně dat a dokonce i jejich odstranění, když už nejsou potřeba. Představte si ho jako motor, který pohání vizuální reprezentaci vaší React aplikace v prohlížeči.
Je důležité rozlišovat mezi Reactem a ReactDOM. React je jádrová knihovna pro vytváření komponent a správu stavu. ReactDOM je zodpovědný za převzetí těchto komponent a jejich vykreslení do DOM prohlížeče. Zatímco React může být použit i v jiných prostředích (jako React Native pro mobilní vývoj, který používá jinou vykreslovací knihovnu), ReactDOM je specificky navržen pro webové aplikace.
Klíčové metody ReactDOM
Pojďme prozkoumat některé z nejdůležitějších metod, které balíček ReactDOM poskytuje:
ReactDOM.render()
Metoda ReactDOM.render()
je základem každé React aplikace. Je zodpovědná za připojení (mounting) React komponenty (nebo stromu komponent) do specifikovaného DOM uzlu. Tímto uzlem je typicky prázdný HTML element na vaší stránce.
Syntaxe:
ReactDOM.render(element, container[, callback])
element
: React element, který chcete vykreslit. Obvykle se jedná o komponentu nejvyšší úrovně vaší aplikace.container
: DOM element, kam chcete komponentu připojit. Měl by to být platný DOM uzel ve vašem HTML.callback
(volitelný): Funkce, která bude spuštěna po vykreslení komponenty.
Příklad:
Řekněme, že máte jednoduchou React komponentu s názvem App
:
import React from 'react';
import ReactDOM from 'react-dom/client';
function App() {
return (
<div>
<h1>Hello, React!</h1>
<p>This is a simple React component.</p>
</div>
);
}
A HTML soubor s elementem s ID "root":
<div id="root"></div>
Pro vykreslení komponenty App
do elementu "root" byste použili:
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<App />);
Důležitá poznámka (React 18 a novější): V Reactu 18 a novějších verzích je ReactDOM.render
považováno za zastaralé. Doporučeným přístupem je použití ReactDOM.createRoot
, jak je ukázáno výše. To umožňuje nové souběžné (concurrent) funkce zavedené v Reactu 18.
Pochopení aktualizací: ReactDOM.render()
je také zodpovědné za aktualizaci DOM, když se změní data komponenty. React používá virtuální DOM k efektivnímu porovnání aktuálního stavu s požadovaným stavem a aktualizuje pouze nezbytné části skutečného DOM, čímž minimalizuje zátěž na výkon.
ReactDOM.hydrate()
ReactDOM.hydrate()
se používá, když vykreslujete React aplikaci, která již byla vykreslena na serveru. Jedná se o klíčovou techniku pro zlepšení výkonu počátečního načítání vaší aplikace a vylepšení SEO.
Vykreslování na straně serveru (SSR): Při SSR jsou React komponenty vykresleny do HTML na serveru. Toto HTML je poté odesláno do prohlížeče, který může okamžitě zobrazit počáteční obsah. Prohlížeč však stále potřebuje aplikaci "hydratovat" – tedy připojit posluchače událostí a učinit aplikaci interaktivní. ReactDOM.hydrate()
vezme serverem vykreslené HTML a připojí k němu React handlery událostí, čímž aplikaci plně zprovozní.
Syntaxe:
ReactDOM.hydrate(element, container[, callback])
Parametry jsou stejné jako u ReactDOM.render()
.
Příklad:
Na serveru byste vykreslili svou React aplikaci do řetězce:
import React from 'react';
import ReactDOMServer from 'react-dom/server';
import App from './App';
const html = ReactDOMServer.renderToString(<App />);
Toto HTML by pak bylo odesláno klientovi.
Na straně klienta byste použili ReactDOM.hydrate()
k připojení React handlerů událostí:
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.hydrate(<App />);
Výhody hydratace:
- Zlepšená doba počátečního načítání: Uživatelé vidí obsah okamžitě, ještě před úplným načtením JavaScriptového kódu.
- Vylepšené SEO: Vyhledávače mohou procházet a indexovat plně vykreslené HTML.
ReactDOM.unmountComponentAtNode()
ReactDOM.unmountComponentAtNode()
se používá k odstranění připojené komponenty z DOM. To může být užitečné, když potřebujete dynamicky odstraňovat části vašeho UI nebo když uklízíte zdroje před přechodem na jinou stránku.
Syntaxe:
ReactDOM.unmountComponentAtNode(container)
container
: DOM element, kde je komponenta připojena.
Příklad:
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
const rootElement = document.getElementById('root');
const root = ReactDOM.createRoot(rootElement);
root.render(<App />);
// Později, pro odpojení komponenty:
root.unmount();
Po zavolání ReactDOM.unmountComponentAtNode(rootElement)
bude komponenta App
odstraněna z DOM a všechny posluchače událostí a zdroje s ní spojené budou uklizeny.
Kdy použít:
- Odstranění modálního okna nebo dialogu z UI.
- Uklizení komponenty před přechodem na jinou stránku.
- Dynamické přepínání mezi různými komponentami.
ReactDOM.findDOMNode() (Zastaralé)
Důležité: ReactDOM.findDOMNode()
je považováno za zastaralé a jeho použití v moderních React aplikacích se nedoporučuje. Dříve se používalo k získání přístupu k podkladovému DOM uzlu připojené komponenty. Jeho použití je však odrazováno, protože porušuje abstrakci Reactu a může vést k nepředvídatelnému chování, zejména se zavedením funkcionálních komponent a hooků.
Alternativní přístupy:
Místo použití ReactDOM.findDOMNode()
zvažte tyto alternativní přístupy:
- Refs: Použijte React refs pro přímý přístup k DOM uzlům. Toto je doporučený přístup pro interakci s DOM elementy.
- Řízené komponenty (Controlled Components): Učiňte své komponenty "řízenými" spravováním jejich stavu pomocí Reactu. To vám umožní manipulovat s UI bez přímého přístupu k DOM.
- Handlery událostí: Připojte handlery událostí ke svým komponentám a použijte objekt události k přístupu k cílovému DOM elementu.
Souběžnost v React 18 a ReactDOM
React 18 přináší souběžnost (concurrency), nový mechanismus, který umožňuje Reactu přerušovat, pozastavovat, obnovovat nebo opouštět úlohy vykreslování. To odemyká výkonné funkce jako přechody (transitions) a selektivní hydrataci, což vede k plynulejšímu a responzivnějšímu uživatelskému zážitku.
Dopad na ReactDOM: Přijetí ReactDOM.createRoot
je klíčové pro využití výhod souběžnosti. Tato metoda vytváří kořen, ze kterého je vaše aplikace vykreslována, což umožňuje Reactu efektivněji spravovat úlohy vykreslování.
Přechody (Transitions): Přechody vám umožňují označit určité aktualizace stavu jako neurgentní, což Reactu umožňuje upřednostnit důležitější aktualizace a udržet responzivitu. Například při přechodu mezi trasami můžete přechod trasy označit jako neurgentní aktualizaci, což zajistí, že UI zůstane responzivní i během načítání dat.
Selektivní hydratace: S selektivní hydratací může React hydratovat jednotlivé komponenty na vyžádání, místo hydratace celé aplikace najednou. To výrazně zlepšuje dobu počátečního načítání u velkých aplikací.
Globální aspekty pro React ReactDOM
Při vývoji React aplikací pro globální publikum je důležité zvážit faktory jako internacionalizace (i18n) a lokalizace (l10n). Samotný ReactDOM se těmito aspekty přímo nezabývá, ale je klíčové ho integrovat s i18n knihovnami a osvědčenými postupy.
- Internacionalizace (i18n): Proces navrhování a vývoje aplikací tak, aby mohly být přizpůsobeny různým jazykům a regionům bez nutnosti technických změn.
- Lokalizace (l10n): Proces přizpůsobení internacionalizované aplikace pro konkrétní jazyk nebo region překladem textu, úpravou formátování a řešením kulturních rozdílů.
Použití i18n knihoven:
Knihovny jako react-i18next
a globalize
poskytují nástroje pro správu překladů, formátování data a času a další úkoly související s lokalizací. Tyto knihovny se obvykle bezproblémově integrují s Reactem a ReactDOM.
Příklad s react-i18next:
import React from 'react';
import { useTranslation } from 'react-i18next';
function MyComponent() {
const { t } = useTranslation();
return (
<div>
<h1>{t('greeting')}</h1>
<p>{t('description')}</p>
</div>
);
}
V tomto příkladu poskytuje hook useTranslation
přístup k překladové funkci t
, která načítá příslušný překlad pro daný klíč. Samotné překlady jsou obvykle uloženy v samostatných souborech pro každý jazyk.
Rozložení zprava doleva (RTL):
Některé jazyky, jako arabština a hebrejština, se píší zprava doleva. Při vývoji aplikací pro tyto jazyky je třeba zajistit, aby vaše UI podporovalo RTL rozložení. To obvykle zahrnuje úpravu směru textu, zrcadlení rozložení komponent a zpracování obousměrného textu.
Osvědčené postupy pro používání ReactDOM
Pro zajištění efektivních a udržitelných React aplikací dodržujte při používání ReactDOM tyto osvědčené postupy:
- Používejte
ReactDOM.createRoot
v Reactu 18 a novějších verzích: Toto je doporučený způsob vykreslování vaší aplikace a využití výhod souběžnosti. - Vyhněte se přímé manipulaci s DOM: Nechte React spravovat DOM. Přímá manipulace s DOM může vést k nekonzistencím a problémům s výkonem.
- Používejte refs s rozvahou: Refs používejte pouze tehdy, když potřebujete přímý přístup k DOM uzlům pro specifické účely, jako je zaměření na vstupní prvek.
- Optimalizujte výkon vykreslování: Používejte techniky jako memoizace a shouldComponentUpdate k zabránění zbytečným novým vykreslením.
- Zvažte vykreslování na straně serveru pro zlepšení výkonu a SEO.
- Používejte i18n knihovny pro internacionalizaci a lokalizaci.
- Důkladně testujte svou aplikaci v různých prohlížečích a na různých zařízeních.
Závěr
ReactDOM je nezbytnou součástí ekosystému React, poskytující most mezi React komponentami a DOM prohlížeče. Porozuměním klíčovým metodám jako ReactDOM.render()
, ReactDOM.hydrate()
a ReactDOM.unmountComponentAtNode()
a přijetím osvědčených postupů můžete vytvářet výkonné, udržitelné a globálně dostupné React aplikace. Se zavedením souběžnosti v Reactu 18 je přijetí ReactDOM.createRoot
klíčové pro odemčení nových úrovní výkonu a responzivity. Nezapomeňte zohlednit osvědčené postupy pro internacionalizaci a lokalizaci při tvorbě pro globální publikum, abyste vytvořili skutečně inkluzivní a přístupné uživatelské zážitky.