내가 가진 응용 프로그램 내장 ReactNative을 모두 iOS 용 및 안드로이드 ListView
. 목록보기를 유효한 데이터 소스로 채울 때 화면 하단에 다음 경고가 인쇄됩니다.
경고 : 배열 또는 반복기의 각 하위에는 고유 한 "키"소품이 있어야합니다. 의 렌더링 방법을 확인하십시오
ListView
.
이 경고의 목적은 무엇입니까? 메시지 후 그들은 이 페이지로 연결됩니다 . 여기서 반응 네이티브와는 아무 관련이 없지만 웹 기반 reactjs와 관련된 완전한 다른 것들에 대해 논의합니다.
내 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-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에 키 속성을 추가해도 문제가 해결되지 않았습니다.
이것은 "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
)을 표시해야합니다 . 그들은 데이터 소스가 어떤 식 으로든 수정 될 때까지 (예를 들어 행이 제거 될 때까지) 정상적으로 작동하고 있으며 React는 고유 식별자가 없을 때 어떻게해야할지 알 수 없습니다.