文档
缓存

缓存

在这之前请确保你已理解 hydration

同步缓存

import { dehydrate, hydrate, createQueryClient } from "quaere";
 
export const queryClient = createQueryClient();
 
// 初始化时,我们将数据从 `localStorage` 恢复到一个 queryClient 中。
hydrate(queryClient, JSON.parse(localStorage.getItem("app-cache") || "{}"));
 
// 在卸载 app 之前,我们将所有数据写回 `localStorage` 中。
window.addEventListener("beforeunload", () => {
  // 注意:必须手动设置 query 的 key,dehydrate 才不会过滤掉该query
  const appCache = dehydrate(queryClient);
  localStorage.setItem("app-cache", appCache);
});

异步缓存

import { use, useEffect } from "react";
import {
  HydrationBoundary,
  QueryClientProvider,
  queryClient,
  QueryClientProvider,
} from "quaere";
import AsyncStorage from "@react-native-async-storage/async-storage";
 
const getAppCachePromise = AsyncStorage.getItem("app-cache")
  .then((cache) => JSON.parse(cache ?? "null"))
  .catch(() => null);
 
export function AsyncStoragePersist({ children }: { children: ReactNode }) {
  const appCache = use(getAppCachePromise);
  const queryClient = useQueryClient();
 
  useEffect(() => {
    const timer = setInterval(() => {
      AsyncStorage.setItem("app-cache", JSON.stringify(dehydrate(queryClient)));
    }, 1000);
 
    return () => {
      clearTimeout(timer);
    };
  }, [queryClient]);
 
  return <HydrationBoundary state={appCache}>{children}</HydrationBoundary>;
}
 
export const queryClient = createQueryClient();
 
function App() {
  return (
    <QueryClientProvider client={queryClient}>
      <Suspense>
        <AsyncStoragePersistProvider>
          <Page />
        </AsyncStoragePersistProvider>
      </Suspense>
    </QueryClientProvider>
  );
}