JSX: разширение на JavaScript и примери за използване

Автор: IT Sectr Публикувано: 2026-07-03 Време за четене: 10 мин

JSX — e XML-подобно разширение на синтаксиса на JavaScript, разработено от екипа на React за декларативно описание на потребителски интерфейси. За разлика от шаблонните двигатели, JSX се компилира до обикновени извиквания на JavaScript функции, което дава пълната мощ на езика вътре в маркирането. Според React, 2024, JSX се поддържа във всички съвременни React рамки и библиотеки.

Основни точки

  • JSX — синтактична захар над React.createElement, позволяваща писане на HTML-подобно маркиране в JavaScript.
  • Изрази в JSX се вграждат чрез фигурни скоби — могат да се използват всякакви JS изрази.
  • Атрибути в JSX се пишат в camelCase (className, onClick, tabIndex), а не в kebab-case.
  • Транспилация на JSX в JS се извършва от Babel, TypeScript или esbuild преди изпълнение в браузъра.
  • XSS защита е вградена — React ескейпва всички стойности преди рендериране, предотвратявайки инжекции.

Какво е JSX?

JSX (JavaScript XML) — разширение на синтаксиса за JavaScript, представено за първи път в React през 2013 г. Позволява на разработчиците да описват структурата на потребителския интерфейс в декларативен стил, комбинирайки маркиране и логика в един файл.

Преди появата на JSX, разработчиците използваха текстови шаблони (Mustache, Handlebars) или създаваха ръчно DOM елементи чрез document.createElement. И двата подхода имаха недостатъци: текстовите шаблони не бяха проверявани по типове, а ръчното създаване на DOM беше тромаво и податливо на грешки.

React избра различен път — вграждане на маркирането директно в кода. Това решение предизвика дебати в общността, но с времето се превърна в стандарт. Днес JSX се използва не само в React, но и в SolidJS, Preact, Qwik и дори във Vue чрез добавки.

Основен синтаксис на JSX

JSX елемент изглежда като HTML таг, но се вгражда директно в JavaScript. Всеки елемент се транспилира до извикване на React.createElement с три аргумента: тип на елемента, обект с props и дъщерни елементи. Един коренен елемент — задължително правило: JSX израз трябва да връща един родителски елемент или фрагмент.

js
import React from 'react';

// Основен JSX - един коренен елемент
const element = (
  <div className="app">
    <h1>Hello, World!</h1>
    <p>Welcome to React</p>
  </div>
);

Фрагменти за групиране

Когато не е необходим допълнителен DOM възел, използвайте React.Fragment или краткия синтаксис <></>. Фрагментите не създават реален DOM елемент, а само групират дъщерни възли. Това е особено полезно в таблици и списъци, където допълнителна обвивка би нарушила HTML структурата.

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

Изрази и променливи в JSX

Всеки JavaScript израз се вгражда в JSX чрез фигурни скоби { }. Вътре могат да се използват променливи, извиквания на функции, тернарни оператори и методи на масиви. Условно рендериране се извършва чрез тернарния оператор или логическо И.

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

Ключовото ограничение — вътре във фигурните скоби могат да се използват само изрази, не инструкции. Не могат да се използват if/else, for, switch — само тернарен оператор, логически оператори и методи на масиви. Извикванията на функции, включително стрелкови функции, са разрешени.

Разлики между JSX и HTML

JSX визуално прилича на HTML, но има основни разлики. Атрибутите се пишат в camelCase — className вместо class, onClick вместо onclick, tabIndex вместо tabindex. Това е защото JSX се транспилира в JavaScript, където тирето в името на свойство не е позволено.

HTMLJSXПричина
class="wrapper"className="wrapper"class — запазена дума в JS
onclick="handle()"onClick={handle}camelCase за JS свойства
style="color: red"style={{ color: 'red' }}Обект със стилове вместо низ
<input disabled><input disabled={true}>Изрично посочване на булеви атрибути

Друга важна разлика — самозатварящи се тагове. В HTML някои тагове (br, hr, input) могат да останат незатворени. В JSX всички самозатварящи се тагове трябва да имат затваряща наклонена черта: <br />, <input />. Имената на SVG атрибути също се конвертират в camelCase: strokeWidth, fillOpacity.

Как JSX се транспилира в JavaScript

Браузърите не разбират JSX директно. Преди изпълнение, JSX кодът преминава през транспилатор — Babel, TypeScript или esbuild. Всеки JSX елемент се превръща в извикване на createElement или jsx/runtime.

