ReactJS: циклы в JSX

Почему React?
В настоящее время разработчики знают, что мир Javascript постоянно меняется. Каждый день появляется новая библиотека, фреймворк или даже обновление самого языка, и мы, как разработчики, должны знать об этом. Сегодня я собираюсь рассказать об одной из многих особенностей **React JS**: _Циклах в JSX_, но, прежде чем я углублюсь в это, возможно, вы задаетесь вопросом _"Что это за штука React JS?"_.

**React JS** или просто **React** — это библиотека Javascript для создания пользовательских интерфейсов, созданная Facebook. Говорят, у React много достоинств, например:

- **Является декларативным:** это означает, что интерактивный дизайн пользовательского интерфейса больше не является проблемой, и каждый из них следует состоянию, которое реагирует на изменения данных.

- **На основе компонентов:** вы можете создавать инкапсулированные компоненты, которые знают только о своем собственном состоянии, и, составив множество из них, вы можете создавать более сложные компоненты.

- **Учитесь один раз, пишите где угодно:** Это не зависит от стека технологий, вы также можете создавать нативные и мобильные приложения с его помощью.

## Новый игрок: JSX

**JSX** описывает себя как _статически типизированный объектно-ориентированный язык программирования, предназначенный для работы в современных веб-браузерах_, и большая часть кода, написанного для **React**, использует его. Например, у нас есть первый компонент **React**, написанный с использованием **JSX**:

