JSX
const link = <a href="https://reactjs.org/">React website</a>;
Це не рядок і не HTML, цей XML-образний синтаксис називається JSX
(JavaScript
Syntax Extension) - розширення синтаксису JavaScript, за допомогою якого зручно
описувати розмітку того, що ми хочемо побачити на екрані.
- Дозволяє використовувати XML-образний синтаксис прямо у JavaScript
- Спрощує код, робить його декларативним та читабельним
- Описує об'єкти - елементи Virtual DOM
- Це не HTML, Babel трансформує JSX у виклики функцій
- У JSX можна використовувати всі можливості JavaScript
JSX створює елементи – найменші будівельні блоки React. Елементи Virtual DOM це звичайні JavaScript об'єкти, тому створювати їх дуже швидко.
Використовуючи JSX
, розмітка стає схожою на звичні HTML-шаблони.
const imageUrl = "https://images.pexels.com/photos/461198/pexels-photo-461198.jpeg?dpr=2&h=480&w=640";const productPrice = 10.99;const product = ( <div> <img src={imageUrl} alt="Tacos With Lime" width="640" /> <h2>Tacos With Lime</h2> <p>Price: {productPrice}$</p> <button type="button">Add to cart</button> </div>);
- Усередині JSX можна використовувати будь-який валідний вираз, обертаючи його в фігурні дужки.
- Значення атрибутів вказуються в подвійних лапках, якщо це звичайний рядок, та у фігурних дужках, якщо значення обчислюється, або тип відрізняється від рядка.
- Всі атрибути React-елементів іменуються в camelCase нотації.
- JSX-теги можуть бути батьками інших JSX-тегів. Якщо тег порожній або
самозакривається, його обов'язково необхідно закрити використовуючи
/>
.
Рендер елементів у DOM-дерево
Для того, щоб відрендерувати елемент у DOM-дерево, у пакеті react-dom
є методи
createRoot(container)
та render(element)
, які працюють разом.
- Перший приймає посилання на існуючий DOM-елемент, наприклад
div#root
зindex.html
і створює корінь, в який буде рендеруватись вся програма. - Другий чекає на посилання на React-елемент або компонент (що рендерити).
import ReactDOM from "react-dom/client";const imageUrl = "https://images.pexels.com/photos/461198/pexels-photo-461198.jpeg?dpr=2&h=480&w=640";const productPrice = 10.99;const product = ( <div> <img src={imageUrl} alt="Tacos With Lime" width="640" /> <h2>Tacos With Lime</h2> <p>Price: {productPrice}$</p> <button type="button">Add to cart</button> </div>);ReactDOM.createRoot(document.getElementById("root")).render(product);
render()
на програмуReact використовує модель відносин предок - нащадок, тому достатньо
використовувати лише один виклик render()
в програмі. Рендер найвищого
елемента в ієрархії потягне за собою рендер всього піддерева.
Правило спільного батька
Права частина висловлювання присвоювання має повертати одне значення. Розберемо наступний код із невалідною JSX-розміткою.
const post = (
<h2>Post Header</h2>
<p>Post text</p>
);
Вираз це одне значення, результат деяких обчислень, звідси випливає правило спільного батька.
const post = (
<div>
<h2>Post Header</h2>
<p>Post text</p>
</div>
);
Якщо в розмітці зайвий тег-обгортка не потрібний, використовуються фрагменти,
схожі на DocumentFragment
. Цей вбудований компонент при рендері розчиняється,
підставляючи свій вміст.
import { Fragment } from "react";
const post = (
<Fragment>
<h2>Post Header</h2>
<p>Post text</p>
</Fragment>
);
Синтаксис фрагментів можна скоротити та не додавати імпорт Fragment
. Babel
зробить всі необхідні трансформації, замінивши порожні JSX-теги на
React.Fragment
.
const post = (
<>
<h2>Post Header</h2>
<p>Post text</p>
</>
);