Poznaj potężne narzędzia ReactDOM do renderowania DOM. Dowiedz się o ReactDOM.render, hydrate, unmountComponentAtNode i findDOMNode, aby tworzyć dynamiczne interfejsy użytkownika.
React ReactDOM: Kompleksowy przewodnik po narzędziach do renderowania DOM
React to potężna biblioteka JavaScript do tworzenia interfejsów użytkownika. W swojej istocie React abstrahuje od bezpośredniej manipulacji modelem obiektowym dokumentu (DOM), pozwalając programistom skupić się na opisywaniu pożądanego stanu interfejsu. Jednak sam React potrzebuje sposobu na interakcję z DOM przeglądarki, aby ożywić te opisy UI. Właśnie tutaj wkracza ReactDOM. Ten pakiet dostarcza specyficzne metody do renderowania komponentów React w DOM i zarządzania ich interakcją z nim.
Zrozumienie roli ReactDOM
ReactDOM działa jako most pomiędzy światem komponentów Reacta a DOM przeglądarki. Oferuje funkcjonalności do renderowania komponentów React w określonych węzłach DOM, aktualizowania ich, gdy zmieniają się dane, a nawet usuwania ich, gdy nie są już potrzebne. Można go postrzegać jako silnik napędzający wizualną reprezentację aplikacji React w przeglądarce.
Ważne jest, aby odróżnić React od ReactDOM. React to główna biblioteka do tworzenia komponentów i zarządzania stanem. ReactDOM jest odpowiedzialny za pobieranie tych komponentów i renderowanie ich w DOM przeglądarki. Chociaż React może być używany w innych środowiskach (takich jak React Native do tworzenia aplikacji mobilnych, który używa innej biblioteki renderującej), ReactDOM jest specjalnie zaprojektowany dla aplikacji internetowych.
Kluczowe metody ReactDOM
Przyjrzyjmy się niektórym z najważniejszych metod dostarczanych przez pakiet ReactDOM:
ReactDOM.render()
Metoda ReactDOM.render()
jest fundamentem każdej aplikacji React. Jest odpowiedzialna za zamontowanie komponentu React (lub drzewa komponentów) w określonym węźle DOM. Ten węzeł to zazwyczaj pusty element HTML na Twojej stronie.
Składnia:
ReactDOM.render(element, container[, callback])
element
: Element React, który chcesz wyrenderować. Zazwyczaj jest to komponent najwyższego poziomu Twojej aplikacji.container
: Element DOM, w którym chcesz zamontować komponent. Musi to być prawidłowy węzeł DOM w Twoim kodzie HTML.callback
(opcjonalnie): Funkcja, która zostanie wykonana po wyrenderowaniu komponentu.
Przykład:
Załóżmy, że masz prosty komponent React o nazwie 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>
);
}
I plik HTML z elementem o ID "root":
<div id="root"></div>
Aby wyrenderować komponent App
w elemencie "root", użyłbyś:
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<App />);
Ważna uwaga (React 18 i nowsze): W React 18 i nowszych wersjach ReactDOM.render
jest uważany za przestarzały. Zalecanym podejściem jest użycie ReactDOM.createRoot
, jak pokazano powyżej. Umożliwia to korzystanie z nowych funkcji współbieżności wprowadzonych w React 18.
Zrozumienie aktualizacji: ReactDOM.render()
jest również odpowiedzialne za aktualizowanie DOM, gdy dane komponentu się zmieniają. React używa wirtualnego DOM do efektywnego porównywania bieżącego stanu z pożądanym stanem i aktualizuje tylko niezbędne części rzeczywistego DOM, minimalizując narzut wydajnościowy.
ReactDOM.hydrate()
ReactDOM.hydrate()
jest używane, gdy renderujesz aplikację React, która została już wyrenderowana na serwerze. Jest to kluczowa technika poprawy wydajności początkowego ładowania aplikacji i wzmocnienia SEO.
Renderowanie po stronie serwera (SSR): W SSR komponenty React są renderowane do HTML na serwerze. Ten HTML jest następnie wysyłany do przeglądarki, która może natychmiast wyświetlić początkową zawartość. Jednak przeglądarka wciąż musi "nawodnić" (hydrate) aplikację – czyli dołączyć detektory zdarzeń (event listeners) i uczynić aplikację interaktywną. ReactDOM.hydrate()
pobiera wyrenderowany na serwerze HTML i dołącza do niego obsługę zdarzeń Reacta, czyniąc aplikację w pełni funkcjonalną.
Składnia:
ReactDOM.hydrate(element, container[, callback])
Parametry są takie same jak w ReactDOM.render()
.
Przykład:
Na serwerze wyrenderowałbyś swoją aplikację React do ciągu znaków:
import React from 'react';
import ReactDOMServer from 'react-dom/server';
import App from './App';
const html = ReactDOMServer.renderToString(<App />);
Ten HTML zostałby następnie wysłany do klienta.
Po stronie klienta użyłbyś ReactDOM.hydrate()
, aby dołączyć obsługę zdarzeń Reacta:
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.hydrate(<App />);
Korzyści z hydracji:
- Poprawiony czas początkowego ładowania: Użytkownicy widzą treść natychmiast, nawet przed pełnym załadowaniem kodu JavaScript.
- Ulepszone SEO: Wyszukiwarki mogą indeksować w pełni wyrenderowany kod HTML.
ReactDOM.unmountComponentAtNode()
ReactDOM.unmountComponentAtNode()
służy do usuwania zamontowanego komponentu z DOM. Może to być przydatne, gdy trzeba dynamicznie usuwać części interfejsu użytkownika lub gdy sprzątasz zasoby przed przejściem na inną stronę.
Składnia:
ReactDOM.unmountComponentAtNode(container)
container
: Element DOM, w którym komponent jest zamontowany.
Przykład:
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 />);
// Później, aby odmontować komponent:
root.unmount();
Po wywołaniu ReactDOM.unmountComponentAtNode(rootElement)
, komponent App
zostanie usunięty z DOM, a wszystkie powiązane z nim detektory zdarzeń i zasoby zostaną wyczyszczone.
Kiedy używać:
- Usuwanie modala lub okna dialogowego z interfejsu użytkownika.
- Czyszczenie komponentu przed przejściem na inną stronę.
- Dynamiczne przełączanie między różnymi komponentami.
ReactDOM.findDOMNode() (Przestarzałe)
Ważne: ReactDOM.findDOMNode()
jest uważane za przestarzałe i nie jest zalecane do użytku w nowoczesnych aplikacjach React. Wcześniej służyło do uzyskiwania dostępu do bazowego węzła DOM zamontowanego komponentu. Jednak jego użycie jest odradzane, ponieważ narusza abstrakcję Reacta i może prowadzić do nieprzewidywalnych zachowań, zwłaszcza po wprowadzeniu komponentów funkcyjnych i haków (hooks).
Alternatywne podejścia:
Zamiast używać ReactDOM.findDOMNode()
, rozważ te alternatywne podejścia:
- Refy: Używaj refów Reacta, aby uzyskać bezpośredni dostęp do węzłów DOM. Jest to zalecane podejście do interakcji z elementami DOM.
- Komponenty kontrolowane: Twórz komponenty "kontrolowane", zarządzając ich stanem za pomocą Reacta. Pozwala to na manipulowanie interfejsem użytkownika bez bezpośredniego dostępu do DOM.
- Obsługa zdarzeń: Dołączaj obsługę zdarzeń do swoich komponentów i używaj obiektu zdarzenia, aby uzyskać dostęp do docelowego elementu DOM.
Współbieżność w React 18 i ReactDOM
React 18 wprowadza współbieżność (concurrency), nowy mechanizm, który pozwala Reactowi przerywać, wstrzymywać, wznawiać lub porzucać zadania renderowania. Odblokowuje to potężne funkcje, takie jak przejścia (transitions) i selektywna hydracja, prowadząc do płynniejszego i bardziej responsywnego doświadczenia użytkownika.
Wpływ na ReactDOM: Zastosowanie ReactDOM.createRoot
jest kluczowe, aby wykorzystać korzyści płynące ze współbieżności. Ta metoda tworzy korzeń, z którego renderowana jest aplikacja, umożliwiając Reactowi bardziej efektywne zarządzanie zadaniami renderowania.
Przejścia (Transitions): Przejścia pozwalają oznaczyć pewne aktualizacje stanu jako niepilne, co pozwala Reactowi priorytetyzować ważniejsze aktualizacje i utrzymywać responsywność. Na przykład, podczas nawigacji między trasami, można oznaczyć przejście trasy jako niepilną aktualizację, zapewniając, że interfejs użytkownika pozostanie responsywny nawet podczas pobierania danych.
Selektywna hydracja: Dzięki selektywnej hydracji React może nawadniać poszczególne komponenty na żądanie, zamiast nawadniać całą aplikację naraz. To znacznie poprawia czas początkowego ładowania dużych aplikacji.
Globalne aspekty dotyczące React ReactDOM
Tworząc aplikacje React dla globalnej publiczności, ważne jest uwzględnienie takich czynników jak internacjonalizacja (i18n) i lokalizacja (l10n). Sam ReactDOM nie zajmuje się bezpośrednio tymi aspektami, ale kluczowe jest zintegrowanie go z bibliotekami i18n i najlepszymi praktykami.
- Internacjonalizacja (i18n): Proces projektowania i tworzenia aplikacji, które można dostosować do różnych języków i regionów bez konieczności wprowadzania zmian inżynieryjnych.
- Lokalizacja (l10n): Proces adaptacji zinternacjonalizowanej aplikacji do konkretnego języka lub regionu poprzez tłumaczenie tekstu, dostosowywanie formatowania i uwzględnianie różnic kulturowych.
Używanie bibliotek i18n:
Biblioteki takie jak react-i18next
i globalize
dostarczają narzędzi do zarządzania tłumaczeniami, formatowaniem daty i czasu oraz innymi zadaniami związanymi z lokalizacją. Te biblioteki zazwyczaj bezproblemowo integrują się z Reactem i ReactDOM.
Przykład z 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>
);
}
W tym przykładzie hak useTranslation
zapewnia dostęp do funkcji tłumaczącej t
, która pobiera odpowiednie tłumaczenie dla danego klucza. Same tłumaczenia są zazwyczaj przechowywane w osobnych plikach dla każdego języka.
Układ od prawej do lewej (RTL):
Niektóre języki, takie jak arabski i hebrajski, są pisane od prawej do lewej. Tworząc aplikacje dla tych języków, należy upewnić się, że interfejs użytkownika obsługuje układ RTL. Zazwyczaj wiąże się to z dostosowaniem kierunku tekstu, lustrzanym odbiciem układu komponentów i obsługą tekstu dwukierunkowego.
Najlepsze praktyki używania ReactDOM
Aby zapewnić wydajne i łatwe w utrzymaniu aplikacje React, postępuj zgodnie z poniższymi najlepszymi praktykami podczas korzystania z ReactDOM:
- Używaj
ReactDOM.createRoot
w React 18 i nowszych wersjach: Jest to zalecany sposób renderowania aplikacji i wykorzystania zalet współbieżności. - Unikaj bezpośredniej manipulacji DOM: Pozwól Reactowi zarządzać DOM. Bezpośrednia manipulacja DOM może prowadzić do niespójności i problemów z wydajnością.
- Używaj refów oszczędnie: Używaj refów tylko wtedy, gdy potrzebujesz bezpośredniego dostępu do węzłów DOM w określonych celach, takich jak ustawienie fokusu na elemencie input.
- Optymalizuj wydajność renderowania: Używaj technik takich jak memoizacja i shouldComponentUpdate, aby zapobiegać niepotrzebnym ponownym renderowaniom.
- Rozważ renderowanie po stronie serwera w celu poprawy wydajności i SEO.
- Używaj bibliotek i18n do internacjonalizacji i lokalizacji.
- Dokładnie testuj swoją aplikację na różnych przeglądarkach i urządzeniach.
Podsumowanie
ReactDOM jest niezbędną częścią ekosystemu React, stanowiąc most między komponentami React a DOM przeglądarki. Rozumiejąc kluczowe metody, takie jak ReactDOM.render()
, ReactDOM.hydrate()
i ReactDOM.unmountComponentAtNode()
, oraz stosując najlepsze praktyki, możesz tworzyć wydajne, łatwe w utrzymaniu i globalnie dostępne aplikacje React. Wraz z wprowadzeniem współbieżności w React 18, przyjęcie ReactDOM.createRoot
jest kluczowe dla odblokowania nowych poziomów wydajności i responsywności. Pamiętaj, aby uwzględniać najlepsze praktyki internacjonalizacji i lokalizacji podczas tworzenia dla globalnej publiczności, aby stworzyć prawdziwie inkluzywne i dostępne doświadczenia użytkownika.