JSX: JavaScript kiterjesztés és használati példák

Szerző: IT Sectr Megjelenés: 2026-07-03 Olvasási idő: 10 perc

JSX — egy XML-szerű szintaxis kiterjesztés a JavaScript-hez, amelyet a React csapat fejlesztett ki a felhasználói felületek deklaratív leírásához. A sablonmotorokkal ellentétben a JSX közönséges JavaScript függvényhívásokká fordul le, ami a nyelv teljes erejét biztosítja a jelölésen belül. A React, 2024 szerint a JSX minden modern React keretrendszerben és könyvtárban támogatott.

Főbb pontok

  • JSX — szintaktikai cukor a React.createElement felett, lehetővé téve HTML-szerű jelölés írását JavaScript-ben.
  • Kifejezések a JSX-ben kapcsos zárójeleken keresztül ágyazhatók be — bármilyen JS kifejezés használható.
  • Attribútumok a JSX-ben camelCase-ben íródnak (className, onClick, tabIndex), nem kebab-case-ben.
  • Transpiláció JSX-ből JS-be a Babel, TypeScript vagy esbuild által történik a böngészőben való végrehajtás előtt.
  • XSS védelem beépített — a React escape-eli az összes értéket a renderelés előtt, megakadályozva az injekciókat.

Mi az a JSX?

JSX (JavaScript XML) — egy szintaxis kiterjesztés a JavaScript-hez, amelyet először a React-ben mutattak be 2013-ban. Lehetővé teszi a fejlesztők számára, hogy deklaratív stílusban írják le a felhasználói felület szerkezetét, kombinálva a jelölést és a logikát egyetlen fájlban.

A JSX megjelenése előtt a fejlesztők szöveges sablonokat (Mustache, Handlebars) használtak, vagy manuálisan hoztak létre DOM elemeket a document.createElement segítségével. Mindkét megközelítésnek voltak hátrányai: a szöveges sablonokat nem ellenőrizték típusok szerint, a manuális DOM létrehozás pedig körülményes és hibákra hajlamos volt.

A React más utat választott — a jelölés közvetlen beágyazását a kódba. Ez a döntés vitát váltott ki a közösségben, de idővel szabvánnyá vált. Ma a JSX nem csak a React-ben használatos, hanem a SolidJS, Preact, Qwik és még a Vue keretrendszerekben is plugin-eken keresztül.

JSX alapszintaxis

A JSX elem úgy néz ki, mint egy HTML tag, de közvetlenül a JavaScript-be van ágyazva. Minden elem egy React.createElement hívássá transpilálódik három argumentummal: az elem típusa, a props objektum és a gyermek elemek. Egy gyökérelem — kötelező szabály: a JSX kifejezésnek egy szülő elemet vagy fragmentet kell visszaadnia.

js
import React from 'react';

// Alap JSX - egy gyökérelem
const element = (
  <div className="app">
    <h1>Hello, World!</h1>
    <p>Welcome to React</p>
  </div>
);

Fragmentek csoportosításhoz

Amikor nincs szükség további DOM csomópontra, használja a React.Fragment vagy a rövid szintaxist <></>. A fragmentek nem hoznak létre valódi DOM elemet, csak csoportosítják a gyermek csomópontokat. Ez különösen hasznos táblázatokban és listákban, ahol egy extra csomagoló elem megzavarná a HTML szerkezetet.

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

Kifejezések és változók a JSX-ben

Bármely JavaScript kifejezés beágyazható a JSX-be kapcsos zárójeleken keresztül { }. Belül használhatók változók, függvényhívások, ternáris operátorok és tömb metódusok. Feltételes renderelés a ternáris operátoron vagy logikai ÉS-en keresztül történik.

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>
  );
}

A kulcsfontosságú korlátozás — a kapcsos zárójeleken belül csak kifejezések használhatók, nem utasítások. Nem használható if/else, for, switch — csak ternáris operátor, logikai operátorok és tömb metódusok. Függvényhívások, beleértve a nyíl függvényeket, engedélyezettek.

Különbségek a JSX és a HTML között

A JSX vizuálisan hasonlít a HTML-re, de alapvető különbségek vannak. Attribútumok camelCase-ben íródnak — className a class helyett, onClick az onclick helyett, tabIndex a tabindex helyett. Ez azért van, mert a JSX JavaScript-be transpilálódik, ahol a kötőjel a tulajdonság nevében nem megengedett.

HTMLJSXOk
class="wrapper"className="wrapper"class — fenntartott szó JS-ben
onclick="handle()"onClick={handle}camelCase JS tulajdonságokhoz
style="color: red"style={{ color: 'red' }}Stílus objektum string helyett
<input disabled><input disabled={true}>Boolean attribútumok explicit megadása

Másik fontos különbség — önzáró tag-ek. A HTML-ben néhány tag (br, hr, input) nyitva maradhat. A JSX-ben minden önzáró tagnak rendelkeznie kell záró perjellel: <br />, <input />. Az SVG attribútum nevek is camelCase-re konvertálódnak: strokeWidth, fillOpacity.

Hogyan transpilálódik a JSX JavaScript-be

A böngészők nem értik közvetlenül a JSX-et. Végrehajtás előtt a JSX kód áthalad a transpilálón — Babel, TypeScript vagy esbuild. Minden JSX elem egy createElement vagy jsx/runtime hívássá alakul.

