Реагировать на рендеринг элементов html во вложенных циклах

У меня есть структура данных, подобная этой {ключ: [массив объектов]}. Я хочу отображать каждый элемент в массиве объектов, используя вложенный цикл for следующим образом:

for each entry(k, v) in map:
    for each element in array v:
        display html data

Я использую реакцию версии 16.

Я пробовал это в JSX:

class Positions extends React.Component {
    renderPosition(position) {
        var expiry = position["ExpiryDay"] + "-" + position["ExpiryMonth"] + "-" + position["ExpiryYear"];
        console.info(expiry);
        return (<label>{expiry}</label>);
    }
    render() {
        return (
            <div>
                {this.props.positionsGrouped.forEach(function(positions) {
                    return (
                        <div>
                            {positions.map(function(position) {
                                return (
                                    <div>
                                        {this.renderPosition(position)}
                                    </div>
                                );
                            }.bind(this))}
                        </div>
                    );
                }.bind(this))}
            </div>
        );
    }
}

Вот JS, в который он компилируется:

class Positions extends React.Component {
    renderPosition(position) {
        var expiry = position["ExpiryDay"] + "-" + position["ExpiryMonth"] + "-" + position["ExpiryYear"];
        console.info(expiry);
        return React.createElement(
            "label",
            null,
            expiry
        );
    }
    render() {
        return React.createElement(
            "div",
            null,
            this.props.positionsGrouped.forEach(function (positions) {
                return React.createElement(
                    "div",
                    null,
                    positions.map(function (position) {
                        return React.createElement(
                            "div",
                            null,
                            this.renderPosition(position)
                        );
                    }.bind(this))
                );
            }.bind(this))
        );
    }
}

Однако я не вижу ничего отображаемого, кроме самого верхнего div. Вот отрендеренный html:

<div id = "app">
    <div></div>
</div>

Вот что я вижу в инструментах разработчика реакции:

<App>
    <Positions>
        <div></div>
    </Positions>
</App>

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

Кто-нибудь знает, что я делаю неправильно? Я новичок, чтобы реагировать и извините за любые опечатки. Заранее спасибо.

Поведение ключевого слова "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
1 466
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

this.props.positionsGrouped.forEach вернет undefined. Я имею в виду, что это ничего не вернет. Так что ничего не визуализируется.

Вместо того, чтобы писать его как ответ, вы должны написать его в комментарии к соответствующему ответу.

Rahul Raut 11.03.2019 07:44

Просто измените код компонента следующим образом

import React from "react";
class Positions extends React.Component {
  constructor(props) {
    super(props);
    this.renderPosition = this.renderPosition.bind(this);
  }
  renderPosition(position) {
    var expiry = position["name"] + "-" + position["title"];
    console.info(expiry);
    return <label>{expiry}</label>;
  }
  render() {
    const { positionsGrouped } = this.props;
    return (
      <div>
        {positionsGrouped.map(positions => {
          const keys = Object.keys(positions);
          return (
            <div>
              {positions[keys[0]].map(position => {
                return <div>{this.renderPosition(position)}</div>;
              })}
            </div>
          );
        })}
      </div>
    );
  }
}
export default Positions;

Внутри вашего родительского файла

import React from "react";
import ReactDOM from "react-dom";
import Position from "./test";
import "./styles.css";

function App() {
  var positionGroup = [
    {
      a: [
        {
          name: "hello",
          title: "sdfd"
        },
        {
          name: "hello",
          title: "sdfd"
        },
        {
          name: "hello",
          title: "sdfd"
        }
      ]
    },
    {
      b: [
        {
          name: "hello",
          title: "sdfd"
        },
        {
          name: "hello",
          title: "sdfd"
        },
        {
          name: "hello",
          title: "sdfd"
        }
      ]
    }
  ];
  return (
    <div className = "App">
      <h1>Hello CodeSandbox</h1>
      <h2>Start editing to see some magic happen!</h2>
      <Position positionsGrouped = {positionGroup} />
    </div>
  );
}

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

Возвращаемое значение forEach равно undefined независимо от того, что вы возвращаете в функции обратного вызова. вместо этого используйте map.

class Positions extends React.Component {
  getExpiry(position) {
    return `${position.ExpiryDay}-${position.ExpiryMonth}-${position.ExpiryYear}`;
  }

  render() {
    return (
      <div>
        {this.props.positionsGrouped.map(positions => (
          <div>
            {positions.map((position) => (
              <div>
                <label>{this.getExpiry(position)}</label>
              </div>
            ))}
          </div>
        ))}
      </div>
    );
  }
}

Я немного изменил ваш код, чтобы сделать его более кратким.

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