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.