Nesne Dizisinden React Bileşenlerini Oluşturma


105

Nesneleri içeren bir dizi olan istasyon adı verilen bazı verilerim var.

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

Her dizi konumu için bir ui bileşeni oluşturmak istiyorum. Şimdiye kadar yazabilirim

 var stationsArr = []
 for (var i = 0; i < this.data.stations.length; i++) {
     stationsArr.push(
         <div className="station">
             {this.data}
         </div>
     )
 }

Ve sonra işle

render(){
 return (
   {stationsArr}
 )
}

Sorun şu ki, tüm verileri yazdırıyorum. Bunun yerine sadece bir anahtar göstermek istiyorum {this.data.call}ama bu hiçbir şey yazdırmıyor.

Bu veriler arasında nasıl döngü yapabilirim ve dizinin her konumu için yeni bir UI öğesi döndürebilirim?


Yanılıyor olabilirim ama işlevin içinde kullanmak stationsArryerine kullanmanız gerektiğini düşünüyorum . stationsrender
Tahir Ahmed

Yanıtlar:


155

İstasyonların listesini ReactElements'e eşleyebilirsiniz.

React> = 16 ile, fazladan bir html öğesi sarmalayıcısına ihtiyaç duymadan aynı bileşenden birden fazla öğe döndürmek mümkündür. 16.2'den beri, parçalar oluşturmak için yeni bir sözdizimi <> var . Bu işe yaramazsa veya IDE'niz tarafından desteklenmiyorsa, <React.Fragment>bunun yerine kullanabilirsiniz . 16.0 ile 16.2 arasında, parçalar için çok basit bir polyfill kullanabilirsiniz .

Takip etmeyi dene

// 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Özniteliği unutma !

https://jsfiddle.net/69z2wepo/14377/


@thatgibbyguy: Ah evet! bu doğru cevap olabilir. Çocuk bileşenlerinin etrafına bir sargı olması gerekiyor. Sizin renderfonksiyonu tek eleman dönmelidir.
Tahir Ahmed

Her bir istasyon öğesi için bir anahtar nitelik önermenin nedeni ne olabilir? Sormak istediğim, şimdi ihtiyaç duyulmasa bu ne değişir?
thatgibbyguy

4
@thatgibbyguy bu durumda çok avantaj sağlamaz. Daha gelişmiş örneklerde, React mevcut bir düğümün istasyon dizisinde başka bir yere taşınmış olup olmadığını kolayca bildiği için daha iyi işleme performanslarına sahip olmaya izin verir, böylece mevcut bir dom düğümünü yok etmek ve yeniden oluşturmaktan kaçınır (ve ayrıca dom düğümünü takılı halde tutar) . Tepki belgesinde: facebook.github.io/react/docs/reconciliation.html#keys
Sebastien Lorber

Biraz konu dışı ama bunu sormak için nasıl bir sorgu oluşturacağımı bilmiyorum. Yukarıdaki örneğinizde ES6 sözdizimini kullanırken, haritadan indeksi geçmek nasıl olur? IOW, dizinin son düğümünde olup olmadığımı nasıl anlayabilirim? Parantez içine almayı denedim ve bu pek iyi gitmedi.
Lane Goolsby

@ElHombre stations.map((station,index) => { })benim için iyi çalışıyor
Sebastien Lorber

49

Benim gibi yeni başlayanlar için biraz daha az kafa karıştırıcı olabilecek bir cevabım var. Yalnızca mapbileşen oluşturma yöntemi içinde kullanabilirsiniz .

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


2
Bazen bu çok daha yararlıdır. :)
ferit

7

this.data muhtemelen tüm verileri içerir, bu nedenle şöyle bir şey yapmanız gerekir:

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

Veya mapES6 kullanıyorsanız ve ok işlevlerini kullanabilirsiniz :

const stations = this.data.stations.map(station =>
    <div key={station.call} className="station">
      Call: {station.call}, Freq: {station.frequency}
    </div>
);

2
Bu, mevcut React Sürümünde çalışmaz, bir dizi döndüremezsiniz.
Aftab Naveed

@AftabNaveed teşekkürler, güncelledim, render bir öğe döndürmeli ancak içinde bir dizi öğenin olması geçerli
Dominic

@AftabNaveed'in dediği gibi, <16 sürümüne tepki verdiyseniz, yukarıdakileri kullanmanız gerekir, aksi takdirde yalnızca return stations;( codepen.io/pawelgrzybek/pen/WZEKWj )
Chicken Suop

1

Kullanılabilecek birkaç yol var.

const stations = [
  {call:'station one',frequency:'000'},
  {call:'station two',frequency:'001'}
];
const callList = stations.map(({call}) => call)

1.Çözüm

<p>{callList.join(', ')}</p>

2.Çözüm

<ol>    
  { callList && callList.map(item => <li>{item}</li>) }
</ol>

Tür antonelli-z8372'yi düzenle

Elbette başka yollar da var.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.