React 查询在新页面中显示上一页数据

React query shows previous page data in new page

我有一个 React 项目,包括两个页面:博客和画廊。我可以使用 react-query 获取数据并使用 react-router 在页面之间导航。问题是当我从博客导航到图库(反之亦然)时,在加载图库数据时博客内容显示在图库中。

这是我的主要 App 功能:

function App() {
   return (
      <>
         <Helmet
            ...
         ></Helmet>
         <Header />
         <main>
            <Switch>
               <Route path="/blog" component={Blog} />
               <Route path="/gallery" component={Gallery} />
               <Route exact path="/" component={Home} />
               <Route component={Error404} /> */}
            </Switch>
         </main>
         <Footer />
      </>
   );
}

const queryClient = new QueryClient();

ReactDOM.render(
   <BrowserRouter>
      <QueryClientProvider client={queryClient}>
         <ScrollToTop />
         <App />
      </QueryClientProvider>
   </BrowserRouter>,
   document.getElementById("root"),
);

这是我的获取组件:

import React from "react";
import Card from "../molecules/Card";
import { useQuery } from "react-query";

// function name is different in Gallery Component
export default function BlogCardStack(props) {
   const { isLoading, error, data, isFetching } = useQuery("repoData", () =>
      fetch(props.contentSource).then((res) => res.json(), { keepPreviousData : false }),
   );

   if (error) return "An error has occurred: " + error.message;

   return (
      <div className="card-stack">
         {data
            ? data.map((item) => (
             \ I use <VideoCard> instead of <Card> in Gallery
                 <Card
                    key={item.id}
                    title={item.title.rendered}
                    image={{
                       src: item.featured_media_src_url,
                    }}
                 />
              ))
            : Array(4)
                 .fill()
                 .map((item, index) => <Card key={index} />)}
         {/* {isFetching ? "Updating..." : ""} */}
         {/* <ReactQueryDevtools initialIsOpen /> */}
      </div>
   );
}

我在 Blog 和 Gallery 组件中都使用了上面的代码,只需更改 return 部分

更新

我换了钥匙,但运气不好。

您需要为每个要获取的数据提供一个唯一的queryKey,否则它们将不断相互覆盖。查询缓存就像一个对象,其中 queryKey 是该对象的“键”,而您的数据就是值。

在您的示例中,最好通过向键中添加 props.contentSource 来实现此目的:

const { isLoading, error, data, isFetching } = useQuery(
    ['data', props.contentSource],
    () => fetch(props.contentSource).then((res) => res.json()),
);

keepPreviousData 默认为 false 所以你不需要设置它。