Основной код FlatList выдает предупреждение-React Native
FlatList, кажется, не работает. Я получаю это предупреждение.
VirtualizedList: отсутствующие ключи для элементов, не забудьте указать ключевое свойство для каждого элемента или предоставить пользовательский keyExtractor.
код:
<FlatList
data={[{name: 'a'}, {name: 'b'}]}
renderItem={
(item) => <Text key={Math.random().toString()}>{item.name}</Text>
}
key={Math.random().toString()} />
11 ответов:
просто сделать это:
<FlatList data={[{name: 'a'}, {name: 'b'}]} renderItem={ (item) => <Text>{item.name}</Text> } keyExtractor={(item, index) => index} />
источник: здесь
вам не нужно использовать
keyExtractor
. Элемент React Native docs немного непонятно но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
что и следовало ожидать, вам просто нужно поставить
это сработало для меня:
<FlatList data={[{name: 'a'}, {name: 'b'}]} keyExtractor={(item, index) => index.toString()} />
можно использовать
<FlatList data={[]} keyExtractor={(item, index) => index.toString()} />
Примечание : использование индекса.toString () т. е. ожидается, что это строка.
простое решение - просто дать каждой записи уникальный ключ перед рендерингом с
FlatList
, так как это то, что лежит в основеVirtualizedList
нужно отслеживать каждую запись.users.forEach((user, i) => { user.key = i + 1; });
предупреждение делает совет делать это в первую очередь, или предоставить пользовательский ключ экстрактора.
этот код работает для меня :
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} />
есть ' id ' в ваших данных
const data = [ { name: 'a', id: 1 }, { name: 'b', id: 2 }]; <FlatList data={data} renderItem={ (item) => <Text>{item.name}</Text> } keyExtractor={item => item.id} />
надеюсь, что это помогает !!!
это не дало никакого предупреждения (преобразование индекса в строку):
<FlatList data={[{name: 'a'}, {name: 'b'}]} keyExtractor={(item, index) => index+"" } renderItem={ (item) => <Text>{item.name}</Text> } />
попробовал ответить Рэй, но затем получил предупреждение, что "ключ должен быть строкой". Следующая измененная версия хорошо работает, чтобы подавить оригинал и это строковое предупреждение ключа, если у вас нет хорошего уникального ключа на самом элементе:
keyExtractor={(item, index) => item + index}
конечно, если у вас есть очевидный и хороший уникальный ключ на самом элементе, вы можете просто использовать его.
в случае, если ваши данные не является объектом : [фактически он использует каждый индекс элемента (в массиве) в качестве ключа]
data: ['name1','name2'] //declared in constructor <FlatList data= {this.state.data} renderItem={({item}) => <Text>{item}</Text>} ItemSeparatorComponent={this.renderSeparator} keyExtractor={(item, index) => index.toString()} />
это сработало для меня:
<FlatList data={items} renderItem={({ title }) => <Text>{title}</Text> }} keyExtractor={() => Math.random().toString(36).substr(2, 9)} />
поворот
keyExtractor
наstring
но вместо использования индекса используйте случайное сгенерированное число.когда я использовал
keyExtractor={(item, index) => index.toString()}
, Он никогда не работал и все равно выгнали предупреждение. Но, может быть, это работает для кого?