next.js 如何使用React Query管理全局状态

4xy9mtcn  于 2022-11-23  发布在  React
关注(0)|答案(1)|浏览(177)

我有一个使用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();
xwbd5t1u

xwbd5t1u1#

但是当我导航到配置文件时,它给了我未定义的信息,我想它又在取了。
一旦在调用useUser时提取了数据,就不会再删除它(除非它在未使用一段时间后可以被垃圾收集)。因此,如果您执行客户端导航(这不是一个完整页面重载)到另一个路由,并在那里再次调用useUser,您应该立即取回数据,可能需要后台重取,具体取决于staleTime设置)。
如果你仍然没有定义,一个可能的错误是你在你的应用中创建了你的QueryClient,它因此被重新创建,丢弃了以前的缓存。你没有展示你是如何做的,所以很难说。也许可以看看这些常见问题:https://tkdodo.eu/blog/react-query-fa-qs#2-the-queryclient-is-not-stable

相关问题