reactjs - 使用反应钩子在身份验证过程中进行无休止的刷新
问题描述
我想用 React 和 React Router 实现一个身份验证过程,当每次更改路由但遇到无休止的刷新时,它调用 API 来刷新令牌。
const location = useLocation(); // react-router
const [auth, setAuth] = useState({ accessToken: 'aaa', refreshToken: 'bbb' }); // token-based auth
const refresh = useCallback(async () => {
const response = await fetch(url, auth.accessToken, auth.refreshToken); // pseudo code
const body = await response.json();
setAuth({ accessToken: body.accessToken, refreshToken: body.refreshToken });
}, [auth, setAuth]);
useEffect(() => {
Promise.resolve().then(refresh);
}, [location.pathname, refresh]);
当路线(location.pathname
)改变时,
useEffect
被调用(因为它取决于location.pathname
),
auth
已更新(通过setAuth
),
refresh
已更新(因为它取决于auth
),
useEffect
再次调用(因为它取决于refresh
),然后继续。
auth
和之间的递归依赖refresh
导致了这个无限循环。如何解决?
解决方案
根据 HMR 的回答粘贴我的最终代码以供参考,谢谢。
const fetchAuth = useCallback(async ({ accessToken, refreshToken }) => {
const resp = await fetch(...);
const body = await resp.json();
return {
accessToken: body.accessToken,
refreshToken: body.refreshToken,
};
}, []);
const onRouteChange = useCallback(async () => {
setAuth((auth) => {
setTimeout(async () => {
const accessToken = auth.accessToken;
const refreshToken = auth.refreshToken;
const newAuth = await fetchAuth({ accessToken, refreshToken });
setAuth(newAuth);
}, 100);
return auth;
});
}, [fetchAuth]);
useEffect(() => {
onRouteChange();
}, [location.pathname, onRouteChange]);
推荐阅读
- c# - C# 访问路径被拒绝异常在文档中创建文件
- python - 将进度条与 colab 中的传输(复制或移动)代码合并
- python-3.x - 无法转换类型的对象
到张量。每副本 - python - 从本地 Dask 过渡到集群……
- powerbi - 粒度问题
- r - 使用 R Markdown 中的 Kable 和 collapse_rows 对表的最后一行进行杂散格式化
- lua - Roblox Lua Give LocalPlayer 武器不起作用,
- node.js - 类验证器不验证实体
- compiler-construction - WebAssembly 中如何管理堆内存?
- python - Django 如何组织模型以便只有一个所有者