修仙大橙子:https://segmentfault.com/a/1190000041939135
const getMenuId = () =>
request<{ id: string; name: string }>({
url: `/menu`,
method: "GET",
});
const query = useQuery(["getMenuIdByName"], async () => getMenuId());
["getMenuIdByName"]
就是react-query
的查询键,react-query
通过不同的查询键来标识(映射)不同接口(或是同一接口不同参数请求)返回的数据。在react-query@4
中,查询键必须是数组。getMenuId()
就是查询函数。localStorage
时的key
,而value
则是通过查询函数查询到数据后,将各种我们需要的状态数据存储进入value
。查询键的值不能重复,需要保持唯一
const usersQuery = useQuery( ['users', userId], fun);
Promise
函数,包括但不局限于fetch、axios、graphql
请求、异步浏览器api
等。Promise.all
(用react-query
以前)来合并请求。useQueries
钩子接受一个带有查询键的选项对象,其值是一个数组,其中查询选项对象与useQuery
钩子相同(不包括context
选项)。const [users, setUsers] = React.useState([
'facebook',
'vuejs',
'nestjs',
'mongodb',
]);
const getRepos = (username) =>
fetch(`https://api.github.com/users/${username}/repos`).then((res) =>
res.json()
);
const userQueries = useQueries({
queries: users.map((user) => {
return {
queryKey: ['user', user],
queryFn: () => getRepos(user),
};
}),
});
请求B接口的某个参数依赖A接口请求返回的内容
query.fetchStatus
:fetchStatus
一共有三个状态,fetching
状态表示当前查询函数正在运行,idle
状态表示当时查询函数不在运行。paused
状态表示查询函数尝试运行,但是无法进行请求,最可能的原因是由于当前没有联网,处于离线状态。fetchStatus
将会在idle、fetching、paused
这三个状态间经历循环。isLoading
为true
表示第一次请求未返回结果前这段时间的状态,如果对接口进行了禁用(通过enabled
来控制),可以通过fetchStatus
为idle
来获取接口禁用请求这段时间的状态。// labels为上一个请求的data
const query = useQuery(["getMenuIdByName"], async () => getMenuId(), {enabled: !!labels});
在react-query
获取数据的过程中,主要会经历以下三种状态:loading、error、success
react-query
是否会触发查询函数,并从后端接口获取数据,与缓存状态是:fresh
(最新)状态或stale
(老旧)状态有关。如果缓存状态是stale
(老旧),表示该查询将会有资格重新获取,但如果缓存状态是fresh
(最新)的,就不会重新获取。staleTime
,设置一个毫秒数的数字,那么缓存将会在staleTime
毫秒后过期(从fresh
(最新)变为stale
(陈旧))staleTime
设置为Infinity
,表示当前查询的数据将只会获取一次,且会在整个网页的生命周期内缓存。react-query
无法检测出来变化,因为react-query
会进行深度比对。onShow
生命周期类似,触发就会重新获取数据,需要此时在stale
状态。这个触发条件是默认开启的,如果希望关闭这个触发条件,可以把refetchOnWindowFocus
选项设置为false
来禁止。refetchOnReconnect
选项设置为false
来禁止。refetchInterval
为数字(代表xxx毫秒)时。无论此时数据是fresh
(最新)还是stale
(老旧)的缓存状态,react-query
都会在你设置的毫秒时间间隔内重新获取数据。注意:除了定时刷新外,其它的触发器,都需要状态是
stale
(陈旧)才可以触发。
inactive
(不活跃)状态或者使用这个查询数据的组件卸载时,超过5分钟(默认情况下)后,react-query
将会自动清除该缓存。cacheTime
配置,下面的例子中将cacheTime
设置为0,实现的效果是,当查询数据在inactive
状态时,立即从缓存中删除。const userQuery = useQuery(
["user", username],
() =>
fetch(`https://api.github.com/users/${username}`)
.then(res => res.json()),
{ cacheTime: 0 }
);