Рендеринг реактивных компонентов из массива объектов
У меня есть некоторые данные, называемые станциями, которые представляют собой массив, содержащий объекты.
stations : [
{call:'station one',frequency:'000'},
{call:'station two',frequency:'001'}
]
Я бы хотел отобразить компонент ui для каждой позиции массива. Пока я могу написать
var stationsArr = []
for (var i = 0; i < this.data.stations.length; i++) {
stationsArr.push(
<div className="station">
{this.data}
</div>
)
}
И затем отрисуйте
render(){
return (
{stationsArr}
)
}
Проблема в том, что я получаю всю распечатку данных. Вместо этого я хочу просто показать ключ типа {this.data.call}
, но ничего не печатает.
Как я могу прокручивать эти данные и возвращать новый элемент пользовательского интерфейса для каждой позиции массива?
Ответы
Ответ 1
Вы можете сопоставить список станций с ReactElements.
С React >= 16 можно вернуть несколько элементов из одного и того же компонента, не требуя дополнительной оболочки html-элемента. Для создания фрагментов существует новый синтаксис < > .
Попробуйте выполнить
// Modern syntax >= React 16.2.0
const Test = ({stations}) => (
<>
{stations.map(station => (
<div className="station" key={station.call}>{station.call}</div>
))}
</>
);
// Modern syntax < React 16.2.0
// You need to wrap in an extra element like div here
const Test = ({stations}) => (
<div>
{stations.map(station => (
<div className="station" key={station.call}>{station.call}</div>
))}
</div>
);
// old syntax
var Test = React.createClass({
render: function() {
var stationComponents = this.props.stations.map(function(station) {
return <div className="station" key={station.call}>{station.call}</div>;
});
return <div>{stationComponents}</div>;
}
});
var stations = [
{call:'station one',frequency:'000'},
{call:'station two',frequency:'001'}
];
ReactDOM.render(
<div>
<Test stations={stations} />
</div>,
document.getElementById('container')
);
Не забывайте атрибут key
!
https://jsfiddle.net/69z2wepo/14377/
Ответ 2
this.data
предположительно содержит все данные, поэтому вам нужно будет сделать что-то вроде этого:
var stations = [];
var stationData = this.data.stations;
for (var i = 0; i < stationData.length; i++) {
stations.push(
<div key={stationData[i].call} className="station">
Call: {stationData[i].call}, Freq: {stationData[i].frequency}
</div>
)
}
render() {
return (
<div className="stations">{stations}</div>
)
}
Или вы можете использовать функции map
и стрелки, если вы используете ES6:
const stations = this.data.stations.map(station =>
<div key={station.call} className="station">
Call: {station.call}, Freq: {station.frequency}
</div>
);
Ответ 3
У меня есть ответ, который может быть немного менее запутанным для новичков, подобных мне. Вы можете просто использовать map
в методе рендеринга компонентов.
render () {
return (
<div>
{stations.map(station => <div> {station} </div>)}
</div>
);
}