JSX: rozšíření JavaScriptu a příklady použití

Autor: IT Sectr Publikováno: 2026-07-03 Doba čtení: 10 min

JSX — je XML-podobné rozšíření syntaxe JavaScriptu, vyvinuté týmem React pro deklarativní popis uživatelských rozhraní. Na rozdíl od šablonovacích motorů je JSX kompilován do běžných volání JavaScriptových funkcí, což dává plnou sílu jazyka uvnitř značení. Podle React, 2024 je JSX podporován ve všech moderních React frameworkách a knihovnách.

Hlavní body

  • JSX — syntaktický cukr nad React.createElement, umožňující psát HTML-podobné značení v JavaScriptu.
  • Výrazy v JSX se vkládají pomocí složených závorek — lze použít jakékoli JS výrazy.
  • Atributy v JSX se píší v camelCase (className, onClick, tabIndex), ne v kebab-case.
  • Transpilace JSX do JS je prováděna Babelem, TypeScriptem nebo esbuildem před spuštěním v prohlížeči.
  • Ochrana XSS je vestavěna — React escapuje všechny hodnoty před vykreslením, čímž zabraňuje injekcím.

Co je JSX?

JSX (JavaScript XML) — rozšíření syntaxe pro JavaScript, poprvé představené v Reactu v roce 2013. Umožňuje vývojářům popsat strukturu uživatelského rozhraní deklarativním stylem, kombinujíc značení a logiku v jednom souboru.

Před příchodem JSX používali vývojáři textové šablony (Mustache, Handlebars) nebo ručně vytvářeli DOM elementy pomocí document.createElement. Oba přístupy měly nevýhody: textové šablony nebyly typově kontrolovány a ruční vytváření DOM bylo těžkopádné a náchylné k chybám.

React zvolil jinou cestu — vkládání značení přímo do kódu. Toto rozhodnutí vyvolalo diskusi v komunitě, ale časem se stalo standardem. Dnes je JSX používán nejen v Reactu, ale také v SolidJS, Preact, Qwik a dokonce i ve Vue pomocí pluginů.

Základní syntaxe JSX

JSX element vypadá jako HTML tag, ale je vložen přímo do JavaScriptu. Každý element je transpilován do volání React.createElement se třemi argumenty: typ elementu, objekt props a potomkové elementy. Jeden kořenový element — povinné pravidlo: JSX výraz musí vracet jeden rodičovský element nebo fragment.

js
import React from 'react';

// Základní JSX - jeden kořenový element
const element = (
  <div className="app">
    <h1>Hello, World!</h1>
    <p>Welcome to React</p>
  </div>
);

Fragmenty pro seskupování

Když není potřeba další DOM uzel, použijte React.Fragment nebo krátkou syntaxi <></>. Fragmenty nevytvářejí skutečný DOM element, pouze seskupují potomkové uzly. To je užitečné zejména v tabulkách a seznamech, kde by dodatečný obal narušil HTML strukturu.

js
function Columns() {
  return (
    <>
      <td>First</td>
      <td>Second</td>
    </>
  );
}

Výrazy a proměnné v JSX

Jakýkoli JavaScriptový výraz se vkládá do JSX pomocí složených závorek { }. Uvnitř lze použít proměnné, volání funkcí, ternární operátory a metody polí. Podmíněné vykreslování se provádí pomocí ternárního operátoru nebo logického AND.

js
function Greeting({ name, isLoggedIn }) {
  const items = ['Red', 'Green', 'Blue'];

  return (
    <div>
      {/* Expression with variable */}
      <h1>Hello, {name}</h1>

      {/* Conditional rendering */}
      {isLoggedIn ?
        <p>Welcome back!</p :
        <button>Login</button>
      }

      {/* Render array */}
      <ul>
        {items.map(item =>
          <li key={item}>{item}</li>
        )}
      </ul>
    </div>
  );
}

Klíčové omezení — uvnitř složených závorek lze použít pouze výrazy, ne příkazy. Nelze použít if/else, for, switch — pouze ternární operátor, logické operátory a metody polí. Volání funkcí, včetně šipkových funkcí, je povoleno.

Rozdíly mezi JSX a HTML

JSX je vizuálně podobné HTML, ale má zásadní rozdíly. Atributy se píší v camelCase — className místo class, onClick místo onclick, tabIndex místo tabindex. To je proto, že JSX je transpilován do JavaScriptu, kde pomlčka v názvu vlastnosti není povolena.

HTMLJSXDůvod
class="wrapper"className="wrapper"class — vyhrazené slovo v JS
onclick="handle()"onClick={handle}camelCase pro JS vlastnosti
style="color: red"style={{ color: 'red' }}Objekt stylů místo řetězce
<input disabled><input disabled={true}>Explicitní uvedení boolean atributů

Další důležitý rozdíl — samouzavírací tagy. V HTML mohou některé tagy (br, hr, input) zůstat neuzavřené. V JSX musí mít všechny samouzavírací tagy uzavírací lomítko: <br />, <input />. Názvy SVG atributů se také převádějí do camelCase: strokeWidth, fillOpacity.

