最后一个 AsyncCallback 项目在 React Native 中消失
Last AsyncCallback item disappearing in React Native
我有一个对象数组,当新项目附加到列表时,应该存储这些数据。此外,当应用程序加载时,必须将此信息推回到列表中。所以,我使用 AsyncCallback,但它不能正常工作。当我刷新应用程序时,所有存储的元素都出现在列表中,除了最后一个。我怎样才能 return 将此项目返回列表?
import React, { useState, useEffect } from 'react';
import { StyleSheet, View, Text, FlatList, Button, AsyncStorage } from 'react-native';
export default function HomeScreen() {
const [listItems, setListItems] = useState([
{
// example list item
id: '0',
text: 'Item 1'
},
]);
const [idx, incrIdx] = useState(1);
useEffect(() => {
getData();
}, []);
const pushItem = () => {
var data = new Object();
data.id = idx.toString();
data.text = "Item " + idx;
setListItems([...listItems, data]);
incrIdx(idx + 1);
storeData();
};
const storeData = async () => {
await AsyncStorage.setItem('listItems', JSON.stringify(listItems));
};
const getData = async () => {
const value = await AsyncStorage.getItem('listItems');
if(value !== null) {
setListItems([...listItems, JSON.parse(value)]);
}
};
return (
<View style={styles.container}>
<FlatList
data={listItems}
renderItem={({item}) =>
<View>
<Text>{item.text}</Text>
</View>
}
keyExtractor={item => item.id}
/>
<Button
title="Push data"
onPress={pushItem}
/>
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#fff',
},
});
您是否查看了 AsyncStorage.setItem
的实际设置?
我猜它没有使用最新的 listItems 状态,因为挂钩设置器是异步的(就像旧的 setState
)。
要表达更新状态时应该生效的逻辑,请使用 useEffect
api。
useEffect(() => {
// Instead of calling storeData() with stale state
AsyncStorage.setItem('listItems', JSON.stringify(listItems));
}, [listItems]);
我有一个对象数组,当新项目附加到列表时,应该存储这些数据。此外,当应用程序加载时,必须将此信息推回到列表中。所以,我使用 AsyncCallback,但它不能正常工作。当我刷新应用程序时,所有存储的元素都出现在列表中,除了最后一个。我怎样才能 return 将此项目返回列表?
import React, { useState, useEffect } from 'react';
import { StyleSheet, View, Text, FlatList, Button, AsyncStorage } from 'react-native';
export default function HomeScreen() {
const [listItems, setListItems] = useState([
{
// example list item
id: '0',
text: 'Item 1'
},
]);
const [idx, incrIdx] = useState(1);
useEffect(() => {
getData();
}, []);
const pushItem = () => {
var data = new Object();
data.id = idx.toString();
data.text = "Item " + idx;
setListItems([...listItems, data]);
incrIdx(idx + 1);
storeData();
};
const storeData = async () => {
await AsyncStorage.setItem('listItems', JSON.stringify(listItems));
};
const getData = async () => {
const value = await AsyncStorage.getItem('listItems');
if(value !== null) {
setListItems([...listItems, JSON.parse(value)]);
}
};
return (
<View style={styles.container}>
<FlatList
data={listItems}
renderItem={({item}) =>
<View>
<Text>{item.text}</Text>
</View>
}
keyExtractor={item => item.id}
/>
<Button
title="Push data"
onPress={pushItem}
/>
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#fff',
},
});
您是否查看了 AsyncStorage.setItem
的实际设置?
我猜它没有使用最新的 listItems 状态,因为挂钩设置器是异步的(就像旧的 setState
)。
要表达更新状态时应该生效的逻辑,请使用 useEffect
api。
useEffect(() => {
// Instead of calling storeData() with stale state
AsyncStorage.setItem('listItems', JSON.stringify(listItems));
}, [listItems]);