如何在 React Native 中的 FlatList 中呈现数据,我可以通过控制台记录它,但在屏幕上显示它时遇到问题
2021-06-15
736
我想使用异步存储实现兑现,但我遇到了该错误
TypeError:未定义不是对象(评估'item.id.toString')
这是我的代码
import React, {useState} from 'react';
import {View, Button, FlatList, Text} from 'react-native';
import AsyncStorage from '@react-native-async-storage/async-storage';
const books = [
{id: 1, name: 'book 1'},
{id: 2, name: 'book 2'},
{id: 3, name: 'book 3'},
];
export default function GetDataScreen() {
const [Books, setBooks] = useState([]);
console.log(Books.length);
console.log(Books);
const clearAsyncStorage = async () => {
AsyncStorage.clear();
};
const storeData = async value => {
try {
const books = JSON.stringify(value);
await AsyncStorage.setItem('books', books);
} catch (e) {
console.log(e);
}
};
const getData = async () => {
try {
const jsonValue = await AsyncStorage.getItem('books');
setBooks(jsonValue);
console.log(Books);
return jsonValue != null ? JSON.parse(jsonValue) : null;
} catch (e) {
console.log(e);
}
};
React.useEffect(() => {
getData();
}, []);
return (
<View>
<Button title="Save" onPress={() => storeData(books)} />
<Button title="get" onPress={() => getData()} />
<FlatList
data={Books}
keyExtractor={item => item.id.toString()}
renderItem={({item}) => <Text>{item.id}</Text>}
/>
</View>
);
}
我从异步存储中获取数据,并在注释我的 FlatList 时将其记录在控制台中,
但是当我取消注释 FlatList 时,出现该错误 “ TypeError:未定义不是对象(评估'item.id.toString')”
2个回答
您正在将整个数组存储在店内方法中,当您获取时,您将整个数组作为一个项目获取,因此它肯定会给您一个错误。
您可以传递下面提到的密钥提取器:
keyExtractor={(item,index) => item.id}
当您从异步获取数据时,您将收到项目作为a
[ { " i d " : 1 , " n a m e " : " b o o k
1 " } , { " i d " : 2 , " n a m e " : " b o o k
2 " } , { " i d " : 3 , " n a m e " : " b o o k
3 " } ]
存储时应该是单个的,但您按下保存按钮时会存储整个数组。
希望您能理解。
Awais Ibrar
2021-06-15
您在解析之前使用了 setData,这就是它不起作用的原因
React.useEffect(() => {
getData().then(res => setData(res));
}, []);
这将为您修复它
Waqas Ali
2022-09-22