设置
我有以下react-query
钩子:
const STALE_TIME_MS = 12 * 60 * 60 * 1000; // 12h
const useUser = () => {
const services = useServices();
const { isLoading, error, data } = useQuery(
'user',
() => services.user.verify(),
{
staleTime: STALE_TIME_MS,
cacheTime: STALE_TIME_MS,
}
);
return {
isLoading,
error,
user: data,
};
};
然后,我有一个App
组件作为一个孩子住在里面QueryClientProvider
:
const App = () => {
const { isLoading } = useUser();
if (isLoading) {
return <Authenticating />;
}
return (
<HashRouter>
<Switch>
<Route path="/login" component={Login} />
<Route path="/" component={Dashboard} />
</Switch>
</HashRouter>
);
}
该Login
组件检查用户是否已经登录并将其重定向回/
:
const Login = () => {
const { user } = useUser();
if (user) {
return <Redirect to="/" />;
}
...
}
该Dashboard
组件执行相反的操作:
const Dashboard = () => {
const { user } = useUser();
if (!user) {
return <Redirect to="/login" />;
}
...
};
问题
当发出的请求services.user.verify()
失败时,会无限期地react-query
重试查询。user
尽管react-query
' 的默认重试次数是 3,但还是会这样做。
问题似乎来自我useUser()
从多个正在安装/卸载的组件中调用的事实。Dashboard
当我从and中删除重定向逻辑时Login
,react-query
重试 3 次,然后按预期将我带到登录屏幕。
有趣的事实是user
查询被标记为过时。如果我将services.user.verify()
实现更改为在用户未通过身份验证时返回null
而不是抛出错误,则查询将被标记为新鲜,我根本没有这个问题。
问题
- 即使在重试后失败,是否
react-query
总是认为查询过时? - 调用查询的新组件是否总是导致重试?
- 有没有办法防止这种情况发生?