Ознайомтеся з потужними утилітами рендерингу DOM від React ReactDOM. Дізнайтеся про ReactDOM.render, hydrate, unmountComponentAtNode та findDOMNode для створення динамічних інтерфейсів.
React ReactDOM: Повний посібник з утиліт для рендерингу DOM
React — це потужна бібліотека JavaScript для створення користувацьких інтерфейсів. В її основі лежить абстрагування від прямого маніпулювання об'єктною моделлю документа (DOM), що дозволяє розробникам зосередитися на описі бажаного стану свого UI. Однак самому React потрібен спосіб взаємодії з DOM браузера, щоб втілити ці описи UI в життя. Саме тут на допомогу приходить ReactDOM. Цей пакет надає спеціальні методи для рендерингу компонентів React у DOM та управління їхньою взаємодією з ним.
Розуміння ролі ReactDOM
ReactDOM діє як міст між світом компонентів React та DOM браузера. Він пропонує функціонал для рендерингу компонентів React у конкретні вузли DOM, оновлення їх при зміні даних і навіть видалення, коли вони більше не потрібні. Уявіть його як двигун, що керує візуальним представленням вашого додатку React у браузері.
Важливо розрізняти React та ReactDOM. React — це основна бібліотека для створення компонентів та управління станом. ReactDOM відповідає за те, щоб взяти ці компоненти та відрендерити їх у DOM браузера. Хоча React можна використовувати в інших середовищах (наприклад, React Native для мобільної розробки, що використовує іншу бібліотеку рендерингу), ReactDOM спеціально розроблений для веб-додатків.
Ключові методи ReactDOM
Розглянемо деякі з найважливіших методів, що надаються пакетом ReactDOM:
ReactDOM.render()
Метод ReactDOM.render()
є основою будь-якого додатку React. Він відповідає за монтування компонента React (або дерева компонентів) у вказаний вузол DOM. Цей вузол зазвичай є порожнім HTML-елементом на вашій сторінці.
Синтаксис:
ReactDOM.render(element, container[, callback])
element
: Елемент React, який ви хочете відрендерити. Зазвичай це компонент верхнього рівня вашого додатку.container
: Елемент DOM, куди ви хочете змонтувати компонент. Це має бути валідний вузол DOM у вашому HTML.callback
(необов'язково): Функція, яка буде виконана після рендерингу компонента.
Приклад:
Припустимо, у вас є простий компонент React під назвою 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>
);
}
І HTML-файл з елементом з ID "root":
<div id="root"></div>
Щоб відрендерити компонент App
в елемент "root", ви б використали:
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<App />);
Важливе зауваження (React 18 і новіші версії): У React 18 та новіших версіях ReactDOM.render
вважається застарілим. Рекомендований підхід — використовувати ReactDOM.createRoot
, як показано вище. Це вмикає нові конкурентні можливості, представлені в React 18.
Розуміння оновлень: ReactDOM.render()
також відповідає за оновлення DOM, коли дані компонента змінюються. React використовує віртуальний DOM для ефективного порівняння поточного стану з бажаним і оновлює лише необхідні частини реального DOM, мінімізуючи накладні витрати на продуктивність.
ReactDOM.hydrate()
ReactDOM.hydrate()
використовується, коли ви рендерите додаток React, який вже був відрендерений на сервері. Це ключова техніка для покращення початкової швидкості завантаження вашого додатку та підвищення SEO.
Серверний рендеринг (SSR): У SSR компоненти React рендеряться в HTML на сервері. Цей HTML потім надсилається до браузера, який може негайно відобразити початковий вміст. Однак браузеру все ще потрібно "гідратувати" додаток – тобто приєднати обробники подій і зробити додаток інтерактивним. ReactDOM.hydrate()
бере відрендерений на сервері HTML і приєднує до нього обробники подій React, роблячи додаток повністю функціональним.
Синтаксис:
ReactDOM.hydrate(element, container[, callback])
Параметри такі ж, як і в ReactDOM.render()
.
Приклад:
На сервері ви б відрендерили свій додаток React у рядок:
import React from 'react';
import ReactDOMServer from 'react-dom/server';
import App from './App';
const html = ReactDOMServer.renderToString(<App />);
Цей HTML потім буде відправлено на клієнт.
На стороні клієнта ви б використали ReactDOM.hydrate()
для приєднання обробників подій React:
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.hydrate(<App />);
Переваги гідратації:
- Покращений час початкового завантаження: Користувачі бачать вміст негайно, ще до повного завантаження коду JavaScript.
- Покращене SEO: Пошукові системи можуть сканувати та індексувати повністю відрендерений HTML.
ReactDOM.unmountComponentAtNode()
ReactDOM.unmountComponentAtNode()
використовується для видалення змонтованого компонента з DOM. Це може бути корисно, коли вам потрібно динамічно видаляти частини вашого UI або коли ви очищуєте ресурси перед переходом на іншу сторінку.
Синтаксис:
ReactDOM.unmountComponentAtNode(container)
container
: Елемент DOM, де змонтовано компонент.
Приклад:
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 />);
// Пізніше, щоб розмонтувати компонент:
root.unmount();
Після виклику ReactDOM.unmountComponentAtNode(rootElement)
компонент App
буде видалено з DOM, а всі пов'язані з ним обробники подій та ресурси будуть очищені.
Коли використовувати:
- Видалення модального вікна або діалогу з UI.
- Очищення компонента перед переходом на іншу сторінку.
- Динамічне перемикання між різними компонентами.
ReactDOM.findDOMNode() (Застарілий)
Важливо: ReactDOM.findDOMNode()
вважається застарілим і не рекомендується для використання в сучасних додатках React. Раніше він використовувався для доступу до базового вузла DOM змонтованого компонента. Однак його використання не заохочується, оскільки це порушує абстракцію React і може призвести до непередбачуваної поведінки, особливо з появою функціональних компонентів та хуків.
Альтернативні підходи:
Замість використання ReactDOM.findDOMNode()
, розгляньте ці альтернативні підходи:
- Рефи (Refs): Використовуйте рефи React для прямого доступу до вузлів DOM. Це рекомендований підхід для взаємодії з елементами DOM.
- Контрольовані компоненти: Зробіть ваші компоненти "контрольованими", керуючи їхнім станом за допомогою React. Це дозволяє маніпулювати UI без прямого доступу до DOM.
- Обробники подій: Прикріплюйте обробники подій до ваших компонентів і використовуйте об'єкт події для доступу до цільового елемента DOM.
Конкурентність у React 18 та ReactDOM
React 18 представляє конкурентність — новий механізм, що дозволяє React переривати, призупиняти, відновлювати або скасовувати завдання рендерингу. Це відкриває потужні можливості, такі як переходи та вибіркова гідратація, що призводить до більш плавного та чутливого користувацького досвіду.
Вплив на ReactDOM: Використання ReactDOM.createRoot
є вирішальним для отримання переваг від конкурентності. Цей метод створює корінь, з якого рендериться ваш додаток, дозволяючи React ефективніше керувати завданнями рендерингу.
Переходи (Transitions): Переходи дозволяють позначати певні оновлення стану як нетермінові, що дає змогу React пріоритезувати важливіші оновлення та підтримувати чутливість інтерфейсу. Наприклад, при навігації між маршрутами ви можете позначити перехід як нетермінове оновлення, гарантуючи, що UI залишатиметься чутливим навіть під час завантаження даних.
Вибіркова гідратація (Selective Hydration): Завдяки вибірковій гідратації React може гідратувати окремі компоненти за вимогою, а не гідратувати весь додаток одразу. Це значно покращує час початкового завантаження для великих додатків.
Глобальні аспекти для React ReactDOM
При розробці додатків React для глобальної аудиторії важливо враховувати такі фактори, як інтернаціоналізація (i18n) та локалізація (l10n). Сам ReactDOM безпосередньо не займається цими аспектами, але його важливо інтегрувати з бібліотеками i18n та дотримуватися найкращих практик.
- Інтернаціоналізація (i18n): Процес проєктування та розробки додатків, які можна адаптувати до різних мов та регіонів без необхідності інженерних змін.
- Локалізація (l10n): Процес адаптації інтернаціоналізованого додатку для конкретної мови або регіону шляхом перекладу тексту, налаштування форматування та врахування культурних відмінностей.
Використання бібліотек i18n:
Бібліотеки, такі як react-i18next
та globalize
, надають інструменти для управління перекладами, форматуванням дати та часу та іншими завданнями, пов'язаними з локалізацією. Ці бібліотеки зазвичай бездоганно інтегруються з React та ReactDOM.
Приклад з 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>
);
}
У цьому прикладі хук useTranslation
надає доступ до функції перекладу t
, яка отримує відповідний переклад для заданого ключа. Самі переклади зазвичай зберігаються в окремих файлах для кожної мови.
Розкладка справа наліво (RTL):
Деякі мови, наприклад, арабська та іврит, пишуться справа наліво. При розробці додатків для цих мов потрібно забезпечити підтримку RTL-розкладки у вашому UI. Зазвичай це включає налаштування напрямку тексту, дзеркальне відображення макета компонентів та обробку двонаправленого тексту.
Найкращі практики використання ReactDOM
Щоб забезпечити ефективність та легкість у підтримці додатків React, дотримуйтесь цих найкращих практик при використанні ReactDOM:
- Використовуйте
ReactDOM.createRoot
у React 18 та новіших версіях: Це рекомендований спосіб рендерингу вашого додатку та використання переваг конкурентності. - Уникайте прямої маніпуляції DOM: Дозвольте React керувати DOM. Пряма маніпуляція DOM може призвести до неузгодженостей та проблем з продуктивністю.
- Використовуйте рефи з обережністю: Використовуйте рефи лише тоді, коли вам потрібен прямий доступ до вузлів DOM для конкретних цілей, наприклад, для фокусування на елементі вводу.
- Оптимізуйте продуктивність рендерингу: Використовуйте такі техніки, як мемоізація та shouldComponentUpdate, щоб запобігти непотрібним повторним рендерингам.
- Розгляньте можливість серверного рендерингу для покращення продуктивності та SEO.
- Використовуйте бібліотеки i18n для інтернаціоналізації та локалізації.
- Ретельно тестуйте свій додаток у різних браузерах та на різних пристроях.
Висновок
ReactDOM є невід'ємною частиною екосистеми React, що слугує мостом між компонентами React та DOM браузера. Розуміючи ключові методи, такі як ReactDOM.render()
, ReactDOM.hydrate()
та ReactDOM.unmountComponentAtNode()
, і дотримуючись найкращих практик, ви можете створювати продуктивні, легкі у підтримці та глобально доступні додатки React. З появою конкурентності в React 18, використання ReactDOM.createRoot
є вирішальним для розкриття нових рівнів продуктивності та чутливості. Не забувайте враховувати найкращі практики інтернаціоналізації та локалізації при створенні для глобальної аудиторії, щоб забезпечити по-справжньому інклюзивний та доступний користувацький досвід.