Saya membuat aplikasi dengan ReactNative baik untuk iOS dan android dengan file ListView
. Saat mengisi listview dengan sumber data yang valid, peringatan berikut dicetak di bagian bawah layar:
Peringatan: Setiap anak dalam larik atau iterator harus memiliki properti "kunci" yang unik. Periksa metode render
ListView
.
Apa tujuan peringatan ini? Setelah pesan yang mereka tautkan halaman ini , di mana hal-hal yang berbeda dibahas yang tidak ada hubungannya dengan react native, tetapi dengan reactjs berbasis web.
ListView saya dibuat dengan pernyataan tersebut:
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}
/>
);
}
Sumber Data saya terdiri dari sesuatu seperti:
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)
});
Dan ListView-Rows dirender dengan hal-hal seperti:
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>
);
Semuanya bekerja dengan baik dan seperti yang diharapkan, kecuali peringatan yang tampaknya sama sekali tidak masuk akal bagi saya.
Menambahkan properti kunci ke kelas "DetailItem" saya tidak menyelesaikan masalah.
Ini, apa yang sebenarnya akan diteruskan ke ListView sebagai hasil dari "cloneWithRows":
_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: '' } ] },
Seperti yang dilihat oleh salah satu kunci, setiap record memiliki properti kunci. Peringatan itu masih ada.
DetailItem
perlu memiliki kunci. Jika mereka sudah memiliki kunci unik, Anda perlu menunjukkan metode render lainnya (renderHeader, renderDetailItem, renderSeparator
). Mereka berfungsi dengan baik dan diharapkan sampai sumber data diubah di suatu tempat (baris dihapus, misalnya) di mana React tidak akan tahu apa yang harus dilakukan dengan mereka ketika mereka tidak memiliki pengenal unik.