Трансформация чрез Babel

js
// Оригинален JSX
const element = <h1 className="title">Hello</h1>;

// След транспилация
const element = React.createElement(
  'h1',
  { className: 'title' },
  'Hello'
);

От React 17 се появи нова JSX трансформация, която не изисква импорт на React. Автоматичен импорт на jsx-runtime позволява писане на компоненти без import React from 'react'. Babel и TypeScript поддържат тази трансформация чрез настройка {"runtime": "automatic"}.

JSX извън React: Solid, Preact, Vue

Въпреки че JSX се асоциира с React, други рамки също го използват. SolidJS използва JSX с компилация до реални DOM възли, без Virtual DOM. Preact — лека алтернатива на React с пълна поддръжка на JSX. Vue поддържа JSX чрез @vue/babel-plugin-jsx, въпреки че основният му шаблон е template.

Ключовата разлика — семантика на изразите. В React JSX изразите се изпълняват при всяко рендериране. В SolidJS JSX се компилира веднъж и актуализациите се проследяват чрез сигнали. Това влияе на производителността: SolidJS не изисква Virtual DOM и реконсилиация, така че JSX рендерирането е по-бързо.

В TypeScript JSX се поддържа на ниво език. Файловете с разширение .tsx автоматично обработват JSX синтаксис. Типизиране на props — едно от основните предимства на TypeScript + JSX: IDE подсказва очакваните атрибути, типовете на callback и задължителността на props.

Най-добри практики за работа с JSX

Пишете JSX код, който е лесен за четене и поддръжка. Изваждайте сложни изрази в отделни променливи или функции — това подобрява четимостта и позволява тестване на логиката отделно от маркирането. Използвайте фрагменти вместо ненужни div обвивки.

Правило за отстъп — спазвайте отстъпи за вложени елементи. Всяко ниво на влагане — едно ниво на отстъп. Затварящият таг трябва да е на нивото на отварящия. За дълги атрибути използвайте прекъсване на ред.

Избягвайте inline стрелкови функции в props, ако се създават при всяко рендериране. В такива случаи обвийте callback в useCallback или изнесете функцията извън компонента. Разделяйте сложни компоненти на по-малки — всеки компонент трябва да отговаря за една логическа единица от интерфейса.

Често задавани въпроси

Може ли JSX да се използва без React?

Да, чрез Babel добавка @babel/plugin-transform-react-jsx може да се конфигурира JSX за всяка библиотека. SolidJS, Preact, Nerv и други рамки използват JSX със собствени runtime. За пълна независимост можете да зададете pragma на своя функция.

Защо в JSX не може да се използва class вместо className?

class е запазена дума в JavaScript. JSX се транспилира до createElement, където вторият аргумент е обект с props. Свойството class конфликтва с класовия синтаксис на ES6, затова React избра className.

Как да добавя няколко класа в JSX?

Използвайте template strings или библиотеката classnames: className={`“btn ${isActive ? 'active' : ''}”`}. За сложна логика свържете npm пакета clsx или classnames, които приемат обекти и масиви.

Поддържа ли JSX условни конструкции?

JSX поддържа само изрази, не инструкции. За условия използвайте тернарен оператор, логическо И (&&) или логическо ИЛИ (||). За сложна логика извадете условието в отделна променлива или функция.

Защо в JSX е необходим key за списъци?

Атрибутът key помага на React да идентифицира елементите на списъка при повторно рендериране. Без key React прерисува целия списък при промяна. С уникален key React използва повторно DOM възлите и пренарежда елементите, вместо да ги създава наново.

Резюме

  • JSX — XML-подобно разширение на JavaScript за декларативно описание на UI, алтернатива на текстовите шаблони.
  • Фигурните скоби позволяват вграждане на всякакви JS изрази — променливи, функции, тернарни оператори.
  • Атрибутите в JSX се пишат в camelCase, стиловете се предават като обект, булевите атрибути — изрично.
  • Транспилация на JSX до createElement се извършва автоматично от Babel или TypeScript.
  • Един коренен елемент или фрагмент е задължителен за всеки JSX израз.
  • JSX извън React — SolidJS, Preact, Vue и Qwik също поддържат JSX чрез собствени runtime.
  • TypeScript с разширение .tsx предоставя пълно типизиране на props и JSX атрибути.

Ще разработим мобилно приложение под ключ

IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също