我有一个使用Nextjs和Supabase的项目。我使用的是context API,现在我试图用它来替换React Query,但是我很难做到。首先,我可以用React Query完全替换context吗?
我创建了这个钩子来获取当前用户
export const getUser = async (): Promise<Profile> => {
const onFetch = await supabase.auth.getUser();
const userId = onFetch.data.user?.id;
let { data, error } = await supabase
.from("profiles")
.select()
.eq("id", userId)
.single();
return data;
};
export const useUser = () => {
return useQuery(["user"], () => getUser());
};
我不知道如何触发它。当我使用上下文时,我得到的用户是这样的。如果是数据,那么它将重定向到主页
let { data, error, status } = await supabase
.from("profiles")
.select()
.eq("id", id)
.single();
if (data) {
setUser(data);
return true;
}
因为我在重定向到任何页面之前获取用户,所以当我导航到配置文件页面时,用户已经被定义了。我如何在任何事情之前获取用户并保持这种状态?我假设一旦用户已经被定义,在配置文件组件中我可以调用useUser并只使用它的数据。但当我导航到配置文件时,它给我未定义的,我假设它再次获取。
const { data, isLoading } = useUser();
1条答案
按热度按时间xwbd5t1u1#
但是当我导航到配置文件时,它给了我未定义的信息,我想它又在取了。
一旦在调用
useUser
时提取了数据,就不会再删除它(除非它在未使用一段时间后可以被垃圾收集)。因此,如果您执行客户端导航(这不是一个完整页面重载)到另一个路由,并在那里再次调用useUser
,您应该立即取回数据,可能需要后台重取,具体取决于staleTime
设置)。如果你仍然没有定义,一个可能的错误是你在你的应用中创建了你的
QueryClient
,它因此被重新创建,丢弃了以前的缓存。你没有展示你是如何做的,所以很难说。也许可以看看这些常见问题:https://tkdodo.eu/blog/react-query-fa-qs#2-the-queryclient-is-not-stable