Как выполнить JS в JSX (React), не выводя его как HTML?

Как бы вы собрали этот html с помощью jsx / react. Моя проблема в том, что i++ всегда выводится как часть html, хотя я бы предпочел это выполнить.

const rows = [];

for (let i = 0; i < items.length; i++) {
  let row;
  if (i + 1 < items.length) {
    // on all but the last item we have to items in a row
    row = (
      <div className = "bpa-module-tile-row">
        {this.getItem(items[i])}
        i++;
        {this.getItem(items[i])}
        )
      </div>
    );
  } else {
    // if we have an odd number of items, then the last row has only one not two items in a rowj
    row = (
      <div className = "bpa-module-tile-row">{this.getItem(items[i])}</div>
    );
  }

  rows.push(row);
}

Затем rows выводятся позже с использованием {rows} в jsx. Проблема в том, что результат i++ также попадает в HTML. Мне кажется, что я "думаю" или подхожу к этому неправильно.

Как я могу написать это на идиоматическом JSX?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
58
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Array.prototype.map () будет перебирать список и создавать другой список, применяя функцию, которую вы ему предоставляете.

Что-то похожее на это то, что вы ищете:

const items = [1,2,3,4,5]
const rows = items.map((_, index) => index % 2 ? [] : items.slice(index, index + 2))
  .filter(row => row.length > 0)
  .map(row =>
     (<div className = "bpa-module-tile-row">
       {row.map(x => "Item " + x)}
     </div>)
  );

Попробуйте: Скрипка JS


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

const rows = chunk(items, size=2)
 .map(row =>
     (<div className = "bpa-module-tile-row">
       {row.map(x => "Item " + x)}
     </div>)
  );

Я не могу попробовать банкомат, но почему бы не добавить индекс в строку? Этого я хочу избежать. Кроме того, мне нужно обработать 2 индекса одновременно, если это не последний и нечетный индекс.

nachtigall 17.05.2018 18:10

Я немного запутался. Кажется, в вашем примере вы поддерживаете только один индекс. Я немного отредактировал свой ответ, чтобы попытаться угадать, что вы ищете, но если вы можете предоставить более подробную информацию, я могу помочь дальше.

ᴘᴀɴᴀʏɪᴏᴛɪs 17.05.2018 20:47

И что делает getItem? Кажется довольно запутанным передавать item этому

ᴘᴀɴᴀʏɪᴏᴛɪs 17.05.2018 20:49

Это будет повторять пункты. Первый div будет содержать элементы с индексами 0 и 1, следующий div будет содержать элементы с индексами 1 и 2 и т. д. Исходный код выводит элементы с номерами 0 и 1, затем элементы с номерами 2 и 3 и т. д.

Code-Apprentice 17.05.2018 20:53

Отредактировано, чтобы избежать дублирования.

ᴘᴀɴᴀʏɪᴏᴛɪs 17.05.2018 21:24

@ ᴘᴀɴᴀʏɪᴏᴛɪs +1, потому что он работает, и это действительно самый нелепый код :) (но я приму другой ответ)

nachtigall 18.05.2018 09:42

@nachtigall Ничто не сравнится с удобочитаемостью добавления вспомогательного метода :) (см. мою правку)

ᴘᴀɴᴀʏɪᴏᴛɪs 18.05.2018 12:21

Вы можете просто использовать i ++ где угодно в фигурных скобках. Ваш объект строки должен быть таким:

row = (
      <div className = "bpa-module-tile-row">
        {this.getItem(items[i++])}
        {this.getItem(items[i])}
        )
      </div>
    );

Что ж, я не сторонник этих «скрытых» операторов i ++. Действительно легко не заметить. Я бы предпочел, чтобы i ++ был выражением в одной строке.

nachtigall 17.05.2018 18:08
Ответ принят как подходящий

Одно из решений - увеличить счетчик на 2 и рассчитать каждый индекс соответствующим образом:

const rows = [];

for (let i = 0; i < items.length; i += 2) {
  let row;
  if (i + 1 < items.length) {
    // on all but the last item we have to items in a row
    row = (
      <div className = "bpa-module-tile-row">
        {this.getItem(items[i])}
        {this.getItem(items[i+1])}
        )
      </div>
    );
  } else {
    // if we have an odd number of items, then the last row has only one not two items in a rowj
    row = (
      <div className = "bpa-module-tile-row">{this.getItem(items[i])}</div>
    );
  }

  rows.push(row);
}

Да, это устранение основной причины, следовательно, самое чистое решение. Спасибо!

nachtigall 18.05.2018 09:46

Другие вопросы по теме