乐闻世界logo
搜索文章和话题

How to keep previous data when refetching multiple times using React Query?

5 个月前提问
4 个月前修改
浏览次数70

1个答案

1

在使用React Query进行数据处理时,经常会遇到需要在重新请求过程中保存已有数据的情况。React Query提供了几种策略和配置来处理这种情况,最主要的功能之一是使用staleTimecacheTime来控制数据的新鲜度和缓存持续时间。

1. 使用 staleTime 保持数据新鲜

staleTime 用于定义数据在多长时间内被认为是“新鲜”的,即在这段时间内,对相同的查询不会触发新的网络请求。这样,即使在多次重新请求的过程中,只要数据还在新鲜期内,React Query就会使用缓存中的数据而不是重新请求。

jsx
import { useQuery } from 'react-query'; function fetchProjects() { return fetch('https://api.example.com/projects').then(res => res.json()); } function Projects() { const { data } = useQuery('projects', fetchProjects, { staleTime: 5 * 60 * 1000, // 5分钟 }); return <div>{data.map(project => <p>{project.name}</p>)}</div>; }

2. 使用 cacheTime 控制缓存的持续时间

另外,cacheTime 定义了数据在缓存中的保留时间。这个时间是在查询的数据变为不新鲜(即过了staleTime)之后开始计算的。如果在这个时间内再次请求相同的数据,React Query 仍然会从缓存中提取数据,而不是从网络重新加载。

jsx
const { data } = useQuery('projects', fetchProjects, { staleTime: 5 * 60 * 1000, // 数据新鲜时间 cacheTime: 30 * 60 * 1000, // 缓存持续时间 });

3. 在请求中继续显示旧数据

在React Query中,当新的请求正在进行时,你可以通过配置来继续显示旧的数据。这通过设置keepPreviousDatatrue 来实现,这个选项在进行新的数据查询时,会保持显示上一次的数据,直到新的数据被加载完成。

jsx
const { data, isFetching } = useQuery(['projects', projectId], fetchProjects, { keepPreviousData: true, }); if (isFetching) { // 处理加载状态,但用户仍然可以看到旧数据 }

总结

通过利用React Query的这些配置选项,我们可以有效地在应用中处理数据的缓存和更新,提高用户体验,减少不必要的网络请求和加载延迟。以上方法可以灵活使用,以适应不同的业务需求和场景。在使用 React Query 过程中,经常会面对需要重新请求数据而同时希望保留旧数据的场景。React Query 本身提供了多种策略来处理数据的更新与缓存,其中一个非常实用的功能就是数据保留(Data Stale)

使用 staleTime 来保留数据

在 React Query 中,useQueryuseInfiniteQuery 钩子中的 staleTime 选项允许我们定义数据在多长时间内可以被认为是新鲜(即不需要重新请求的)。在此期间,即使组件重新渲染或者重新执行查询,React Query 也会直接从缓存中提供数据,而不会去重新请求。

jsx
import { useQuery } from 'react-query'; import axios from 'axios'; function fetchProjects() { return axios.get('/api/projects'); } function Projects() { const { data, isError, isLoading } = useQuery('projects', fetchProjects, { staleTime: 5 * 60 * 1000, // 数据保持新鲜的时间为5分钟 }); if (isLoading) { return <div>Loading...</div>; } if (isError) { return <div>Error fetching projects</div>; } return ( <div> {data?.data.map(project => ( <p key={project.id}>{project.name}</p> ))} </div> ); }

在这个例子中,即使 Projects 组件多次重新渲染,只要在5分钟内,都不会重新请求数据,而是使用缓存中的数据。

Background Fetching on Window Focus

React Query 还提供了在窗口重新获取焦点时触发数据更新的功能,这可以通过设置 refetchOnWindowFocus 选项来实现。这样做的好处是用户在回到应用窗口时总能看到最新的数据,但之前的数据在新数据加载完成前仍然可用,从而提高用户体验。

jsx
const { data } = useQuery('todos', fetchTodos, { staleTime: 5000, refetchOnWindowFocus: true });

结果保留与废弃

最后,React Query 的 cacheTime 选项控制着成功查询的数据在缓存中的保留时间。即使查询的状态变为“非活跃”,这些数据仍旧可以在此期间被复用,过了这段时间后,数据会被垃圾回收掉。

jsx
const { data } = useQuery('todos', fetchTodos, { cacheTime: 10 * 60 * 1000 // 数据在缓存中保持10分钟 });

通过上述的设置和策略,React Query 不仅可以有效管理数据的重新请求和缓存,还可以在用户体验和应用性能之间找到一个良好的平衡。

2024年6月29日 12:07 回复

你的答案