JSX: JavaScript-Erweiterung und Anwendungsbeispiele

Autor: IT Sectr Veröffentlicht: 2026-07-03 Lesezeit: 10 Min.

JSX ist eine XML-ähnliche Syntaxerweiterung für JavaScript, die vom React-Team entwickelt wurde, um Benutzeroberflächen deklarativ zu beschreiben. Im Gegensatz zu Template-Engines kompiliert JSX in gewöhnliche JavaScript-Funktionsaufrufe und gibt die volle Leistungsfähigkeit der Sprache innerhalb des Markups. Laut React, 2024 wird JSX in allen modernen React-Frameworks und -Bibliotheken unterstützt.

Wichtige Punkte

  • JSX ist syntaktischer Zucker über React.createElement und ermöglicht das Schreiben von HTML-ähnlichem Markup in JavaScript.
  • Ausdrücke werden in JSX über geschweifte Klammern eingebettet – alle JS-Ausdrücke können verwendet werden.
  • Attribute werden in JSX in camelCase geschrieben (className, onClick, tabIndex), nicht in kebab-case.
  • Transpilierung von JSX zu JS erfolgt durch Babel, TypeScript oder esbuild vor der Ausführung im Browser.
  • XSS-Schutz ist integriert – React escaped alle Werte vor dem Rendern und verhindert Injektionen.

Was ist JSX?

JSX (JavaScript XML) ist eine Syntaxerweiterung für JavaScript, die erstmals 2013 in React eingeführt wurde. Sie ermöglicht Entwicklern, die Struktur einer Benutzeroberfläche deklarativ zu beschreiben, indem sie Markup und Logik in einer Datei kombinieren.

Vor JSX verwendeten Entwickler String-Templates (Mustache, Handlebars) oder erstellten DOM-Elemente manuell per document.createElement. Beide Ansätze hatten Nachteile: String-Templates wurden nicht auf Typen geprüft, und die manuelle DOM-Erstellung war umständlich und fehleranfällig.

React wählte einen anderen Weg – Markup direkt in den Code einzubetten. Diese Entscheidung löste in der Community Diskussionen aus, wurde aber im Laufe der Zeit zum Standard. Heute wird JSX nicht nur in React verwendet, sondern auch in SolidJS, Preact, Qwik und sogar in Vue durch Plugins.

Grundlegende JSX-Syntax

Ein JSX-Element sieht wie ein HTML-Tag aus, wird aber direkt in JavaScript eingebettet. Jedes Element wird in einen React.createElement-Aufruf mit drei Argumenten transpiliert: Elementtyp, Props-Objekt und Kinder. Ein Wurzelelement ist eine zwingende Regel: Ein JSX-Ausdruck muss ein Eltern-Element oder Fragment zurückgeben.

js
import React from 'react';

// Basis-JSX - einzelnes Wurzelelement
const element = (
  <div className="app">
    <h1>Hello, World!</h1>
    <p>Welcome to React</p>
  </div>
);

Fragmente zur Gruppierung

Wenn kein zusätzlicher DOM-Knoten benötigt wird, verwenden Sie React.Fragment oder die Kurzsyntax <></>. Fragmente erstellen kein echtes DOM-Element, sondern gruppieren nur Kindknoten. Dies ist besonders nützlich in Tabellen und Listen, wo ein zusätzlicher Wrapper die HTML-Struktur zerstören würde.

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

Ausdrücke und Variablen in JSX

Jeder JavaScript-Ausdruck wird über geschweifte Klammern { } in JSX eingebettet. Darin können Sie Variablen, Funktionsaufrufe, ternäre Operatoren und Array-Methoden verwenden. Bedingtes Rendern erfolgt über den ternären Operator oder logisches UND.

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

Eine wesentliche Einschränkung – innerhalb von geschweiften Klammern können nur Ausdrücke verwendet werden, keine Anweisungen. Sie können if/else, for, switch nicht verwenden – nur den ternären Operator, logische Operatoren und Array-Methoden. Funktionsaufrufe sind erlaubt, einschließlich Pfeilfunktionen.

Unterschiede zwischen JSX und HTML

JSX sieht HTML ähnlich, hat aber grundlegende Unterschiede. Attribute werden in camelCase geschrieben – className statt class, onClick statt onclick, tabIndex statt tabindex. Dies liegt daran, dass JSX in JavaScript transpiliert wird, wo Bindestriche in Eigenschaftsnamen nicht erlaubt sind.

HTMLJSXGrund
class="wrapper"className="wrapper"class ist reserviertes Wort in JS
onclick="handle()"onClick={handle}camelCase für JS-Eigenschaften
style="color: red"style={{ color: ‘red’ }}Stilobjekt statt String
<input disabled><input disabled={true}>Explizite boolesche Attribute

Ein weiterer wichtiger Unterschied – Self-Closing-Tags. In HTML können einige Tags (br, hr, input) ungeschlossen bleiben. In JSX müssen alle Self-Closing-Tags einen Schrägstrich am Ende haben: <br />, <input />. SVG-Attributnamen werden ebenfalls in camelCase konvertiert: strokeWidth, fillOpacity.

Wie JSX in JavaScript transpiliert wird

Browser verstehen JSX nicht direkt. Vor der Ausführung durchläuft JSX-Code einen Transpiler – Babel, TypeScript oder esbuild. Jedes JSX-Element wird in einen createElement- oder jsx/runtime-Aufruf umgewandelt.

Transformation mit Babel

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

