【发布时间】:2021-08-31 22:08:10
【问题描述】:
到达列表末尾时,我的 react native flatlist 出现问题。
我需要的行为是典型的:到达结束时获取数据库,在操作期间在页脚处显示加载指示器。
问题是,由于某些原因,没有显示加载指示器。
这是我的 FlatList 组件:
...
const renderFooter = () => {
if (!props.isLoading) return null;
return (
<View style={{ paddingVertical: 35 }}>
<Loading type="ios" size={30} color={colors.primary} />
</View>
);
};
return (
<FlatList
ref={ref}
data={data}
keyExtractor={keyExtractor}
renderItem={renderItem}
windowSize={5}
maxToRenderPerBatch={5}
updateCellsBatchingPeriod={50}
removeClippedSubviews={false}
initialNumToRender={initialNumToRender}
ListFooterComponent={renderFooter}
ListEmptyComponent={ListEmptyComponent}
onEndReached={onEndReached}
onEndReachedThreshold={0.5}
showsVerticalScrollIndicator={false}
style={{ flexGrow: 1 }}
contentContainerStyle={{ flexGrow: 1 }}
/>
);
这就是我获取数据库的方式:
const [items, setItems] = useState([]);
const [isGettingMoreOldItems, setIsGettingMoreOldItems] = useState(true);
const fetchItems = async (old = true) => {
...
const newItems = await db.getItems();
setItems(old ? [...items, ...newItems] : [...newItems, ...items]);
...
}
const getMoreOldItems = async () => {
setIsGettingMoreOldItems(true);
await fetchItems(); // <--------- I AM AWAITING!
setIsGettingMoreOldItems(false);
}
...
return <MyList ... isLoading={isGettingMoreOldItems} onEndReached={getMoreOldItems} ... />
为什么当到达列表末尾并且应用程序开始获取数据库时,我没有看到加载指示器?我该如何解决这个问题?
注意:获取操作持续 2 秒(大约)
好奇心
如果我这样做:
const getMoreOldItems = async () => {
setIsGettingMoreOldItems(true);
await fetchItems(); // <--------- I AM AWAITING!
setTimeout(() => {
setIsGettingMoreOldItems(false);
}, 1000);
}
我可以看到页脚。但似乎有点棘手,不清楚...
【问题讨论】:
-
我认为代码没有等待,因为
const getMoreOldItems是一个承诺。检查这两个链接:stackoverflow.com/questions/57922556/… 和 stackoverflow.com/questions/32823277/… -
@noszone 但那有什么问题?我的意思是,如果 getMoreOldItems 在更新状态之前正在等待 fetchItems,对吧?
标签: javascript css reactjs react-native