Условный рендеринг через многомерный цикл с массивом

У меня проблема с рендерингом через цикл с многомерным массивом. У меня есть 4 div в качестве столбца, и мне нужно поместить в него изображения (предоставленные в массиве).

Для объяснения вы можете проверить изображения, которые я прилагаю. (ниже ссылки)

Условный рендеринг через многомерный цикл с массивом

Я много раз пытался использовать свой код и в итоге застрял на этом коде.

    let temp=[];

    for(let i=0;i<4;i++){
        temp.push(
          <div className = "imagesColumn">
                {
                    this.state.images.map((item,index) => {
                        return(
                           <img key = {index} src = {item.urlImages} width = "100%"/>
                        )   

                    })
                }
          </div>
        )
    }

Как вы видите в моем коде выше, я хочу, чтобы первый цикл создавал div из 4 столбцов, а второй цикл — вставлял изображения.

Мне не удалось сделать это, как на изображении, которое я дал, потому что каждое изображение зацикливалось 4 раза на основе первого цикла.

Как я могу это сделать? Кто-нибудь может помочь и привести пример кода, пожалуйста

Извините, я просто сделал это более понятным на изображениях, и это мое последнее редактирование.

Billy 09.05.2019 07:27

Я понял. Я сделал это снова лучше. Не волнуйтесь. Посмотрите мой ответ... ?

Praveen Kumar Purushothaman 09.05.2019 07:28
Поведение ключевого слова "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) для оценки ваших знаний,...
3
2
89
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

То, что вы сейчас делаете, это то, что вы отправляете 6 изображений в своем состоянии на каждый из ваших <div>, а HTML/React JS так не работает. Что вы можете сделать, так это выполнить расчетный толчок для каждого столбца. Таким образом, первый столбец содержит 4n + 1 изображение, второй столбец — 4n + 2 изображения и так далее.

Таким образом, мы можем избежать использования переменной temp.

import React from "react";
import ReactDOM from "react-dom";

import "./styles.css";

class App extends React.Component {
  state = {
    images: ["Image 1", "Image 2", "Image 3", "Image 4", "Image 5", "Image 6"]
  };
  render() {
    return (
      <div className = "App">
        {[1, 2, 3, 4].map(n => (
          <div className = "col">
            {this.state.images.map((f, i) =>
              4 * i + n - 1 < this.state.images.length ? (
                <div className = "img">{this.state.images[4 * i + n - 1]}</div>
              ) : (
                ""
              )
            )}
          </div>
        ))}
      </div>
    );
  }
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

Фрагмент

class App extends React.Component {
  state = {
    images: ["Image 1", "Image 2", "Image 3", "Image 4", "Image 5", "Image 6"]
  };
  render() {
    return (
      <div className = "App">
        {[1, 2, 3, 4].map(n => (
          <div className = "col">
            {this.state.images.map((f, i) =>
              4 * i + n - 1 < this.state.images.length ? (
                <div className = "img">{this.state.images[4 * i + n - 1]}</div>
              ) : (
                ""
              )
            )}
          </div>
        ))}
      </div>
    );
  }
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
.App {
  font-family: "Segoe UI";
  line-height: 1;
}
.col {
  float: left;
  width: 25%;
}

.img {
  border: 1px solid #999;
  margin: 10px;
  padding: 5px;
  text-align: center;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id = "root"></div>

Note: You might just need to change it to images. ?

Вот демо в КодПесочница.

Предварительный просмотр

preview

Объяснение

Условие следующее:

4 x imageIndex + columnNumber, where imageIndex is less than length of list of images.

Итак, теоретически, когда мы пытаемся зациклиться на номере столбца, то есть [1, 2, 3, 4], мы получаем следующее:

Col = 1
ImageIndex = 0
Image (4 * i + n - 1 = 0)
ImageIndex = 4
Image (4 * i + n - 1 = 4)

Col = 2
ImageIndex = 1
Image (4 * i + n - 1 = 1)
ImageIndex = 5
Image (4 * i + n - 1 = 5)

Col = 3
ImageIndex = 2
Image (4 * i + n - 1 = 2)

Col = 4
ImageIndex = 3
Image (4 * i + n - 1 = 3)

Другие места в цикле не будут отображаться, поскольку они не соответствуют условию.

Что вы имеете в виду под 4n? я до сих пор не понимаю извините

Billy 09.05.2019 07:28

@Billy 4n потому что у вас 4 столбца и n каждый раз увеличивается. В первом столбце у вас есть изображение 1 и изображение 5. Во втором столбце у вас есть изображение 2 и изображение 6 и так далее. Итак, если вы замените n на 0 и 1 на данный момент, вы получите изображение 1 и изображение 5 для n = 1 и изображение 2 и изображение 6 для n = 2. Если вы не поняли это объяснение, я с удовольствием напишу больше в ответе. ?

Praveen Kumar Purushothaman 09.05.2019 07:31

Отличный ответ Правин! :) . Большое спасибо за решение для меня ?. Я обязательно узнаю и пойму код и объяснение, которое вы дали! ?

Billy 09.05.2019 07:47

@Билли В любое время, приятель. Дай мне знать, если тебе еще понадобится помощь. Я наставник React JS и буду рад помочь вам в изучении React! ?

Praveen Kumar Purushothaman 09.05.2019 07:48

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