【发布时间】:2021-10-17 08:20:35
【问题描述】:
我正在一个 reducer (+ AsyncThunk) 中执行注销所需的所有操作(异步 http 请求、本地存储 + 状态更新)。我唯一缺少的就是在这个“集中式上下文”中执行所需的重定向到登录页面。
以下是涉及的主要代码:
http.service.ts
// ...
const httpClient: AxiosInstance = axios.create({ /* ... */ });
httpClient.interceptors.response.use(undefined, async function (error) {
if (401 === error.response.status) {
// TODO: How to logout incl. http request, localstorage + state update & redirect?
}
return Promise.reject(error);
});
// ...
auth.service.ts
// ...
class AuthService {
// ...
async logout(): Promise<void> {
localStorage.removeItem("User");
await httpClient.post(ApiRoutesService.postLogout());
}
}
// ...
auth.slice.ts
// ...
export const logout = createAsyncThunk("auth/logout", async () => {
await AuthService.logout();
});
// ...
const authSlice = createSlice({
// ...
extraReducers: (builder) => {
builder
// ...
.addCase(logout.fulfilled, (state, _action) => {
state.isLoggedIn = false;
state.id = emptyUser.id;
state.email = emptyUser.email;
state.fullName = emptyUser.fullName;
});
},
});
// ...
app-header.tsx
// ...
export default function AppHeader(): JSX.Element {
// ...
const onLogout = useCallback(() => {
dispatch(logout());
}, [dispatch]);
return (
<nav>
<ul>
{/* ... */}
<li>
<Link to={RouterService.paths.login} onClick={onLogout}>
Logout
</Link>
</li>
</ul>
{/* ... */}
</nav>
);
}
问题
ATM 有 2 个地方我想执行整个注销,包括。 http 请求,localStorage + 状态更新和重定向到登录页面:
- 从组件内部
AppHeader - 来自每个 http 请求的“401 拦截器”
虽然AppHeader 内部已经发生了所有必需的“操作”,但我不知道在http.service.ts 内部应该由谁来做这一切。
问题
- 如何在 401 拦截时从
http.service.ts内调度logout操作?
换句话说:当无法访问useDispatch挂钩时,如何从“原始 TS 服务”(或其他“非反应组件文件”)调度操作?
我已经尝试使用import { store } from '.../store'+store.dispatch(logout);直接使用商店的调度方法,但这让我很难理解运行时错误。 - 我应该如何从 401 拦截器中执行路由器重定向?
这基本上归结为与上述相同的问题:当无法访问useHistory挂钩时如何执行重定向?有没有办法“直接”访问路由器历史记录? - 除上述之外:我是否应该直接从注销
AsyncThunk中执行路由器重定向,而不是从调用reducer 的任何地方(ATMAppHeader和401 拦截器)执行路由器重定向?
如果建议从AsyncThunk执行重定向:如何使用路由器历史记录(与上述相同的问题...)? - 以上都是“废话”吗?如果是,这里有哪些实际的最佳做法?
仅供参考
我对整个 React 生态系统还很陌生,并且正在学习所涉及的所有概念。显示的代码几乎是从各种在线资源中复制粘贴和调整的,虽然我确实了解所涉及的基础知识,但我对有关 redux 工具包、钩子等的所有细节只有一点浅薄的了解。
【问题讨论】:
标签: reactjs react-redux react-hooks react-router redux-toolkit