Jak je JSX transpilován do JavaScriptu

Prohlížeče nerozumí JSX přímo. Před spuštěním prochází JSX kód transpilérem — Babelem, TypeScriptem nebo esbuildem. Každý JSX element se přemění na volání createElement nebo jsx/runtime.

Transformace přes Babel

js
// Původní JSX
const element = <h1 className="title">Hello</h1>;

// Po transpilaci
const element = React.createElement(
  'h1',
  { className: 'title' },
  'Hello'
);

Od Reactu 17 se objevila nová JSX transformace, která nevyžaduje import Reactu. Automatický import jsx-runtime umožňuje psát komponenty bez import React from 'react'. Babel a TypeScript podporují tuto transformaci pomocí nastavení {"runtime": "automatic"}.

JSX mimo React: Solid, Preact, Vue

Ačkoli je JSX spojován s Reactem, používají ho i jiné frameworky. SolidJS používá JSX s kompilací do skutečných DOM uzlů, bez Virtual DOM. Preact — lehká alternativa k Reactu s plnou podporou JSX. Vue podporuje JSX přes @vue/babel-plugin-jsx, i když jeho primární šablonou je template.

Klíčový rozdíl — sémantika výrazů. V Reactu se JSX výrazy spouštějí při každém vykreslení. V SolidJS je JSX kompilován jednou a aktualizace jsou sledovány pomocí signálů. To ovlivňuje výkon: SolidJS nevyžaduje Virtual DOM a reconciliaci, takže vykreslování JSX je rychlejší.

V TypeScriptu je JSX podporován na úrovni jazyka. Soubory s příponou .tsx automaticky zpracovávají syntaxi JSX. Typování props — jedna z hlavních výhod TypeScript + JSX: IDE napovídá očekávané atributy, typy callbacků a povinnost props.

Nejlepší postupy práce s JSX

Pište JSX kód, který se snadno čte a udržuje. Vytahujte složité výrazy do samostatných proměnných nebo funkcí — to zlepšuje čitelnost a umožňuje testovat logiku odděleně od značení. Používejte fragmenty místo zbytečných div obalů.

Pravidlo odsazení — dodržujte odsazení pro vnořené elementy. Každá úroveň vnoření — jedna úroveň odsazení. Uzavírací tag by měl být na úrovni otevíracího. Pro dlouhé atributy používejte zalomení řádku.

Vyhněte se inline šipkovým funkcím v props, pokud se vytvářejí při každém vykreslení. V takových případech zabalte callback do useCallback nebo umístěte funkci mimo komponent. Rozdělujte složité komponenty na menší — každá komponenta by měla být zodpovědná za jednu logickou jednotku rozhraní.

Často kladené otázky

Lze použít JSX bez Reactu?

Ano, pomocí Babel pluginu @babel/plugin-transform-react-jsx lze JSX nakonfigurovat pro jakoukoli knihovnu. SolidJS, Preact, Nerv a další frameworky používají JSX s vlastními runtime. Pro úplnou nezávislost lze nastavit pragma na vlastní funkci.

Proč v JSX nelze použít class místo className?

class je vyhrazené slovo v JavaScriptu. JSX je transpilován do createElement, kde druhým argumentem je objekt props. Vlastnost class koliduje se syntaxí tříd ES6, proto React zvolil className.

Jak přidat více tříd v JSX?

Použijte template strings nebo knihovnu classnames: className={`“btn ${isActive ? 'active' : ''}”`}. Pro složitou logiku připojte npm balíček clsx nebo classnames, které přijímají objekty a pole.

Podporuje JSX podmíněné konstrukce?

JSX podporuje pouze výrazy, ne příkazy. Pro podmínky použijte ternární operátor, logické AND (&&) nebo logické OR (||). Pro složitou logiku vytáhněte podmínku do samostatné proměnné nebo funkce.

Proč je v JSX potřeba key pro seznamy?

Atribut key pomáhá Reactu identifikovat prvky seznamu při opětovném vykreslení. Bez key React překresluje celý seznam při změně. S unikátním key React znovu používá DOM uzly a přeskupuje prvky, místo aby je znovu vytvářel.

Shrnutí

  • JSX — XML-podobné rozšíření JavaScriptu pro deklarativní popis UI, alternativa k textovým šablonám.
  • Složené závorky umožňují vkládání jakýchkoli JS výrazů — proměnných, funkcí, ternárních operátorů.
  • Atributy v JSX se píší v camelCase, styly se předávají jako objekt, boolean atributy — explicitně.
  • Transpilace JSX do createElement je prováděna automaticky Babelem nebo TypeScriptem.
  • Jeden kořenový element nebo fragment je povinný pro každý JSX výraz.
  • JSX mimo React — SolidJS, Preact, Vue a Qwik také podporují JSX přes vlastní runtime.
  • TypeScript s příponou .tsx poskytuje plné typování props a JSX atributů.

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také