Spec-Zone.ru › React 18

Написание разметки с помощью JSX

JSX — это расширение синтаксиса JavaScript, позволяющее писать разметку в стиле HTML внутри файла JavaScript. Хотя есть и другие способы написания компонентов, большинство разработчиков React предпочитают лаконичность JSX, и большинство кодовых баз используют его.

Вы узнаете

  • Почему React смешивает разметку с логикой отрисовки
  • Чем JSX отличается от HTML
  • Как отображать информацию с помощью JSX

JSX: Размещение разметки в JavaScript

Веб-технологии построены на HTML, CSS и JavaScript. Много лет веб-разработчики хранили контент в HTML, дизайн в CSS, а логику — в JavaScript, часто в отдельных файлах! Контент помечался в HTML, а логика страницы хранилась отдельно в JavaScript:

HTML markup with purple background and a div with two child tags: p and form.

HTML

Three JavaScript handlers with yellow background: onSubmit, onLogin, and onClick.

JavaScript

Но по мере того, как веб стал более интерактивным, логика всё чаще определяла контент. JavaScript стал контролировать HTML! Вот почему в React логика отрисовки и разметка находятся вместе в одном месте — компонентах.

React component with HTML and JavaScript from previous examples mixed. Function name is Sidebar which calls the function isLoggedIn, highlighted in yellow. Nested inside the function highlighted in purple is the p tag from before, and a Form tag referencing the component shown in the next diagram.

Sidebar.js Компонент React

React component with HTML and JavaScript from previous examples mixed. Function name is Form containing two handlers onClick and onSubmit highlighted in yellow. Following the handlers is HTML highlighted in purple. The HTML contains a form element with a nested input element, each with an onClick prop.

Form.js Компонент React

Сосредоточение логики отрисовки и разметки кнопки вместе гарантирует, что они останутся синхронизированными при каждом изменении. Напротив, детали, не связанные друг с другом, такие как разметка кнопки и разметка боковой панели, изолированы друг от друга, что делает безопаснее изменять любое из них независимо.

Каждый компонент React — это функция JavaScript, которая может содержать разметку, которую React отрисовывает в браузере. React-компоненты используют расширение синтаксиса JSX для представления этой разметки. JSX очень похож на HTML, но немного строже и может отображать динамическую информацию. Лучший способ понять это — преобразовать некоторую разметку HTML в разметку JSX.

Примечание

JSX и React — это две отдельные вещи. Они часто используются вместе, но вы можете использовать их независимо друг от друга. JSX — это расширение синтаксиса, а React — библиотека JavaScript.

Преобразование HTML в JSX

Предположим, у вас есть некоторый (совершенно корректный) HTML:

<h1>Hedy Lamarr's Todos</h1>
<img 
  src="https://i.imgur.com/yXOvdOSs.jpg" 
  alt="Hedy Lamarr" 
  class="photo"
>
<ul>
    <li>Invent new traffic lights
    <li>Rehearse a movie scene
    <li>Improve the spectrum technology
</ul>

И вы хотите поместить его в свой компонент:

export default function TodoList() {
  return (
    // ???
  )
}

Если вы скопируете и вставите его как есть, он не будет работать:

