Temel FlatList kodu Uyarı atıyor - React Native


129

FlatList çalışmıyor gibi görünüyor. Bu uyarıyı alıyorum.

VirtualizedList: öğeler için eksik anahtarlar, her öğede bir anahtar özelliği belirttiğinizden veya özel bir keyExtractor sağladığınızdan emin olun.

Kod:

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

3
@ Li357 ... ve veriler değişmemişse kalıcı. Rastgele anahtarlar, her veri değişikliğinde her öğenin yeniden oluşturulmasına neden olur ve bu çok verimsiz olur.
Jules

aşağıda açıklandığı gibi bir string olmalıdır, burada resmi repo ile ilgili bir tartışma var . React-native ekibinin, indeksi anahtar olarak kullanmamaları için kullanıcıları kurtarmak istediğini düşünüyorum, ancak bu iyi bir çözüm değil. Db kimliğini anahtar olarak kullanabilmeliyim. onu bir dizgeye dönüştürmek zorunda değilim.
peja

Yanıtlar:


313

Basitçe şunu yapın:

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

Kaynak: burada


{item.name} çalışmadı. Ancak {item.item.name} benim için çalıştı. RenderItem'de ({item}) yerine (item) vermiş olmam olabilir. Teşekkürler @Raymond
Edison D'souza

1
Kıvırcık teller yüzünden. Küme parantezi kullanacaksanız, bir return ifadesi eklemeniz gerekir.
Ray

7
Bu işe yaramayabilir. Bazı öğeleri silip ekledikten sonra, yinelenen öğeleri görüntülemeye başladı. KeyExtractor'ın amacının benzersiz bir öğe olduğunu düşünüyorum. İdeal olarak, her öğe için benzersiz bir kimliğiniz olmalı ve anahtar olarak kimliği kullanmalısınız. örneğin keyExtractor = {item => item.id}
JustWonder

2
@JustWonder - doğru; listenizdeki öğeler kaldırılacaksa, dizini anahtar olarak kullanamazsınız ve her öğe için benzersiz bir anahtar oluşturmanın başka bir yolunu bulmanız gerekir. Sadece bir şeyler eklendiği durumda, bu yaklaşım iyidir.
Jules

19
döndürülen dizin bir dize olmalıdır:keyExtractor={(item, index) => index.toString()}
roadev

41

Kullanmanıza gerek yok keyExtractor. Tepki Yerli dokümanlar biraz belirsiz ama keymülkiyet her elemanda gitmeli datadizisi ziyade işlenen çocuk bileşeninde. Yerine

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

ki beklediğiniz gibi, dizinin keyher bir öğesine bir alan koymanız yeterlidir data:

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

Ve kesinlikle anahtar olarak rastgele bir dizge koymayın.


13

Bu benim için çalıştı:

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

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

9

Kullanabilirsiniz

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

NOT: index.toString () kullanılması yani dizge olması bekleniyor.


5

Verilerinizde bir 'kimlik' var

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

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

Bu yardımcı olur umarım !!!


2

Basit bir çözüm, her bir girişi oluşturmadan önce her girişe benzersiz bir anahtar vermektir FlatList, çünkü temelde VirtualizedListher girişi izlemek için gereken şey budur .

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

Uyarı, önce bunu yapmayı tavsiye eder veya özel bir anahtar çıkarıcı sağlar.


2

bu kod benim için çalışıyor:

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

Bu herhangi bir uyarı vermedi (dizini bir dizeye dönüştürmek):

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

1

Verilerinizin bir nesne olmaması durumunda: [aslında her öğe dizinini (dizideki) bir anahtar olarak kullanıyor]

   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

Ray'in cevabını denedim ama sonra "anahtarın bir dizge olması gerektiği" uyarısı aldı. Aşağıdaki değiştirilmiş sürüm, öğenin kendisinde iyi bir benzersiz anahtarınız yoksa orijinali ve bu dize anahtar uyarısını bastırmak için iyi çalışır:

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

Elbette, öğenin kendisinde açık ve iyi bir benzersiz anahtarınız varsa, bunu kullanabilirsiniz.


0

Return ifadesi yazdığınızdan emin olun, aksi takdirde hiçbir şey döndürmez .. Bende oldu.


-2

Bu benim için çalıştı:

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

A'ya keyExtractordönüştürmek stringama indeks kullanmak yerine rastgele oluşturulmuş bir sayı kullanın.

Kullandığımda keyExtractor={(item, index) => index.toString()}, hiç işe yaramadı ve hala bir uyarı attı. Ama belki bu birisi için işe yarar?


2
Anahtarların benzersiz olması gerekir ve rastgele dizge kullanmak iyi bir fikir değildir. Yukarıda belirtildiği gibi, react başka bir değişiklik nedeniyle yeniden oluşturmaya çalışırsa rastgele işlev farklı bir değer döndürdüğünden, gereksiz yeniden oluşturmaya neden olacaktır.
Edison D'souza

Ahbap bunun için teşekkür ettiğini duydum. Ama başka nasıl benzersiz bir dizge elde edersiniz, peki ya 5flatlists
White Rabbit
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.