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

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


{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.


13

Ini bekerja untuk saya:

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

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.


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 !!!


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.


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


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

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

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.


0

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


-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?


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.