Transzformáció Babellen keresztül

js
// Eredeti JSX
const element = <h1 className="title">Hello</h1>;

// Transpiláció után
const element = React.createElement(
  'h1',
  { className: 'title' },
  'Hello'
);

A React 17-től kezdve megjelent egy új JSX transzformáció, amely nem igényli a React importálását. Automatikus import jsx-runtime lehetővé teszi komponensek írását import React from 'react' nélkül. A Babel és a TypeScript támogatja ezt a transzformációt a {"runtime": "automatic"} beállítással.

JSX a React-en kívül: Solid, Preact, Vue

Bár a JSX a React-hez kapcsolódik, más keretrendszerek is használják. SolidJS JSX-et használ valódi DOM csomópontokra fordításával, Virtual DOM nélkül. Preact — könnyűsúlyú alternatíva a React-hez teljes JSX támogatással. Vue támogatja a JSX-et a @vue/babel-plugin-jsx-en keresztül, bár az elsődleges sablonja a template.

A kulcsfontosságú különbség — kifejezések szemantikája. A React-ben a JSX kifejezések minden rendereléskor végrehajtódnak. A SolidJS-ben a JSX egyszer fordul le, és a frissítések jeleken keresztül követhetők. Ez hatással van a teljesítményre: a SolidJS nem igényel Virtual DOM-ot és reconciliációt, így a JSX renderelés gyorsabb.

A TypeScript-ben a JSX nyelvi szinten támogatott. A .tsx kiterjesztésű fájlok automatikusan feldolgozzák a JSX szintaxist. Props-ok típusosítása — a TypeScript + JSX egyik fő előnye: az IDE javasolja a várt attribútumokat, a callback típusokat és a props-ok kötelezőségét.

Legjobb gyakorlatok a JSX munkához

Írjon JSX kódot, amely könnyen olvasható és karbantartható. Emelje ki az összetett kifejezéseket külön változókba vagy függvényekbe — ez javítja az olvashatóságot és lehetővé teszi a logika elkülönített tesztelését a jelöléstől. Használjon fragmenteket a szükségtelen div csomagolók helyett.

A behúzás szabálya — tartsa be a behúzást a beágyazott elemeknél. Minden beágyazási szint — egy behúzási szint. A záró tagnak a nyitó tag szintjén kell lennie. Hosszú attribútumokhoz használjon sortörést.

Kerülje az inline nyíl függvényeket a props-okban, ha minden rendereléskor létrejönnek. Ilyen esetekben csomagolja a callback-et useCallback-be, vagy helyezze a függvényt a komponensen kívülre. Ossza fel az összetett komponenseket kisebbekre — minden komponens egy logikai egységért felelős a felületen.

Gyakran ismételt kérdések

Használható a JSX React nélkül?

Igen, a Babel plugin @babel/plugin-transform-react-jsx segítségével a JSX bármely könyvtárhoz konfigurálható. A SolidJS, Preact, Nerv és más keretrendszerek JSX-et használnak saját futási környezetükkel. A teljes függetlenség érdekében a pragma beállítható a saját függvényre.

Miért nem használható a class a className helyett JSX-ben?

A class egy fenntartott szó a JavaScript-ben. A JSX createElement-re transpilálódik, ahol a második argumentum egy props objektum. A class tulajdonság ütközik az ES6 osztály szintaxissal, ezért a React a className-t választotta.

Hogyan adhatok hozzá több osztályt JSX-ben?

Használjon template string-eket vagy a classnames könyvtárat: className={„“btn ${isActive ? 'active' : ''}”}. Összetett logikához csatlakoztassa a clsx vagy classnames npm csomagot, amelyek objektumokat és tömböket fogadnak el.

Támogatja a JSX a feltételes szerkezeteket?

A JSX csak kifejezéseket támogat, nem utasításokat. Feltételekhez használja a ternáris operátort, a logikai ÉS-t (&&) vagy a logikai VAGY-ot (||). Összetett logikához emelje ki a feltételt egy külön változóba vagy függvénybe.

Miért van szükség key-re a listákhoz JSX-ben?

A key attribútum segít a React-nek azonosítani a lista elemeit újrarendereléskor. Key nélkül a React a teljes listát újrarajzolja változáskor. Egyedi key-vel a React újrahasznosítja a DOM csomópontokat és átrendezi az elemeket ahelyett, hogy újra létrehozná őket.

Összefoglaló

  • JSX — XML-szerű JavaScript kiterjesztés a UI deklaratív leírásához, alternatíva a szöveges sablonokhoz.
  • Kapcsos zárójelek lehetővé teszik bármely JS kifejezés beágyazását — változók, függvények, ternáris operátorok.
  • Attribútumok a JSX-ben camelCase-ben íródnak, a stílusok objektumként kerülnek átadásra, a boolean attribútumok explicit módon.
  • Transpiláció JSX-ből createElement-be automatikusan történik a Babel vagy TypeScript által.
  • Egy gyökérelem vagy fragment kötelező minden JSX kifejezéshez.
  • JSX a React-en kívül — SolidJS, Preact, Vue és Qwik is támogatja a JSX-et saját futási környezetükön keresztül.
  • TypeScript a .tsx kiterjesztéssel teljes típusosítást biztosít a props-okhoz és JSX attribútumokhoz.

Kulcsrakész mobilalkalmazást fejlesztünk

Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.

Projekt megbeszélése

Olvassa el is