Рендеринг реагирующих компонентов из массива объектов


у меня есть некоторые данные, называемые станциями, которые представляют собой массив, содержащий объекты.

stations : [
  {call:'station one',frequency:'000'},
  {call:'station two',frequency:'001'}
]

Я хотел бы отобразить компонент пользовательского интерфейса для каждой позиции массива. Пока я могу писать

 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} но ничего не печатает.

как я могу перебирать эти данные и возвращать новый элемент пользовательского интерфейса для каждой позиции массив?

3   51   2015-08-22 17:34:37

3 ответа:

вы можете сопоставить список станций с ReactElements.

С помощью React >= 16 можно возвращать несколько элементов из одного и того же компонента без необходимости дополнительной оболочки html-элемента. Начиная с 16.2, есть новый синтаксис для создания фрагментов. Если это не работает или не поддерживается IDE, вы можете использовать <React.Fragment> вместо. Между 16.0 и 16.2, вы можете использовать очень простой полифилл фрагментов.

попробуйте после

// 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/

у меня есть ответ, который может быть немного менее запутанным для новичков, таких как я. Вы можете просто использовать map в рамках метода визуализации компонентов.

render () {
   return (
       <div>
           {stations.map(station => <div> {station} </div>)} 
       </div>
   );
}

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>
);