那么在具有多个页面的网站中,哪个页面使用来自API的外部数据,当页面首次加载时,仅发出一次请求的最佳逻辑方法是什么?因此,例如,我第一次转到页面 关于(使用 React 路由器(,它发出 Axios 请求并加载数据,然后我切换到主页,当我回到关于时,它不会再次加载数据。
因为我目前所做的是每次页面加载时都有一个请求,这对于用户体验来说非常笨拙。我在componentDidMount
方法中使用 Axios 发出请求。 带有上下文 API 的 React Hooks 可以帮助解决这个问题吗?
我已经看过这篇文章,但仍然感到困惑: 每次访问页面时都重新渲染
提前感谢,如果我不能更清楚,那就太好了!
你可以研究缓存 - 它不需要更改当前代码,而只需要在设置 axios 时。当您对相同的数据发出请求而自上次请求以来几乎没有时间更改时,它将从缓存中提供服务,而不是调用服务器。
可以在 axios 中处理缓存的库的一个例子是 axios-cache-adapter。
这可以使用react-router-dom
包中存在的Link
组件轻松实现。只需替换用于在页面之间导航的常规锚标记即可<Link to="yourUrl" />
这样,状态不会在您每次访问其他页面时刷新,并且除非您关闭浏览器,否则状态将保留在那里。
使用 Redux 或类似的全局状态管理工具(如 Context API(将是一种解决方案。使用 Redux,您将能够将 API 数据存储到全局状态中,然后在componentDidMount
方法中,仅当相应的全局状态值为空时,您才能运行 Axios 请求。
涉及 Redux 的另一种解决方案是拥有一个无处不在的布局组件,例如导航栏,负责请求所有 API 数据。如果您将导航栏放置在 React 路由器之外,那么当 React Router 将您带到其他页面时,此组件将不会自行卸载。使用此方法,如果您想在第一次访问页面时加载相关数据,但让它在会话的其余部分持续存在,您可以有一个useEffect
,该useLocation().pathname
(来自 react-router-dom(加载 API 数据,将其全局存储,并且仅在尚未具有所述数据时才请求所述数据。
使用全局状态管理的另一个好处是,在大多数情况下,您的HTTP代码将从组件中抽象出来,并组织到某种类型的"actions"文件夹中,这将使一切更易于管理。