รหัส FlatList พื้นฐานแสดงคำเตือน - ตอบสนองพื้นเมือง


130

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

ตามที่อธิบายไว้ด้านล่างมันควรจะเป็นสตริงที่มี disccusion ใน repo อย่างเป็นทางการที่นี่ ฉันคิดว่าทีมโต้ตอบเจ้าของภาษาต้องการบันทึกผู้ใช้ไม่ให้ใช้ดัชนีเป็นกุญแจสำคัญ แต่ไม่ใช่วิธีแก้ปัญหาที่ดี ฉันควรจะใช้ db id เป็นคีย์ได้ ฉันไม่ต้องแปลงเป็นสตริง
peja

คำตอบ:


313

เพียงทำสิ่งนี้:

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

ที่มา: ที่นี่


{item.name} ไม่ทำงาน แต่ {item.item.name} ใช้ได้ผลสำหรับฉัน อาจเป็นเพราะฉันให้ (item) แทนที่จะเป็น ({item}) ใน renderItem ขอบคุณ @Raymond
Edison D'souza

1
เพราะการดัดฟัน หากคุณจะใช้วงเล็บปีกกาคุณต้องเพิ่มคำสั่งส่งคืน
Ray

7
ซึ่งอาจไม่ได้ผล หลังจากลบและเพิ่มองค์ประกอบบางอย่างก็เริ่มแสดงรายการที่ซ้ำกัน ฉันคิดว่าจุดประสงค์ของ keyExtractor คือไอเท็มที่ไม่ซ้ำใคร ตามหลักการแล้วคุณควรมีรหัสเฉพาะสำหรับแต่ละรายการและใช้รหัสดังกล่าวเป็นคีย์ เช่น keyExtractor = {item => item.id}
JustWonder

2
@JustWonder - ขวา; หากรายการของคุณกำลังจะมีการนำรายการออกคุณจะไม่สามารถใช้ดัชนีเป็นคีย์ได้และคุณต้องหาวิธีอื่นในการสร้างคีย์เฉพาะสำหรับแต่ละรายการ สำหรับกรณีที่มีการเพิ่มสิ่งต่างๆเข้าไปเท่านั้นวิธีนี้ก็ใช้ได้
Jules

19
ดัชนีที่ส่งคืนจะต้องเป็นสตริง:keyExtractor={(item, index) => index.toString()}
roadev

41

keyExtractorคุณไม่จำเป็นต้องใช้ React เอกสารพื้นเมืองมีความชัดเจนน้อยแต่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

อย่าลืมเขียนคำสั่งคืนสินค้ามิฉะนั้นจะไม่มีอะไรกลับมา .. เกิดขึ้นกับฉัน


-2

สิ่งนี้ใช้ได้ผลสำหรับฉัน:

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

การเปลี่ยนkeyExtractorให้เป็นstringแต่แทนที่จะใช้ดัชนีให้ใช้ตัวเลขที่สร้างขึ้นแบบสุ่ม

เมื่อฉันใช้keyExtractor={(item, index) => index.toString()}มันไม่เคยได้ผลและยังคงมีคำเตือนออกมา แต่อาจจะใช้ได้กับใครบางคน?


2
คีย์ควรจะไม่ซ้ำกันการใช้สตริงแบบสุ่มไม่ใช่ความคิดที่ดี ดังที่ได้กล่าวไว้ข้างต้นจะทำให้เกิดการแสดงผลที่ไม่ต้องการเนื่องจากฟังก์ชันสุ่มส่งคืนค่าที่แตกต่างกันหากการตอบสนองพยายามที่จะแสดงซ้ำเนื่องจากการเปลี่ยนแปลงอื่น ๆ
Edison D'souza

ฉันได้ยินว่าคุณขอบคุณสำหรับสิ่งนั้น แต่คุณจะได้สตริงที่ไม่ซ้ำกันอย่างไรถ้าคุณมีเช่น 5flatlists
White Rabbit
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.