Lekce 1.4

Understanding React Elements Once and for All

In JavaScript, there's nothing mysterious about functions. You define one, and you invoke it. But what exactly happens when you use a React component?

Co se naučíte
  • What React elements really are
  • The difference between components and elements
  • How JSX compiles to React elements
  • Why elements are the foundation of React
  • How React uses elements for reconciliation

V JavaScriptu není na funkcích nic záhadného. Definujete jednu:

javascript
function multiply(a, b) {
  return a * b
}

A zavoláte ji:

javascript
multiply(3, 4)

Definice vs. volání. Jednoduché.

Nyní zvažte React komponentu:

jsx
function UserCard() {
  return <section>User</section>
}

A její použití:

jsx
<UserCard />

Jak se to přesně nazývá?

Většina odpovědí, které lidé dávají, je technicky nesprávných:

  • Instancování komponenty
  • Vykreslování
  • Vyhodnocování
  • Volání
  • "Používání"

Žádný z těchto popisů nepopisuje, co se skutečně děje.

Abychom pochopili proč, musíme se podívat z větší perspektivy a prozkoumat, jak React zpracovává váš kód, než ho prohlížeč vůbec uvidí.

Prohlížeč nerozumí JSX

JSX není platný JavaScript. Napíšete:

jsx
<UserCard />

…ale prohlížeč to nemůže spustit přímo.

Historicky jsme to řešili kompilováním nenativní syntaxe — TypeScript, Elm, CoffeeScript — do čistého JavaScriptu. JSX následuje přesně stejné pravidlo.

Takže do čeho se JSX kompiluje?

Seznamte se s React elementy

React definuje element jako:

Prostý JavaScript objekt, který popisuje, co chcete vidět v UI.

Není to DOM uzel.

Není to instance komponenty.

Je to popis.

Například, element může vypadat takto:

javascript
{
  type: "button",
  props: {
    children: "Save",
    disabled: false
  }
}

Což odpovídá tomuto UI:

jsx
<button>Save</button>

React ukládá tyto element objekty. Když se element změní, React přesně ví, která část DOMu by se měla aktualizovat.

Funkce jsx z react/jsx-runtime

Podívejme se, do čeho se JSX kompiluje. Zvažte:

jsx
<Button disabled={false}>Save</Button>

Toto se stane něčím jako:

javascript
import { jsx } from "react/jsx-runtime"

const element = jsx("button", {
  disabled: false,
  children: "Save"
})

Funkce jsx přijímá:

  • Typ (jako "button" nebo komponentní funkce)
  • Props objekt

A vrací React element objekt.

Nic se nevykresluje.

Nic se nemontuje.

Tato funkce pouze vytváří objekt.

Komponenty jsou jen funkce, které vracejí elementy

React komponenty nejsou magické. Jsou to jen funkce:

jsx
function Alert({ message }) {
  return <p role="alert">{message}</p>
}

Pokud to přepíšeme bez JSX:

javascript
import { jsx } from "react/jsx-runtime"

function Alert({ message }) {
  return jsx("p", {
    role: "alert",
    children: message
  })
}

Znovu: výsledek je React element objekt.

Předávání komponent do jsx

Můžete použít komponenty jako argument typu:

javascript
const cardElement = jsx(ProfileCard, {
  name: "Alex Rivera",
  status: "online",
})

Když React vidí, že typ je funkce, zavolá ji a rekurzivně vytvoří celý strom React elementů, dokud vše není popisem UI.

Takto React řeší váš strom komponent do sady element objektů.

JSX je jen lepší syntaxe

Psaní:

jsx
<ProfileCard name="Alex" />

je mnohem příjemnější než:

javascript
jsx(ProfileCard, { name: "Alex" })

Ale znamenají to samé. JSX je vrstva pohodlí nad React API pro vytváření elementů.

Zpět k velké otázce

Pokud je toto definice funkce:

javascript
function multiply(a, b) { ... }

a toto je volání funkce:

javascript
multiply(2, 5)

a toto je definice komponenty:

jsx
function UserCard() { ... }

pak co je toto?

jsx
<UserCard />

Zde je správná odpověď:

<UserCard /> vytváří React element

Ne vykreslování.

Ne instancování.

Ne volání.

Je to jednoduše JSX syntaxe, která se při kompilaci stane voláním jsx, které vrací React element objekt.

Všechny tyto vytvářejí React elementy:

jsx
<Dashboard />

<div className="wrapper">Content</div>
jsx(Avatar, {
  size: "large",
  url: "https://example.com/photo.png"
})

Stejný výstup. Stejný základní mechanismus.

Komponenty nejsou základem. Elementy jsou.

React komponenty jsou funkce.

React elementy jsou objekty, které popisují, co tyto funkce produkují.

React porovnává tyto element objekty, aby pochopil, jak by měl DOM vypadat.

Jakmile si uvědomíte, že React elementy — ne komponenty — jsou základními stavebními kameny React aplikace, vše ostatní začne dávat smysl: převykreslování, rekonsiliace, memoizace a jak React "rozhoduje", co se skutečně změní v UI.