目录
- 入门react-query 已于2022-06-04更新
- 深入查询键及查询函数 已于2022-06-08更新
- 并行请求及依赖请求 已于2022-06-19更新
- 查询结果缓存状态与调试工具 已于2022-06-23更新
- 处理错误 已于2022-06-26更新
- 使用QueryClient已于2022-07-27日更新
- 更新查询数据已于2023-02-17日更新
背景
使用react-query
后,只需要专注于处理后端返回的数据本身。react-query
将会帮你自动的请求数据、在合适的时机重新获取数据后将旧数据标记为过期,并在一定时间后彻底清除。
那么react-query
如何知道什么时候重新获取数据呢?
需要同时满足下面两个条件:
- 目前缓存内的数据是过期的
默认情况下,当你的数据从后端请求存入缓存后,数据就会被置为过期(实际上很合理,因为你请求的数据只是当前时间点下后端数据的快照,很有可能请求后的某个时间数据有变化)
- 满足下面三种事件的其中一种
- 带有
useQuery
hooks的组件挂载时 - 当用户将浏览器重新聚焦,切换到前台时
- 网络从离线到上线(比如你在地下室无信号,此时网络离线,当你从地下室回到地面,信号满格,此时你又重新上线)
- 带有
并且react-query
只会对当前react
中正在挂载的组件进行重新获取操作,如果组件被卸载(比如离开了当前页面组件等),并不会执行上述操作。而且当组件被卸载超过5
分钟后,缓存将会被自动清除。
如果默认选项能满足需求,也就不会有这篇文章了,在本文中主要介绍一下,如何去手动重新查询数据。
介绍
更新查询数据
更新查询所有匹配queryKey的查询
你可以通过queryClient
中的refetchQueries
方法来重新刷新数据。比如下面的刷新按钮:
const RefetchButton = ({org, repo}) => {
const queryClient = useQueryClient();
return (
<button onClick={() => queryClient.refetchQueries(['repo', org, repo])}>
刷新
</button>
);
};
用户点击刷新后,将会刷新所有的满足查询键匹配的查询,包括非活跃查询以及活跃查询
更新查询活跃的匹配queryKey的查询
你可以通过queryClient
中的invalidateQueries
方法来重新刷新当前活跃查询。例子如下:
const InvalidateButton = ({org, repo}) => {
const queryClient = useQueryClient();
return (
<button onClick={() =>
queryClient.invalidateQueries(['repo', org, repo])
}>
Invalidate Queries
</button>
);
};
区别
refetchQueries
会把所有的查询都会重新查询一遍,而invalidateQueries
则是把当前活跃的查询重新查询一遍。
因此当你有几十个查询匹配搜索(比如三个查询是活跃状态,剩下的全部都是非活跃状态)的时候,invalidateQueries
会更加快速的更新数据。
你可能会问了,怎么可能会有几十个查询?
当然有可能,假如一直使用一个页面,并打开过许多的github仓库的详情页,那么当你每打开一个详情页就会产生一条查询(假如打开react仓库此时的querykey
时:['repo', 'facebook', 'react']
,打开vue仓库此时的querykey是['repo', 'vuejs', 'vue']
等等以此类推)。
如果你希望刷新你当前浏览的react仓库详情页,使用了queryClient.refetchQueries(['repo'])
方法,此时所有的详情页数据都会被更新,假如你使用了queryClient.invalidateQueries(['repo'])
方法,此时只有['repo', 'facebook', 'react']
这个查询会被更新。这里只是举一个例子方便大家理解概念。实际使用过程中看你的开发需要灵活运用。
建议除非你明确知道所有的查询都要重新获取时使用queryClient.refetchQueries
。否则其他情况下请使用queryClient.refetchQueries
。
在上面的例子中,我们使用了不同种类的querykey
(比如:queryClient.invalidateQueries(['repo', org, repo])
以及queryClient.invalidateQueries(['repo'])
),去匹配需要更新的查询。在下一章中,我们将详细讲述querykey
的匹配规则。
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 14 天,点击查看活动详情