기본 FlatList 코드에서 경고가 발생 함-기본 반응


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 ... 및 데이터가 변경되지 않은 경우 지속됩니다. 임의의 키는 모든 데이터 변경시 모든 항목을 다시 렌더링하게하므로 매우 비효율적입니다.
Jules

아래에 설명 된대로 문자열이어야하며 여기 에는 공식 저장소에 대한 토론이 있습니다 . 반응 네이티브 팀은 인덱스를 키로 사용하지 않도록 사용자를 저장하려고했지만 좋은 해결책은 아닙니다. db id를 키로 사용할 수 있어야합니다. 문자열로 변환 할 필요가 없습니다.
peja

답변:


313

간단히 이렇게하십시오 :

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

출처 : here


{item.name}이 작동하지 않았습니다. 그러나 {item.item.name}이 나를 위해 일했습니다. renderItem에서 ({item}) 대신 (item)을 부여했기 때문일 수 있습니다. 감사합니다 @Raymond
Edison D' souza

1
중괄호 때문에. 중괄호를 사용하려면 return 문을 추가해야합니다.
Ray

7
작동하지 않을 수 있습니다. 일부 요소를 삭제하고 추가 한 후 중복 된 항목이 표시되기 시작했습니다. keyExtractor의 목적은 항목을 고유하게 만드는 것입니다. 이상적으로는 각 항목에 대해 고유 한 ID를 갖고 ID를 키로 사용해야합니다. 예 : keyExtractor = {item => item.id}
JustWonder

2
@JustWonder-오른쪽; 목록에서 항목을 제거하려는 경우 색인을 키로 사용할 수 없으며 각 항목에 대해 고유 한 키를 생성하는 다른 방법을 찾아야합니다. 물건이 추가되는 경우에는이 방법이 좋습니다.
Jules

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

Ray의 대답을 시도했지만 "키는 문자열이어야합니다"라는 경고가 나타납니다. 다음 수정 된 버전은 항목 자체에 고유 한 키가없는 경우 원본 및이 문자열 키 경고를 억제하는 데 효과적입니다.

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

물론 아이템 자체에 명백하고 좋은 고유 키가 있다면 그냥 사용할 수 있습니다.


0

그렇지 않으면 아무것도 반환하지 않는 return statement를 작성하십시오. 나와 함께 일어났습니다.


-2

이것은 나를 위해 일했다 :

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

켜기 keyExtractorstring대신 인덱스 사용을 무작위로 생성 된 번호를 사용하는.

내가 사용했을 때 keyExtractor={(item, index) => index.toString()}, 그것은 결코 작동하지 않았으며 여전히 경고를 냈습니다. 그러나 이것은 누군가에게 효과가 있습니까?


2
임의의 문자열을 사용하는 것은 좋지 않습니다. 위에서 언급했듯이 반응이 다른 변경으로 인해 다시 렌더링을 시도하면 임의의 함수가 다른 값을 반환하기 때문에 불필요한 다시 렌더링이 발생합니다.
Edison D' souza

고마워요 그러나 다른 방법으로 독특한 끈을 얻으려면 어떻게해야 flatlists
White Rabbit
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.