2017-02-28 16 views
12

Render fonksiyonunda özdeş bir bileşen döngü yapmak mümkün mü? BöyleÖğeleri nasıl React-native içinde döngü ve render?

şey:

... 

onPress =() => { 
... 
}; 

initialArr = [["blue","text1"],["red","text2"]]; 
buttonsListArr = []; 

for (let i = 0; i < initialArr.length; i++) 
{ 
buttonsListArr.push(
    <Button style={{borderColor:{initialArr[i][0]}}} onPress={this.onPress.bind(this)}>{initialArr[i][1]}</Button> 
); 
} 

... 

render() { 
    return (
    <View style={...}> 
    {buttonsListArr} 
    </View> 
)}; 

bu bileşenlerin sadece sonlu liste demek, bu yüzden ListView/scrollview vb gibi herhangi bir bileşen bu özel durumda uygulanamaz. Bu sadece sözdizimi sorusu.

+0

yerine neden haritayı kullanmak yapmıyorsun? 'const düğmeleri = buttonsListArr.map (öğe => {madde [1]}' ' ' '' render() { dönüş ( )}; '' ' –

cevap

13

Genellikle bu tür şeyler için harita kullanmak. Bir tarafı olarak

buttonsListArr = initialArr.map(buttonInfo => (
    <Button ... key={buttonInfo[0]}>{buttonInfo[1]}</Button> 
); 

ben yerine bir nesne kullanmak istiyorsunuz, (oluşturulan bileşen için benzersiz bir tanımlayıcı olmak. anahtar ihtiyaçlarını tepki olarak size eşleme yapmak her tuş gerekli bir prop) bir dizi. Nasıl göründüğünü bulmak daha güzel:

initialArr = [ 
    { 
    id: 1, 
    color: "blue", 
    text: "text1" 
    }, 
    { 
    id: 2, 
    color: "red", 
    text: "text2" 
    }, 
]; 

buttonsListArr = initialArr.map(buttonInfo => (
    <Button ... key={buttonInfo.id}>{buttonInfo.text}</Button> 
); 
6
render() { 
    return (
    <View style={...}> 
     {initialArr.map((prop, key) => { 
     return (
      <Button style={{borderColor: prop[0]}} key={key}>{prop[1]}</Button> 
     ); 
     })} 
    </View> 
) 
} 

olarak o zaman endeksler endişesi olmayacak hile ilk dizisi için

+1

iyi görünüyor, ama ben dönmeden önce hiç eşleme hareket edeceğini deyim şeyler daha güzel bakmak ve sadece görünüm içinde eşleştirilmiş dizi değişken adı kullandığından emin olmak için. bir not olarak, harita işlevine ikinci parametre geçiyor dizide elemanın endeksidir. onlar farklı bir tamsayı olabilir rağmen her seferinde anahtar özellik için iyi bir aday olmayabilirler. değişebilir ve böylece anahtar da değiştirilmelidir (benzersiz bir tanımlayıcı kullandıysanız, indeksler değişse bile tuşlar aynı kalır). – nbkhope

+2

docs Tepki göre, "ürün yeniden sıralayabilirsiniz eğer yavaş olacağı gibi biz, anahtarlar için endeksleri kullanılarak tavsiye etmiyoruz." - https://facebook.github.io/react/docs/lists-and- keys.html (Anahtarlar bölümü, alt) – nbkhope

+0

@nbkhope, anahtarlar hakkında bana yeni bilgiler veriyor. Teşekkürler! – Damathryx

1

yerine dizinin daha iyi kullanılması nesnesini yapmalıyım ve öyle de olacak çok daha net neyi ne:

gerçek haritalama için
const initialArr = [{ 
    color: "blue", 
    text: "text1" 
}, { 
    color: "red", 
    text: "text2" 
}]; 

yerine döngü için JS dizisi haritayı kullanabilirsiniz - hiçbir gerçek dizisi belli num şey görüntülendiği gibi, tanımlı olduğunda döngü durumlarda kullanılmalıdır için kez ber:

onPress =() => { 
    ... 
}; 

renderButtons() { 
    return initialArr.map((item) => { 
     return (
      <Button 
       style={{ borderColor: item.color }} 
       onPress={this.onPress} 
      > 
       {item.text} 
      </Button> 
     ); 
    }); 
} 

... 

render() { 
    return (
     <View style={...}> 
      { 
       this.renderButtons() 
      } 
     </View> 
    ) 
} 

Dışarıda daha okunabilir kod için bir yöntem işlemek ayrı fonksiyona eşleştirmesini taşındı. yapmanız gereken yaptıklarımıza bağlı Orada döngü birçok yolu yerli tepki elemanların listesi içinde olduğu ve hangi yolu kullanacağız. Bu yolların çoğu this article about React JSX loops'da ele alınmıştır ve React örneklerini kullanmasına rağmen, bunlardan her şey React Native'de kullanılabilir. Bu konuyla ilgileniyorsanız lütfen kontrol edin!

Ayrıca

değil döngü üzerinde konuyla ilgili ama zaten onPress işlevini tanımlamak için dizi sözdizimi kullandığınız olarak yeniden bağlamak için gerek yoktur. Bu, yine de, işlevin bu sözdizimi kullanılarak tanımlanması durumunda geçerlidir, çünkü ok sözdizimi otomatik olarak işlevi bağlar.

İlgili konular