```класс javascript
HelloMessage расширяет React.Component {
render() {
return

Привет {this.props.name}

;
}
}

ReactDOM.render(, mountNode);
```
Бьюсь об заклад, вы заметили здесь _XML-подобный_ синтаксис. Что ж, поскольку React JSX преобразует XML-подобный синтаксис в собственный JavaScript, нам может понадобиться компилятор вроде [Babel](https://babeljs.io/), чтобы получить такой результат:

```javascript
class HelloMessage extends React.Component {
render() {
return React.createElement(
«div»,
null,
«Здравствуйте»,
this.props.name
);
}
}

ReactDOM.render(React.createElement(HelloMessage, { name: «Jane» }), mountNode);
```
Также использование JSX необязательно, но наши друзья в Facebook рекомендуют использовать его, потому что _ «это краткий и знакомый синтаксис для определения древовидных структур с атрибутами».

## Пример: создание простого списка комментариев
Хорошо, теперь пришло время добавить сюда немного кода. Во-первых, нам нужно визуализировать наше приложение в стиле **React**. Что это значит? Это означает, что, как мы уже говорили ранее, _React позволяет нам определять инкапсулированные компоненты_, поэтому для этого примера у нас есть только простой список комментариев, и быстрый способ определить его будет таким:

### Компонент: Один комментарий или просто называемый **Комментарий**
**Функция**: Отображение частей комментария, и на этот раз мы сделали все просто и показываем три части для каждого комментария:

1. **Уникальный идентификатор** (это может быть индекс или идентификатор, присвоенный базой данных).
2. **Автор комментария**.
3. **Содержание**, что бы ни писали авторы.

Поскольку мы изолируем каждый компонент, для этого компонента **Comment** неизвестно, где будут отображаться все остальные комментарии, или даже количество комментариев в приложении. Он просто фокусируется на своей функции: **отображать один комментарий со своими собственными свойствами**

```javascript
импортировать React из ‘React’;

Класс Комментарий расширяет React.Component {
конструктор() {
super();
}
render() {
return (

#{this.props.id}

Автор: {this.props.author}

{это.реквизиты.контент}

);
}
}

экспортировать комментарий по умолчанию;
```

Как видите, этот компонент ожидает три свойства:
- ID
- Автор
- Содержание

И доступ к ним мы получаем через свойство `props`, _"Откуда они берутся?"_ — для этого компонента это не имеет значения.

### Компонент: список компонентов или, проще говоря, **CommentList**
**Функция**: отображение каждого комментария в _контейнере_, он должен отвечать за способ отображения комментариев, сетка , макет или все, что мы желаем.

Этот компонент будет содержать все комментарии внутри, другими словами, _список комментариев_

Здесь в игру вступает **Цикл**: чтобы отобразить весь набор комментариев, нам сначала нужно получить их все из источника (веб-сервиса, файла и т. д.), а затем **итерировать** список. и **для каждого** одного из комментариев **CommentList** должен отправлять данные для одного комментария компоненту **Comment**. Давайте посмотрим, о чем я говорю.

```json
/** Имитационные данные, которые можно получить из веб-службы **/
[
{
«id»: 1,
«автор ”:”Эстебан Кортес”,
“контент”: “Круто! Это так здорово!»
},
{
«id»: 2,
«автор»: «Эдвин Круз»,
«контент»: «Давайте возьми крылья и кагуа, чтобы отпраздновать»
},
{
«id»:3,
«автор»: «Эрнесто Алькарас»,
«content»: «Но я забыл свои кроксы»
},
{
«id»: 4,
«автор»: «Марио Гомес»,
«контент»:» Отпусти их!»
}
]

```

```javascript
// CommentList.js
import React from ‘react’;
import Comment from ‘./Comment’; // Обратите внимание, что мы импортируем компонент Component

class CommentList extends React.Component {
structor() {
super();
/** Когда создается экземпляр этого компонента, он передает ссылку на this в метод getComments **/< br /> this.getComments = this.getComments.bind(this);
}
getComments() {
this.comments = require('../mocks/comments');< br /> }
render() {
this.getComments(); // Мы извлекаем комментарии перед возвратом render
(

МагмаКомментарии

{this.comments.map( (комментарий) =› {
return (

);
})}

);
}
}

экспортировать список комментариев по умолчанию;
```

Ключевой код внутри этого:
```javascript
{this.comments.map( (comment) =› {
return (

);
})}
```

## Собираем все вместе

Давайте углубимся в это:

1. Когда вызывается **CommentList**, он извлекает список комментариев из источника, в данном случае из макета, который возвращается в виде массива объектов.
2. В Javascript [Array object](https://developer.mozilla.org/docs/Web/JavaScript/Referencia/Objetos_globales/Array/map) имеет метод, называемый `map`, который перебирает каждый элемент внутри массива и возвращает совершенно новый массив после выполнение обратного вызова в каждом из элементов, поэтому он вызывается внутри кода **JSX** внутри метода _render_.
3. В **JSX** мы можем использовать выражения внутри символов `{}`, все внутри них будет оценено и введено в шаблон **JSX**. Таким образом, для каждого элемента внутри массива комментариев мы создаем компонент **Комментарий** и возвращаем его, создавая новый массив компонентов **Комментарий**.
4. Мы разделяем свойства между объектами, используя **атрибуты* * к каждому установленному нами атрибуту можно получить доступ с помощью объекта props внутри каждого компонента.
```javascript

```
Затем мы получаем к нему доступ:
```javascript
render() {
return (

#{this.props.id} Автор: {this.props.author}

{это.реквизиты.контент}

);
}
```
**Примечание**: при создании нескольких компонентов React потребует, чтобы каждый из них имел уникальный идентификатор, мы устанавливаем это свойство с помощью атрибута `key` .

В итоге получаем что-то вроде этого:
[![Результат](https://s16.postimg.org/pvvy4sf39/Screen_Shot_2016_10_17_at_6_48_17_PM.png)](https://postimg.org/image/nrbl3pdgh/)

Magmalabs.io является экспертом в области дизайна UX/UI, электронной коммерции и разработки программного обеспечения. Мы создаем красивые программные решения для электронной коммерции, Интернета и мобильных устройств для стартапов, крупных компаний и корпоративных компаний, используя инновационные технологии, лучших специалистов и исключительную гарантию качества.