2017-06-14 27 views
32

FlatList scheint nicht zu funktionieren. Ich bekomme diese Warnung.Grundlegende FlatList-Codewürfe Warnung - Native reagieren

VirtualizedList: fehlende Schlüssel für Elemente, stellen Sie sicher, dass Sie für jedes Element eine Schlüsseleigenschaft angeben oder einen benutzerdefinierten keyExtractor bereitstellen.

Code:

<FlatList 
    data={[{name: 'a'}, {name: 'b'}]} 
    renderItem={ 
    (item) => <Text key={Math.random().toString()}>{item.name}</Text> 
    } 
    key={Math.random().toString()} /> 
+2

Nicht gut, um einen zufälligen Schlüssel zu verwenden, da Schlüssel eindeutig sein sollen. – Li357

Antwort

102

einfach dies zu tun:

<FlatList 
    data={[{name: 'a'}, {name: 'b'}]} 
    renderItem={ 
    (item) => <Text>{item.name}</Text> 
    } 
    keyExtractor={(item, index) => index} 
/> 

Quelle: here

+0

{item.name} hat nicht funktioniert. Aber {item.item.name} hat für mich funktioniert. Kann sein, weil ich (item) anstelle von ({item}) in renderItem angegeben habe. Dank @Raymond –

+0

Warum renderItem = { (item) => {item.name}} funktioniert und renderItem = { (item) => {{ item.name}}} nicht funktioniert? –

+0

Wegen der geschweiften Klammern. Wenn Sie geschweifte Klammern verwenden möchten, müssen Sie eine return-Anweisung hinzufügen. – Raymond

10

Sie brauchen nicht keyExtractor zu verwenden. Die React Native docs sind ein wenig unklar , aber die key Eigenschaft sollte in jedem Element der data Array statt in der gerenderten Kindkomponente gehen. Also anstatt

<FlatList 
    data={[{id: 'a'}, {id: 'b'}]} 
    renderItem={({item}) => <View key={item.id} />} 
/> 
// React will give you a warning about there being no key prop 

das ist, was man erwarten würde, brauchen Sie nur in jedem Element des data Array ein key Feld stellen:

<FlatList 
    data={[{key: 'a'}, {key: 'b'}]} 
    renderItem={({item}) => <View />} 
/> 
// React is happy! 

Und definitiv nicht eine zufällige Zeichenfolge setzen als Schlüssel.

+0

funktioniert nicht. 'keyExtractor' hat das Problem gelöst. – user3526468

+0

funktioniert hier gut – Julian

1

Eine einfache Lösung besteht darin, jedem Eintrag einen eindeutigen Schlüssel zu geben, bevor er mit FlatList rendert, da dies der zugrunde liegende VirtualizedList jeden Eintrag verfolgen muss.

Die Warnung tut dies zuerst, oder bietet einen benutzerdefinierten Schlüssel Extraktor.