Il codice FlatList di base genera Avviso - Reagisci nativo


129

FlatList non sembra funzionare. Ricevo questo avviso.

VirtualizedList: chiavi mancanti per gli articoli, assicurati di specificare una proprietà chiave su ogni articolo o fornisci un keyExtractor personalizzato.

Codice:

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

3
@ Li357 ... e persistente se i dati sono invariati. Le chiavi casuali causeranno il rinvio di ogni elemento su ogni modifica dei dati, il che sarebbe molto inefficiente.
Jules

come descritto di seguito dovrebbe essere una stringa, c'è una delusione sul repository ufficiale qui . Penso che il team di reazione nativo volesse salvare gli utenti in modo da non utilizzare l'indice come chiave, ma non è una buona soluzione. Dovrei essere in grado di utilizzare ID DB come chiave. non devo convertirlo in una stringa.
peja

Risposte:


313

Basta fare questo:

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

Fonte: qui


{item.name} non ha funzionato. Ma {item.item.name} ha funzionato per me. Forse perché ho dato (item) invece di ({item}) in renderItem. Grazie @Raymond
Edison D'souza il

1
A causa delle parentesi graffe. Se hai intenzione di usare parentesi graffe, devi aggiungere una dichiarazione di ritorno.
Ray,

7
Questo potrebbe non funzionare. Dopo aver eliminato e aggiunto alcuni elementi, ha iniziato a visualizzare elementi duplicati. Penso che lo scopo di keyExtractor sia unicamente un articolo. Idealmente, dovresti avere un ID univoco per ogni elemento e utilizzare l'id come chiave. es. keyExtractor = {item => item.id}
JustWonder,

2
@JustWonder - giusto; se all'elenco verranno rimossi gli elementi, non è possibile utilizzare l'indice come chiave e si deve trovare un altro modo di generare una chiave univoca per ciascun elemento. Nel caso in cui roba venga sempre aggiunta, questo approccio va bene.
Jules,

19
l'indice restituito deve essere una stringa:keyExtractor={(item, index) => index.toString()}
roadev

41

Non è necessario utilizzare keyExtractor. I documenti nativi di React sono un po 'poco chiari ma la keyproprietà dovrebbe andare in ogni elemento datadell'array piuttosto che nel componente figlio renderizzato. Quindi piuttosto che

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

che è quello che ti aspetteresti, devi solo inserire un keycampo in ciascun elemento datadell'array:

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

E sicuramente non mettere una stringa casuale come chiave.


13

Questo ha funzionato per me:

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

1
oppurekeyExtractor={ ( item, index ) => `${index}` }
Ivor Scott

9

Puoi usare

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

NOTA: l'utilizzo di index.toString (), ovvero dovrebbe essere una stringa.


5

Avere un "id" nei dati

const data = [
{
  name: 'a',
  id: 1
},
{
  name: 'b',
  id: 2
}];

<FlatList 
  data={data}
  renderItem={
    (item) => <Text>{item.name}</Text>
  } 
  keyExtractor={item => item.id}
/>

Spero che questo ti aiuti !!!


2

Una soluzione semplice è fornire a ciascuna voce una chiave univoca prima del rendering FlatList, poiché è ciò di cui il sottostante ha VirtualizedListbisogno per tenere traccia di ciascuna voce.

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

L'avvertimento consiglia prima di eseguire questa operazione o fornisce un estrattore di chiavi personalizzato.


2

questo codice funziona per me:

const content = [
  {
    name: 'Marta',
    content: 'Payday in November: Rp. 987.654.321',
  },]
 
  <FlatList
      data= {content}
      renderItem = { ({ item }) => (
        <View style={{ flexDirection: 'column',             justifyContent: 'center' }}>
      <Text style={{ fontSize: 20, fontWeight: '300', color: '#000000' }}>{item.name}</Text>
      <Text style={{ color: '#000000' }}>{item.content}</Text>
        
        />
      )}
      keyExtractor={(item,index) => item.content}
    />


2

Questo non ha dato alcun avvertimento (trasformando l'indice in una stringa):

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

1

nel caso in cui i tuoi dati non siano un oggetto: [in effetti sta usando ogni indice di elemento (nell'array) come chiave]

   data: ['name1','name2'] //declared in constructor
     <FlatList
  data= {this.state.data}
  renderItem={({item}) => <Text>{item}</Text>}
  ItemSeparatorComponent={this.renderSeparator}
keyExtractor={(item, index) => index.toString()}
/>

0

Ho provato la risposta di Ray ma poi ha ricevuto un avvertimento che "la chiave deve essere una stringa". La seguente versione modificata funziona bene per sopprimere l'originale e questo avviso di chiave stringa se non si dispone di una buona chiave univoca sull'elemento stesso:

keyExtractor={(item, index) => item + index}

Naturalmente se hai una chiave unica ovvia e buona sull'oggetto stesso, puoi semplicemente usarla.


0

Assicurati di scrivere la dichiarazione di ritorno, altrimenti non restituirà nulla ... Accolto con me.


-2

Questo ha funzionato per me:

<FlatList
  data={items}
  renderItem={({ title }) => <Text>{title}</Text> }}
  keyExtractor={() => Math.random().toString(36).substr(2, 9)} />

Trasformando keyExtractorin un stringma invece di usare l'indice usa un numero generato casualmente.

Quando l'ho usato keyExtractor={(item, index) => index.toString()}, non ha mai funzionato e ha comunque lanciato un avvertimento. Ma forse questo funziona per qualcuno?


2
Le chiavi dovrebbero essere uniche. L'uso di stringhe casuali non è una buona idea. Come accennato in precedenza, causerà il rendering non richiesto poiché la funzione casuale restituisce un valore diverso se reagisce tenta di eseguire nuovamente il rendering a causa di qualsiasi altra modifica.
Edison D'souza,

Ti sento amico grazie per quello. Ma come altrimenti otterresti una stringa unica, e se avessi 5flatlists
White Rabbit il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.