Kode FlatList dasar melempar Peringatan - Bereaksi Asli

129

FlatList tampaknya tidak berfungsi. Saya mendapat peringatan ini.

VirtualizedList: kunci yang hilang untuk item, pastikan untuk menentukan properti kunci pada setiap item atau berikan kustom keyExtractor.

Kode:

<FlatList 
  data={[{name: 'a'}, {name: 'b'}]} 
  renderItem={
    (item) => <Text key={Math.random().toString()}>{item.name}</Text>
  } 
  key={Math.random().toString()} />
Edison D'souza
sumber
3
@ Li357 ... dan gigih jika data tidak berubah. Kunci acak akan menyebabkan rerendering setiap item pada setiap perubahan data, yang akan sangat tidak efisien.
Jules
seperti yang dijelaskan di bawah ini harus berupa string, ada diskusinya pada repo resmi di sini . Saya pikir tim asli reaksi ingin menyelamatkan pengguna untuk tidak menggunakan indeks sebagai kunci tetapi itu bukan solusi yang baik. Saya harus dapat menggunakan id db sebagai kunci. saya tidak perlu mengubahnya menjadi string.
kacang

Jawaban:

313

Cukup lakukan ini:

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

Sumber: di sini

sinar
sumber
{item.name} tidak berfungsi. Tapi {item.item.name} berhasil untuk saya. Mungkin karena saya memberikan (item) alih-alih ({item}) di renderItem. Terima kasih @Raymond
Edison D'souza
1
Karena kawat gigi keriting. Jika Anda akan menggunakan kurung kurawal Anda perlu menambahkan pernyataan kembali.
Ray
7
Ini mungkin tidak berfungsi. Setelah menghapus dan menambahkan beberapa elemen, ia mulai menampilkan item yang digandakan. Saya pikir tujuan keyExtractor adalah untuk unik item. Idealnya Anda harus memiliki id unik untuk setiap item dan menggunakan id sebagai kuncinya. mis. keyExtractor = {item => item.id}
JustWonder
2
@JustWonder - benar; jika daftar Anda akan menghapus item, Anda tidak dapat menggunakan indeks sebagai kunci, dan Anda harus menemukan cara lain untuk menghasilkan kunci unik untuk setiap item. Untuk kasus di mana barang hanya ditambahkan, pendekatan ini baik-baik saja.
Jules
19
indeks yang dikembalikan harus berupa string: keyExtractor={(item, index) => index.toString()}
roadev
41

Anda tidak perlu menggunakan keyExtractor. The React Native docs sedikit tidak jelas tetapi keyproperti harus masuk di setiap elemen dataarray daripada di komponen turunan anak. Jadi, bukannya

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

yang mana yang Anda harapkan, Anda hanya perlu meletakkan keybidang di setiap elemen dataarray:

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

Dan jelas jangan meletakkan string acak sebagai kuncinya.

Ben
sumber
13

Ini bekerja untuk saya:

<FlatList
  data={[{name: 'a'}, {name: 'b'}]} 
  keyExtractor={(item, index) => index.toString()}
/>
rjh
sumber
1
ataukeyExtractor={ ( item, index ) => `${index}` }
Ivor Scott
9

Kamu bisa memakai

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

CATATAN: Menggunakan index.toString () yaitu diharapkan menjadi string.

Ramusesan
sumber
5

Memiliki 'id' di data Anda

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

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

Semoga ini membantu !!!

Yogaraj Saravanan
sumber
2

Solusi sederhana adalah dengan hanya memberikan setiap entri kunci yang unik sebelum rendering FlatList, karena itulah yang mendasarinya VirtualizedListperlu melacak setiap entri.

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

Peringatan tidak menyarankan melakukan hal ini terlebih dahulu, atau memberikan ekstraktor kunci khusus.

Pai 'Oh' Pah
sumber
2

kode ini berfungsi untuk saya:

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}
    />

harisman nug
sumber
2

Ini tidak memberikan peringatan apa pun (mengubah indeks menjadi string):

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

jika data Anda bukan objek: [sebenarnya itu menggunakan setiap indeks item (dalam array) sebagai kunci]

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

Mencoba jawaban Ray tetapi kemudian mendapat peringatan bahwa "kuncinya harus berupa string". Versi modifikasi berikut berfungsi dengan baik untuk menekan yang asli dan kunci ini peringatan jika Anda tidak memiliki kunci unik yang baik pada item itu sendiri:

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

Tentu saja jika Anda memiliki kunci unik yang jelas dan bagus pada item itu sendiri, Anda bisa menggunakannya.

CodeBrew
sumber
0

Pastikan untuk menulis pernyataan pengembalian jika tidak maka tidak akan menghasilkan apa-apa ..

Hamza Ahmed Jameel
sumber
-2

Ini bekerja untuk saya:

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

Mengubah keyExtractormenjadi stringtetapi bukannya menggunakan indeks menggunakan nomor yang dihasilkan secara acak.

Ketika saya menggunakan keyExtractor={(item, index) => index.toString()}, itu tidak pernah berhasil dan masih mengeluarkan peringatan. Tapi mungkin ini bekerja untuk seseorang?

kelinci putih
sumber
2
Kunci seharusnya unik. Menggunakan string acak bukan ide yang baik. Seperti disebutkan di atas, itu akan menyebabkan rendering ulang yang tidak diperlukan karena fungsi acak mengembalikan nilai yang berbeda jika reaksi mencoba merender ulang karena perubahan lain.
Edison D'souza
Kudengar kalian terima kasih untuk itu. Tapi bagaimana lagi Anda mendapatkan string yang unik, bagaimana jika Anda memiliki 5flatlists
White Rabbit