export default function TodoList() {
  return (
    // This doesn't quite work!
    <h1>Hedy Lamarr's Todos</h1>
    <img 
      src="https://i.imgur.com/yXOvdOSs.jpg" 
      alt="Hedy Lamarr" 
      class="photo"
    >
    <ul>
      <li>Invent new traffic lights
      <li>Rehearse a movie scene
      <li>Improve the spectrum technology
    </ul>

Это происходит потому, что JSX строже и имеет несколько дополнительных правил по сравнению с HTML! Если вы прочитаете сообщения об ошибках выше, они помогут вам исправить разметку, или вы можете следовать инструкциям ниже.

Примечание

Большинство сообщений об ошибках React на экране помогут вам найти проблему. Прочитайте их, если у вас возникнут трудности!

Правила JSX

1. Возвращение одного корневого элемента

Чтобы вернуть несколько элементов из компонента, оберните их одним родительским тегом.

Например, вы можете использовать <div>.

<div>
  <h1>Hedy Lamarr's Todos</h1>
  <img 
    src="https://i.imgur.com/yXOvdOSs.jpg" 
    alt="Hedy Lamarr" 
    class="photo"
  >
  <ul>
    ...
  </ul>
</div>

Если вы не хотите добавлять дополнительный <div> к вашей разметке, вы можете написать <> и </> вместо этого:

<>
  <h1>Hedy Lamarr's Todos</h1>
  <img 
    src="https://i.imgur.com/yXOvdOSs.jpg" 
    alt="Hedy Lamarr" 
    class="photo"
  >
  <ul>
    ...
  </ul>
</>

Этот пустой тег называется Fragment. Fragment позволяют группировать вещи без следа в дереве HTML браузера.

Подробное описание

Почему несколько тегов JSX нужно обернуть?

JSX выглядит как HTML, но под капотом он преобразуется в обычные объекты JavaScript. Вы не можете вернуть два объекта из функции без обертывания их в массив. Это объясняет, почему вы также не можете вернуть два тега JSX без обертывания их в другой тег или Fragment.

2. Закрытие всех тегов

JSX требует явного закрытия тегов: самозакрывающиеся теги, такие как <img>, должны стать <img />, а обертывающие теги, такие как <li>oranges, должны быть написаны как <li>oranges</li>.

Вот как выглядит изображение Хеди Ламарр и пункты списка в закрытом виде:

<>
  <img 
    src="https://i.imgur.com/yXOvdOSs.jpg" 
    alt="Hedy Lamarr" 
    class="photo"
   />
  <ul>
    <li>Invent new traffic lights</li>
    <li>Rehearse a movie scene</li>
    <li>Improve the spectrum technology</li>
  </ul>
</>

3. camelCase все большинство вещей!

JSX преобразуется в JavaScript, а атрибуты, написанные в JSX, становятся ключами объектов JavaScript. В собственных компонентах вы часто захотите считать эти атрибуты в переменные. Но у JavaScript есть ограничения на имена переменных. Например, их имена не могут содержать дефисы или быть ключевыми словами, такими как class.

Вот почему в React многие атрибуты HTML и SVG пишутся с помощью camelCase. Например, вместо stroke-width вы используете strokeWidth. Поскольку class — это зарезервированное слово, в React вы пишете className вместо него, названное в честь соответствующего свойства DOM:

<img 
  src="https://i.imgur.com/yXOvdOSs.jpg" 
  alt="Hedy Lamarr" 
  className="photo"
/>

Вы можете найти все эти атрибуты в списке свойств компонентов DOM. Если вы ошибаетесь, не беспокойтесь — React выведет сообщение с возможной поправкой в консоли браузера.

Опасность

По историческим причинам, aria-* и data-* атрибуты пишутся как в HTML с дефисами.

Совет профессионала: Используйте конвертер JSX

Преобразование всех этих атрибутов в существующей разметке может быть утомительным! Мы рекомендуем использовать конвертер для перевода вашей существующей HTML и SVG разметки в JSX. Конвертеры очень полезны на практике, но всё же стоит понимать, что происходит, чтобы вы могли комфортно писать JSX самостоятельно.

Вот ваш окончательный результат:

export default function TodoList() {
  return (
    <>
      <h1>Hedy Lamarr's Todos</h1>
      <img 
        src="https://i.imgur.com/yXOvdOSs.jpg" 
        alt="Hedy Lamarr" 
        className="photo" 
      />
      <ul>
        <li>Invent new traffic lights</li>
        <li>Rehearse a movie scene</li>
        <li>Improve the spectrum technology</li>
      </ul>
    </>
  );
}

Резюме

Теперь вы знаете, зачем существует JSX и как использовать его в компонентах:

  • Компоненты React группируют логику отрисовки вместе с разметкой, потому что они связаны.
  • JSX похож на HTML, но с небольшими отличиями. Вы можете использовать конвертер, если нужно.
  • Сообщения об ошибках часто укажут вам правильное направление для исправления вашей разметки.

Попробуйте выполнить некоторые задания

Задача 1 из 1:
Преобразовать HTML в JSX

Этот HTML был вставлен в компонент, но он не является допустимым JSX. Исправьте его:

export default function Bio() {
  return (
    <div class="intro">
      <h1>Welcome to my website!</h1>
    </div>
    <p class="summary">
      You can find my thoughts here.
      <br><br>
      <b>And <i>pictures</b></i> of scientists!
    </p>
  );
}

Решать его вручную или с помощью конвертера — решать вам!

© 2013–present Facebook Inc.
Licensed under the Creative Commons Attribution 4.0 International Public License.
https://react.dev/learn/writing-markup-with-jsx

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API