问题描述
如何在刷新页面后使数据失效?它似乎没有失效,而它应该是。即使服务器端发生了一些变化,它仍然显示旧数据。
我在将数据发布到后端时使用 useMutation 时遇到同样的问题,即使在使用 QueryClient
后 UI 也不会更新。
下面是我的代码:
const IncomeManager: React.FC<any> = (props) => {
const queryClient = new QueryClient();
const {isLoading,isError,isFetching,data}: QueryObserverResult = useQuery('typeIncomes',() => typesApi.getAllTypes());
const [refresh,setRefresh] = useState<boolean>(false);
const [isModalVisible,setIsModalVisible] = useState<boolean>(false);
//@ts-ignore
const handleClose = (): void => {
setIsModalVisible(false);
}
const refreshContent = async () => {
await queryClient.invalidateQueries('typeIncomes');
console.log("Content has been refreshed!!!");
}
return (
<View style={style.container}>
<View>
<AppText style={style.title}>{data ? data.length : 0} income types available</AppText>
</View>
<FixedButton
title={"plus"}
onPress={() => props.navigation.navigate(navConstants.ADDTYPE,{type: "incomes"})}
/>
{
isLoading || isFetching ? <PageActivityIndicator visible={isLoading || isFetching}/> :
<FlatList style={{width: "100%"}}
data={data}
renderItem={
({item}) => <CategoryItem
id={item.type_id}
title={item.title}
subTitle={item.description}
onLongPress={() => console.log("Very long press!")}
onPress={() => props.navigation.navigate(navConstants.EDITTYPE,{
item: {
id: item.type_id,title: item.title,description: item.description
}
})
}
/>
}
keyExtractor={item => item.type_id}
refreshing={refresh}
onRefresh={async () => refreshContent()}
/>
}
</View>
);
}
export default IncomeManager;
const style = StyleSheet.create({
container: {
flex: 1,width: "100%",backgroundColor: constants.COLORS.secondary,alignItems: "center"
},title: {
color: constant.COLORS.lightGray,paddingVertical: 10,fontSize: 17,marginBottom: 0
},});
解决方法
每次组件呈现时,您都在创建一个新的 QueryClient 执行以下操作:
const queryClient = new QueryClient()
queryClient 保存您的缓存,该缓存保存您的数据。应该只有一个(如 redux 存储)——您最初创建然后传递给 QueryClientProvider 的那个。要检索此 Singleton 实例,您可以执行以下操作:
const queryClient = useQueryClient()
它将通过 React 上下文为您提供实例。 那个 queryClient 应该可以工作的无效。这也是文档和所有示例中的所有内容的设置方式。