Mã FlatList cơ bản ném Cảnh báo - React Native


129

FlatList dường như không hoạt động. Tôi nhận được cảnh báo này.

VirtualizedList: thiếu các khóa cho các mục, đảm bảo chỉ định một thuộc tính khóa trên mỗi mục hoặc cung cấp một keyExtractor tùy chỉnh.

Mã số:

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

3
@ Li357 ... và liên tục nếu dữ liệu không thay đổi. Các khóa ngẫu nhiên sẽ gây ra việc đăng ký lại mọi mục trên mỗi thay đổi dữ liệu, điều này sẽ rất không hiệu quả.
Jules

như được mô tả dưới đây, nó phải là một chuỗi, có một sự bất đồng về repo chính thức ở đây . Tôi nghĩ rằng nhóm phản ứng gốc muốn cứu người dùng không sử dụng chỉ mục làm khóa nhưng đó không phải là một giải pháp tốt. Tôi có thể sử dụng db id làm khóa. tôi không phải chuyển đổi nó thành một chuỗi.
peja

Câu trả lời:


313

Đơn giản chỉ cần làm điều này:

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

Nguồn: tại đây


{item.name} không hoạt động. Nhưng {item.item.name} đã làm việc cho tôi. Có thể là do tôi đã cho (mục) thay vì ({item}) trong renderItem. Cảm ơn @Raymond
Edison D'souza

1
Vì niềng răng xoăn. Nếu bạn sẽ sử dụng dấu ngoặc nhọn, bạn cần thêm câu lệnh return.
Ray

7
Điều này có thể không hoạt động. Sau khi xóa và thêm một số thành phần, nó bắt đầu hiển thị các mục trùng lặp. Tôi nghĩ mục đích của keyExtractor là duy nhất một mục. Tốt nhất bạn nên có một id duy nhất cho mỗi mục và sử dụng id làm khóa. ví dụ: keyExtractor = {item => item.id}
JustWonder

2
@JustWonder - đúng; nếu danh sách của bạn sắp xóa các mục, bạn không thể sử dụng chỉ mục làm khóa và bạn phải tìm một cách khác để tạo khóa duy nhất cho mỗi mục. Đối với trường hợp công cụ chỉ được thêm vào, phương pháp này là tốt.
Jules

19
chỉ mục được trả về phải là một chuỗi:keyExtractor={(item, index) => index.toString()}
roadev

41

Bạn không cần sử dụng keyExtractor. Các tài liệu React Native không rõ ràng một chút nhưng thuộc keytính nên đi trong từng phần tử của datamảng chứ không phải trong thành phần con được kết xuất. Vì vậy hơn là

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

đó là những gì bạn mong đợi, bạn chỉ cần đặt một keytrường trong mỗi thành phần của datamảng:

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

Và chắc chắn không đặt một chuỗi ngẫu nhiên làm chìa khóa.


13

Điều này làm việc cho tôi:

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

1
hoặckeyExtractor={ ( item, index ) => `${index}` }
Ivor Scott

9

Bạn có thể dùng

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

LƯU Ý: Sử dụng index.toString () tức là dự kiến ​​là chuỗi.


5

Có 'id' trong dữ liệu của bạn

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

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

Hi vọng điêu nay co ich !!!


2

Một giải pháp đơn giản là chỉ cung cấp cho mỗi mục nhập một khóa duy nhất trước khi kết xuất FlatList, vì đó là những gì cơ bản VirtualizedListcần theo dõi từng mục.

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

Cảnh báo thực hiện lời khuyên trước, hoặc cung cấp trình trích xuất khóa tùy chỉnh.


2

mã này hoạt động với tôi:

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

Điều này không đưa ra bất kỳ cảnh báo nào (chuyển đổi chỉ mục thành chuỗi):

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

1

trong trường hợp Dữ liệu của bạn không phải là một đối tượng: [trên thực tế, nó đang sử dụng từng chỉ mục mục (trong mảng) làm khóa]

   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

Đã thử câu trả lời của Ray nhưng sau đó nhận được cảnh báo rằng "khóa phải là một chuỗi". Phiên bản sửa đổi sau hoạt động tốt để loại bỏ cảnh báo khóa gốc và chuỗi này nếu bạn không có khóa duy nhất tốt trên chính vật phẩm:

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

Tất nhiên nếu bạn có một khóa duy nhất rõ ràng và tốt trên chính vật phẩm đó, bạn chỉ có thể sử dụng nó.


0

Hãy chắc chắn để viết tuyên bố trả lại nếu không nó sẽ trả về không có gì..Hãy làm với tôi.


-2

Điều này làm việc cho tôi:

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

Biến keyExtractorthành một stringnhưng thay vì sử dụng chỉ mục sử dụng một số được tạo ngẫu nhiên.

Khi tôi sử dụng keyExtractor={(item, index) => index.toString()}, nó không bao giờ hoạt động và vẫn đưa ra một cảnh báo. Nhưng có lẽ điều này làm việc cho một ai đó?


2
Các khóa được coi là duy nhất. Sử dụng chuỗi ngẫu nhiên không phải là một ý tưởng hay. Như đã đề cập ở trên, nó sẽ gây ra kết xuất lại không được yêu cầu do hàm ngẫu nhiên trả về một giá trị khác nếu phản ứng cố gắng kết xuất lại do bất kỳ thay đổi nào khác.
Edison D'souza

Tôi nghe bạn cảm ơn vì điều đó. Nhưng làm thế nào khác bạn sẽ có được một chuỗi duy nhất, nếu bạn thích 5flatlists
Thỏ trắng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.