161 votes

Le code de base de FlatList génère un avertissement - React Native

FlatList ne semble pas fonctionner. Je reçois cet avertissement.

VirtualizedList : clés manquantes pour les éléments, assurez-vous de spécifier une propriété de clé sur chaque élément ou fournissez un keyExtractor personnalisé.

Code :

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

3 votes

@Li357 ... et persistantes si les données sont inchangées. Les clés aléatoires entraîneront un nouveau rendu de chaque élément à chaque changement de données, ce qui serait très inefficace.

1 votes

Comme décrit ci-dessous, il devrait être une chaîne, il y a une disccusion sur le repo officiel aquí . Je pense que l'équipe de react-native voulait éviter aux utilisateurs d'utiliser l'index comme clé mais ce n'est pas une bonne solution. Je devrais pouvoir utiliser l'id de la base de données comme clé. Je n'ai pas besoin de le convertir en chaîne.

372voto

Ray Points 3720

Faites simplement ceci :

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

Source : aquí

0 votes

{item.name} n'a pas fonctionné. Mais {item.item.name} a fonctionné pour moi. Peut-être parce que j'ai donné (item) au lieu de ({item}) dans renderItem. Merci @Raymond

0 votes

Pourquoi renderItem={ (item) => <Text>{item.name}</Text>} fonctionne et renderItem={ (item) => {<Text>{item.name}</Text>} } ne fonctionne pas ?

1 votes

A cause des accolades. Si vous utilisez des accolades, vous devez ajouter une déclaration de retour.

48voto

Ben Points 516

Vous n'avez pas besoin d'utiliser keyExtractor . Le site Documentation sur React Native sont un peu flous mais le key doit être placée dans chaque élément du data tableau plutôt que dans le composant enfant rendu. Ainsi, au lieu de

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

ce qui est ce à quoi on s'attend, il suffit de mettre une key dans chaque élément du data le tableau :

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

Et ne mettez surtout pas une chaîne aléatoire comme clé.

17voto

rjh Points 131

Cela a marché pour moi :

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

1 votes

Ou keyExtractor={ ( item, index ) => `${index}` }

13voto

Ramusesan Points 185

Vous pouvez utiliser

 <FlatList   
  data={[]}  
  keyExtractor={(item, index) => index.toString()} 
 />

NOTE : Utilisation de index.toString(), c'est-à-dire que l'on s'attend à ce que ce soit une chaîne de caractères.

2voto

Pie 'Oh' Pah Points 3284

Une solution simple consiste à donner à chaque entrée une clé unique avant d'effectuer le rendu avec FlatList puisque c'est ce que le sous-jacent VirtualizedList doit assurer le suivi de chaque entrée.

 users.forEach((user, i) => {
    user.key = i + 1;
 });

L'avertissement conseille de le faire d'abord, ou de fournir un extracteur de clés personnalisé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X