// Nach der Transpilierung
const element = React.createElement(
  'h1',
  { className: 'title' },
  'Hello'
);

Mit React 17 kam eine neue JSX-Transformation, die kein Importieren von React erfordert. Der automatische Import von jsx-runtime ermöglicht das Schreiben von Komponenten ohne import React from ‘react’. Babel und TypeScript unterstützen diese Transformation über die Konfiguration {"runtime": "automatic"}.

JSX außerhalb von React: Solid, Preact, Vue

Obwohl JSX mit React assoziiert wird, verwenden es auch andere Frameworks. SolidJS verwendet JSX mit Kompilierung in echte DOM-Knoten, ohne Virtual DOM. Preact ist eine leichte Alternative zu React mit voller JSX-Unterstützung. Vue unterstützt JSX über @vue/babel-plugin-jsx, obwohl seine Hauptvorlage template ist.

Ein Hauptunterschied ist die Ausdruckssemantik. In React werden JSX-Ausdrücke bei jedem Rendern ausgeführt. In SolidJS wird JSX einmal kompiliert und Aktualisierungen werden über Signale verfolgt. Dies beeinflusst die Leistung: SolidJS benötigt kein Virtual DOM und keine Reconciliation, was JSX-Rendering schneller macht.

In TypeScript wird JSX auf Sprachebene unterstützt. Dateien mit der Erweiterung .tsx verarbeiten JSX-Syntax automatisch. Die Props-Typisierung ist einer der Hauptvorteile von TypeScript + JSX: Die IDE schlägt erwartete Attribute, Callback-Typen und Props-Erforderlichkeit vor.

Bewährte Methoden mit JSX

Schreiben Sie JSX-Code, der leicht zu lesen und zu warten ist. Extrahieren Sie komplexe Ausdrücke in separate Variablen oder Funktionen – dies verbessert die Lesbarkeit und ermöglicht das Testen der Logik getrennt vom Markup. Verwenden Sie Fragmente anstelle unnötiger Div-Wrapper.

Die Einrückungsregel – halten Sie Einrückungen für verschachtelte Elemente ein. Jede Verschachtelungsebene ist eine Einrückungsebene. Das schließende Tag sollte auf derselben Ebene wie das öffnende Tag sein. Verwenden Sie Zeilenumbrüche für lange Attribute.

Vermeiden Sie Inline-Pfeilfunktionen in Props, wenn sie bei jedem Rendern erstellt werden. Wickeln Sie in solchen Fällen den Callback in useCallback oder verschieben Sie die Funktion außerhalb der Komponente. Teilen Sie komplexe Komponenten in kleinere auf – jede Komponente sollte eine logische Einheit der Schnittstelle behandeln.

Häufig gestellte Fragen

Kann JSX ohne React verwendet werden?

Ja, über das Babel-Plugin @babel/plugin-transform-react-jsx kann JSX für jede Bibliothek konfiguriert werden. SolidJS, Preact, Nerv und andere Frameworks verwenden JSX mit eigenen Laufzeiten. Für vollständige Unabhängigkeit können Sie den pragma auf Ihre eigene Funktion setzen.

Warum kann in JSX nicht class statt className verwendet werden?

class ist ein reserviertes Wort in JavaScript. JSX transpiliert zu createElement, wo das zweite Argument ein Props-Objekt übergibt. Die Eigenschaft class kollidiert mit der ES6-Klassensyntax, daher hat React className gewählt.

Wie fügt man mehrere Klassen in JSX hinzu?

Verwenden Sie Template-Strings oder die Bibliothek classnames: className={`btn ${isActive ? ‘active’ : ‘’}`}. Für komplexe Logik installieren Sie das npm-Paket clsx oder classnames, die Objekte und Arrays akzeptieren.

Unterstützt JSX bedingte Konstrukte?

JSX unterstützt nur Ausdrücke, keine Anweisungen. Für Bedingungen verwenden Sie den ternären Operator, logisches UND (&&) oder logisches ODER (||). Für komplexe Logik extrahieren Sie die Bedingung in eine separate Variable oder Funktion.

Warum wird key für Listen in JSX benötigt?

Das key-Attribut hilft React, Listenelemente beim erneuten Rendern zu identifizieren. Ohne key rendert React die gesamte Liste bei Änderungen neu. Mit einem eindeutigen key wiederverwendet React DOM-Knoten und ordnet Elemente neu, anstatt sie neu zu erstellen.

Zusammenfassung

  • JSX ist eine XML-ähnliche JavaScript-Erweiterung zur deklarativen UI-Beschreibung, eine Alternative zu String-Templates.
  • Geschweifte Klammern ermöglichen das Einbetten beliebiger JS-Ausdrücke – Variablen, Funktionen, ternäre Operatoren.
  • Attribute werden in JSX in camelCase geschrieben, Stile werden als Objekte übergeben, boolesche Attribute sind explizit.
  • Transpilierung von JSX zu createElement erfolgt automatisch durch Babel oder TypeScript.
  • Ein Wurzelelement oder Fragment ist für jeden JSX-Ausdruck erforderlich.
  • JSX außerhalb von React – SolidJS, Preact, Vue und Qwik unterstützen JSX über ihre eigenen Laufzeiten.
  • TypeScript mit der Erweiterung .tsx bietet vollständige Typisierung von JSX-Props und -Attributen.

Wir entwickeln eine mobile Applikation schlüsselfertig

IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.

Projekt besprechen

Lesen Sie auch