ฉันสร้างแอพด้วยReactNativeทั้งสำหรับ iOS และ Android ด้วยไฟล์ListView
. เมื่อเติมข้อมูลมุมมองรายการด้วยแหล่งข้อมูลที่ถูกต้องคำเตือนต่อไปนี้จะพิมพ์ที่ด้านล่างของหน้าจอ:
คำเตือน: ลูกแต่ละคนในอาร์เรย์หรือตัววนซ้ำควรมีเสา "คีย์" เฉพาะ
ListView
ตรวจสอบการแสดงผลของวิธีการ
คำเตือนนี้มีจุดประสงค์อะไร? หลังจากข้อความพวกเขาเชื่อมโยงไปยังหน้านี้ซึ่งจะมีการพูดคุยถึงสิ่งที่แตกต่างกันโดยสมบูรณ์ซึ่งไม่มีส่วนเกี่ยวข้องกับ react native แต่ใช้ reactjs บนเว็บ
My 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)
});
และ ListView-Rows จะแสดงผลด้วยสิ่งต่างๆเช่น:
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 จะไม่รู้ว่าจะทำอย่างไรกับพวกเขาเมื่อพวกเขาไม่มีตัวระบุที่ไม่ซ้ำกัน