Я створив додаток з ReactNative як для iOS, так і для Android з ListView
. Під час заповнення подання списку дійсним джерелом даних у нижній частині екрана друкується таке попередження:
Попередження: Кожна дочка в масиві або ітераторі повинна мати унікальний пропік "ключа". Перевірте метод візуалізації
ListView
.
Яка мета цього попередження? Після повідомлення вони посилаються на цю сторінку , де обговорюються різні речі, які не мають нічого спільного з рідною реакцією, а з веб-реакцією.
Мій ListView побудований з цими твердженнями:
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}
/>
);
}
Мій DataSource складається з приблизно такого:
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)
});
А рядки ListView відображаються такими речами, як:
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>
);
Все працює нормально і, як очікувалося, крім попередження, яке для мене здається цілковитою нісенітницею.
Додавання властивості ключа до мого "DetailItem" -Class не вирішило проблему.
Це те, що насправді буде передано ListView в результаті "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: '' } ] },
Як бачимо один ключ, кожен запис має властивість ключа. Попередження все ще існує.
DetailItem
потрібно мати ключі. Якщо вони вже мають унікальні ключі, вам потрібно показати інші методи візуалізації (renderHeader, renderDetailItem, renderSeparator
). Вони працюють нормально і очікувано, поки джерело даних не буде якось змінено (наприклад, рядки видалено), після чого React не знатиме, що з ними робити, коли вони не мають унікального ідентифікатора.