Avatar ·

Как правильно использовать цикл внутри JSX в React?

Всем привет! Я только начал изучать React и столкнулся с проблемой: мне нужно отобразить список элементов на странице, используя JSX. У меня есть массив данных, например, список задач: ```javascript const tasks = ['Купить молоко', 'Сделать зарядку', 'Написать код']; ``` Я хочу вывести каждую задачу в виде отдельного `
  • ` внутри `
      `. Я попробовал написать так: ```javascript function TaskList() { return (
        {for (let i = 0; i < tasks.length; i++) {
      • {tasks[i]}
      • }}
      ); } ``` Но React выдаёт ошибку: "SyntaxError: Unexpected token". Я читал, что JSX — это просто синтаксический сахар для `React.createElement`, но не понимаю, почему цикл не работает. В обычном JavaScript я бы написал цикл и внутри него создавал элементы, но здесь всё ломается. Подскажите, пожалуйста, как правильно организовать цикл внутри JSX? Нужно ли использовать какие-то специальные методы? И почему мой код не работает? Заранее спасибо за помощь! <<>>

      Используйте метод map() для итерации по массиву

      Проблема вашего кода в том, что JSX — это декларативный синтаксис, который не поддерживает императивные конструкции, такие как for, while или if напрямую. Вместо этого React ожидает, что внутри фигурных скобок {} будет выражение, возвращающее значение (массив, строку, число или React-элемент). Цикл for — это инструкция, а не выражение, поэтому он не может быть использован внутри JSX.

      Правильный подход — использовать метод map() для массива. Он создаёт новый массив, преобразуя каждый элемент в JSX-элемент. Вот исправленный код:

      function TaskList() {
        const tasks = ['Купить молоко', 'Сделать зарядку', 'Написать код'];
        
        return (
          <ul>
            {tasks.map((task, index) => (
              <li key={index}>{task}</li>
            ))}
          </ul>
        );
      }

      Почему это работает?

      • Выражение внутри JSX: tasks.map(...) возвращает массив React-элементов, которые React может рендерить.
      • Ключи (key): В React каждый элемент в списке должен иметь уникальный key для эффективного обновления DOM. В примере используется index, но лучше использовать уникальный идентификатор из данных (например, task.id), если он есть.
      • Стрелочная функция: Она неявно возвращает JSX-элемент благодаря круглым скобкам ().

      Дополнительные примеры

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

      function TaskList() {
        const tasks = [
          { id: 1, text: 'Купить молоко', done: true },
          { id: 2, text: 'Сделать зарядку', done: false },
          { id: 3, text: 'Написать код', done: false }
        ];
        
        return (
          <ul>
            {tasks
              .filter(task => !task.done)
              .map(task => (
                <li key={task.id}>{task.text}</li>
              ))
            }
          </ul>
        );
      }

      Также можно использовать Array.from() для создания цикла по числовому диапазону:

      function NumberList() {
        return (
          <ul>
            {Array.from({ length: 5 }, (_, i) => (
              <li key={i}>Элемент {i + 1}</li>
            ))}
          </ul>
        );
      }

      Что делать, если нужен сложный цикл?

      Если логика цикла слишком сложна для одной строки, вынесите её в отдельную переменную:

      function TaskList() {
        const tasks = ['Купить молоко', 'Сделать зарядку', 'Написать код'];
        
        const taskItems = [];
        for (let i = 0; i < tasks.length; i++) {
          taskItems.push(<li key={i}>{tasks[i]}</li>);
        }
        
        return <ul>{taskItems}</ul>;
      }

      Этот подход тоже работает, но менее идиоматичен для React. Используйте map() — это стандарт.

      <<>>

      Альтернативный подход: создание массива элементов вручную

      Если вы не хотите использовать map() или работаете с нестандартными структурами данных, можно сформировать массив JSX-элементов заранее с помощью цикла for вне JSX и затем вставить его в разметку. Это особенно удобно, когда нужно выполнить сложные преобразования или условные проверки.

      Пример с циклом for:

      function TaskList() {
        const tasks = ['Купить молоко', 'Сделать зарядку', 'Написать код'];
        const listItems = [];
        
        for (let i = 0; i < tasks.length; i++) {
          listItems.push(<li key={i}>{tasks[i]}</li>);
        }
        
        return <ul>{listItems}</ul>;
      }

      Плюсы: полный контроль над логикой цикла, возможность использовать break или continue, привычный синтаксис для начинающих.
      Минусы: код получается более многословным, чем с map(). В большинстве случаев map() предпочтительнее, так как он короче и читается как "преобразовать каждый элемент массива в JSX".

      Совет: для простых списков всегда используйте map(). Если цикл включает множество условий — выносите логику в отдельную функцию или переменную.