reactjs - 使用 react-query 和 react-router-dom 缓存

标签 reactjs react-router react-router-dom react-query

我正在试用 react-query并希望看到它缓存。我有一个页面可以获取书籍列表。
请注意,为了简洁起见,一些代码显然被遗漏了,只是为了展示重要的部分。

const useBooks = options => {
  return useQuery(['books', options], bookApi.fetchBooks(options));
}

const Books = () => {
  useEffect(() => () => console.log("unmount"), []);
  const [options, setOptions] = useState({}); // options ex: { page: 1, search: "test"}
  const {error, isLoading, data} = useBooks(options);

  return books.map(book => <div>{book.name}</div>;
}
现在这本书是我的应用程序中的一个“页面”,使用 react-router-dom :
const App = () => {

  return (
    <Router>
      <>
        <Route exact path="/">
          <Home />
        </Route>
        <Route path="/books">
          <Books />
         </Route>
      </>
     </Router>
    )
  }
当我在“主页”和“书籍”之间来回切换时(通过单击我的应用程序中的导航链接),我每次都能看到书籍访问网络。我还在控制台中看到了“卸载”。
我最初将 Routes 包裹在 Switch 中,并删除了它,但 Books 组件似乎仍处于卸载状态。我希望它不会卸载并且我不会看到网络提取,并且书籍将从 react 查询缓存中提取。我还尝试使 useBooks Hook 不使用搜索选项参数,但结果相同。
在我的场景中如何使用避免网络获取?

最佳答案

react-router当您离开它时将卸载您的组件,是的。但这是故意的,而不是问题。
当使用 react-query hook 的组件挂载时,它会触发 fetch(因为挂载)。但是,如果您在缓存中已经有这个特定键的数据,您将立即将该数据作为“陈旧数据”返回,并且获取将仅在后台进行。
如果您想避免请求发出,您可以:

  • 套装 refetchOnmountfalse以便组件挂载时不会重新获取
  • 设置一个 staleTime关于您的查询

  • 我建议设置 staleTime :它会告诉 react-query 数据应该被视为“新鲜”多长时间。如果将其设置为 5 分钟,则 5 分钟内将不会有后台重新获取 - 数据将始终直接来自缓存。 staleTime默认为 0 ,因此您将始终获得后台重新获取。

    关于reactjs - 使用 react-query 和 react-router-dom 缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65939735/

    相关文章:

    javascript - React document.addEventListener 立即触发

    javascript - React 路由器 v0.13.3 还是 v1.0.0-beta3?

    javascript - 将嵌套路线优先于主路线

    javascript - 如果链接处于事件状态,则 React-router/CSS 没有悬停样式

    javascript - 错误 : [undefined] is not a <Route> component. <Routes> 的所有子组件必须是 <Route> 或 <React.Fragment>

    javascript - 如何迭代对象数组并将每个对象显示到图表中?

    React Native 中的 CSS 三 Angular 形不再起作用

    javascript - Material UI 垂直 slider 。如何更改垂直 Material UI Slider(React)中导轨的厚度

    reactjs - 如何使用默认的提交验证将链接从react router dom添加到提交按钮

    reactjs - react typescript : Correct type for useLocation() from react-router-dom