У меня есть структура данных, подобная этой {ключ: [массив объектов]}. Я хочу отображать каждый элемент в массиве объектов, используя вложенный цикл 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 вызывается с правильными данными.
Кто-нибудь знает, что я делаю неправильно? Я новичок, чтобы реагировать и извините за любые опечатки. Заранее спасибо.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


this.props.positionsGrouped.forEach вернет undefined. Я имею в виду, что это ничего не вернет. Так что ничего не визуализируется.
Просто измените код компонента следующим образом
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>
);
}
}
Я немного изменил ваш код, чтобы сделать его более кратким.
Вместо того, чтобы писать его как ответ, вы должны написать его в комментарии к соответствующему ответу.