Tôi đã xây dựng một ứng dụng với ReactNative cho cả iOS và Android với a ListView
. Khi điền vào listview với một nguồn dữ liệu hợp lệ, cảnh báo sau được in ở cuối màn hình:
Cảnh báo: Mỗi phần tử con trong một mảng hoặc trình vòng lặp phải có một chỗ dựa "khóa" duy nhất. Kiểm tra phương thức kết xuất của
ListView
.
Mục đích của cảnh báo này là gì? Sau thông báo, họ liên kết đến trang này , nơi thảo luận về những thứ hoàn chỉnh khác nhau, không liên quan gì đến phản ứng gốc, nhưng với phản ứng dựa trên web.
ListView của tôi được xây dựng với các câu lệnh đó:
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 của tôi bao gồm một số thứ như:
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)
});
Và ListView-Rows được hiển thị với những thứ như:
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>
);
Mọi thứ đều hoạt động tốt và như mong đợi, ngoại trừ cảnh báo dường như hoàn toàn vô nghĩa đối với tôi.
Thêm thuộc tính khóa vào "DetailItem"-Class của tôi không giải quyết được vấn đề.
Đây là, những gì thực sự sẽ được chuyển đến ListView do kết quả của "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: '' } ] },
Như một khóa đã thấy, mỗi bản ghi có một thuộc tính khóa. Cảnh báo vẫn tồn tại.
DetailItem
cần phải có chìa khóa. Nếu họ đã có các khóa duy nhất, bạn cần hiển thị các phương thức kết xuất khác (renderHeader, renderDetailItem, renderSeparator
). Chúng đang hoạt động tốt và được mong đợi cho đến khi nguồn dữ liệu được sửa đổi theo cách nào đó (ví dụ: các hàng bị xóa), lúc đó React sẽ không biết phải làm gì với chúng khi chúng không có một mã định danh duy nhất.