修仙大橙子: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 }
);