基本的なFlatListコードが警告をスローする-React Native


129

FlatListが機能していないようです。この警告が表示されます。

VirtualizedList:アイテムのキーが不足しています。各アイテムのキープロパティを指定するか、カスタムのkeyExtractorを指定してください。

コード:

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

3
@ Li357 ...データが変更されていない場合は永続。ランダムキーは、すべてのデータ変更ですべてのアイテムを再レンダリングするため、非常に非効率的です。
ジュール

以下で説明するように、これは文字列である必要があります。公式のレポについてはここで議論があります。反応ネイティブチームは、ユーザーがインデックスをキーとして使用しないようにしたかったのですが、それは良い解決策ではありません。キーとしてdb idを使用できるはずです。文字列に変換する必要はありません。
ペジャ

回答:


313

単にこれを行う:

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

出典:こちら


{item.name}は機能しませんでした。しかし、{item.item.name}は私にとってはうまくいきました。renderItemで({item})ではなく(item)を指定したことが原因である可能性があります。ありがとう@Raymond
Edison D'

1
中括弧のため。中括弧を使用する場合は、returnステートメントを追加する必要があります。
Ray

7
これは機能しない場合があります。いくつかの要素を削除して追加した後、重複したアイテムを表示し始めました。keyExtractorの目的はアイテムを一意にすることだと思います。理想的には、アイテムごとに一意のIDを持ち、そのIDをキーとして使用する必要があります。例keyExtractor = {item => item.id}
JustWonder

2
@JustWonder-右; リストでアイテムを削除する場合、インデックスをキーとして使用することはできず、アイテムごとに一意のキーを生成する別の方法を見つける必要があります。ものを追加するだけの場合は、このアプローチで問題ありません。
ジュール

19
返されるインデックスは文字列でなければなりません:keyExtractor={(item, index) => index.toString()}
roadev

41

使用する必要はありません keyExtractorリアクトネイティブドキュメントは少し不明であるが、keyプロパティは、各要素に行くべきdata配列ではなく、レンダリングされた子コンポーネントで。だからではなく

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

これはあなたが期待することです、あなたはただのkey各要素にフィールドを置く必要がありますdata配列の:

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

また、ランダムな文字列をキーとして使用しないでください。


13

これは私のために働きました:

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

1
またはkeyExtractor={ ( item, index ) => `${index}` }
Ivor Scott、

9

使用できます

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

注:index.toString()の使用、つまり文字列であることが期待されています。


5

データに「ID」がある

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

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

お役に立てれば !!!


2

シンプルな解決策は、でレンダリングする前に、各エントリに一意のキーを与えるだけです。FlatListこれは、基礎となるものがVirtualizedList各エントリを追跡するために必要なものだからです。

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

警告は、これを最初に行うことをアドバイスするか、カスタムキーエクストラクターを提供します。


2

このコードは私のために働きます:

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

これは警告を出しませんでした(インデックスを文字列に変換します):

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

1

あなたのデータがオブジェクトではない場合:[実際にはそれはキーとして(配列内の)各項目インデックスを使用しています]

   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

レイの答えを試しましたが、「キーは文字列でなければならない」という警告を受けました。次の変更されたバージョンは、アイテム自体に適切な一意のキーがない場合、元の文字列とこの文字列キーの警告を抑制するのに適しています。

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

もちろん、アイテム自体に明確で優れた一意のキーがある場合は、それを使用できます。



-2

これは私のために働きました:

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

keyExtractorをa に変換しますstringが、インデックスを使用する代わりに、ランダムに生成された数値を使用します。

私が使用したときkeyExtractor={(item, index) => index.toString()}、それは決して機能せず、警告を発しました。しかし、多分これは誰かのために働きますか?


2
キーは一意であることが想定されています。ランダムな文字列を使用することはお勧めできません。上述したように、reactが他の変更のために再レンダリングを試みた場合、ランダム関数は異なる値を返すため、不要な再レンダリングが発生します。
エジソンD'souza

あなたはそれをありがとうと聞いた。しかし、他にどのようにして一意の文字列を取得しますか。flatlists
White Rabbit
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.