Ben sahip bir uygulama inşa ReactNative hem iOS için ve bir ile android ListView. Liste görünümü geçerli bir veri kaynağıyla doldurulurken, ekranın alt kısmında aşağıdaki uyarı yazdırılır:
Uyarı: Bir dizi veya yineleyicideki her çocuk benzersiz bir "anahtar" özelliğine sahip olmalıdır. Oluşturma yöntemini kontrol edin
ListView.
Bu uyarının amacı nedir? Mesajdan sonra onlar için link bu sayfayı komple farklı şeyler yerli tepki ile ilgisi olmayan hangi tartışılır, fakat web tabanlı reactjs ile.
My ListView şu ifadelerle oluşturulmuştur:
render() {
var store = this.props.store;
return (
<ListView
dataSource={this.state.dataSource}
renderHeader={this.renderHeader.bind(this)}
renderRow={this.renderDetailItem.bind(this)}
renderSeparator={this.renderSeparator.bind(this)}
style={styles.listView}
/>
);
}
My DataSource şunun gibi bir şeyden oluşur:
var detailItems = [];
detailItems.push( new DetailItem('plain', store.address) );
detailItems.push( new DetailItem('map', '') );
if(store.telefon) {
detailItems.push( new DetailItem('contact', store.telefon, 'Anrufen', 'fontawesome|phone') );
}
if(store.email) {
detailItems.push( new DetailItem('contact', store.email, 'Email', 'fontawesome|envelope') );
}
detailItems.push( new DetailItem('moreInfo', '') );
this.setState({
dataSource: this.state.dataSource.cloneWithRows(detailItems)
});
Ve ListView Satırları aşağıdaki gibi şeylerle oluşturulur:
return (
<TouchableHighlight underlayColor='#dddddd'>
<View style={styles.infoRow}>
<Icon
name={item.icon}
size={30}
color='gray'
style={styles.contactIcon}
/>
<View style={{ flex: 1}}>
<Text style={styles.headline}>{item.headline}</Text>
<Text style={styles.details}>{item.text}</Text>
</View>
<View style={styles.separator}/>
</View>
</TouchableHighlight>
);
Bana tamamen saçma gibi görünen uyarı dışında her şey yolunda ve beklendiği gibi çalışıyor.
"DetailItem" -Sınıfıma bir anahtar özelliği eklemek sorunu çözmedi.
Bu, gerçekten "cloneWithRows" sonucunda ListView'a geçirilecek olan şeydir:
_dataBlob:
I/ReactNativeJS( 1293): { s1:
I/ReactNativeJS( 1293): [ { key: 2,
I/ReactNativeJS( 1293): type: 'plain',
I/ReactNativeJS( 1293): text: 'xxxxxxxxxx',
I/ReactNativeJS( 1293): headline: '',
I/ReactNativeJS( 1293): icon: '' },
I/ReactNativeJS( 1293): { key: 3, type: 'map', text: '', headline: '', icon: '' },
I/ReactNativeJS( 1293): { key: 4,
I/ReactNativeJS( 1293): type: 'contact',
I/ReactNativeJS( 1293): text: '(xxxx) yyyyyy',
I/ReactNativeJS( 1293): headline: 'Anrufen',
I/ReactNativeJS( 1293): icon: 'fontawesome|phone' },
I/ReactNativeJS( 1293): { key: 5,
I/ReactNativeJS( 1293): type: 'contact',
I/ReactNativeJS( 1293): text: 'xxxxxxxxx@hotmail.com',
I/ReactNativeJS( 1293): headline: 'Email',
I/ReactNativeJS( 1293): icon: 'fontawesome|envelope' },
I/ReactNativeJS( 1293): { key: 6, type: 'moreInfo', text: '', headline: '', icon: '' } ] },
Bir anahtarın gördüğü gibi her kaydın bir anahtar özelliği vardır. Uyarı hala var.
DetailItemanahtarlarınızın olması gerekiyor. Zaten benzersiz anahtarlara sahiplerse, diğer oluşturma yöntemlerini (renderHeader, renderDetailItem, renderSeparator) göstermeniz gerekir . İyi çalışıyorlar ve veri kaynağı bir şekilde değiştirilene kadar (örneğin, satırlar kaldırılana kadar) React, benzersiz bir tanımlayıcıya sahip olmadıklarında onlarla ne yapacağını bilemeyecek.