मैंने iOS और Android दोनों के लिए ReactNative के साथ एक ऐप बनाया है 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}
/>
);
}
मेरे डेटा स्रोत में कुछ इस तरह हैं:
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)
});
और सूची दृश्य-पंक्तियों को सामान की तरह प्रस्तुत किया गया है:
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" के लिए एक कुंजी-संपत्ति जोड़ना -क्लास समस्या हल नहीं हुई।
यह है, क्या वास्तव में "cloneWithRows" के परिणामस्वरूप ListView को पारित किया जाएगा।
_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
) को दिखाने की आवश्यकता है । वे ठीक काम कर रहे हैं और उम्मीद की जाती है जब तक कि किसी स्रोत में डेटा स्रोत को संशोधित नहीं किया जाता है (उदाहरण के लिए पंक्तियों को हटा दिया जाता है), जिस बिंदु पर रिएक्ट को पता नहीं चलेगा कि उनके साथ क्या करना है जब उनके पास एक विशिष्ट पहचानकर्ता नहीं है।