如何在React-Admin登出流程中添加延迟并显示模态框?
React-Admin登出时显示延迟模态框的实现方案
直接在AuthProvider.js里操作模态框并不合适,因为AuthProvider是纯逻辑层,没有React上下文,无法直接控制UI组件。正确的做法是在React组件层面通过状态管理配合AuthProvider的异步登出流程来实现,具体步骤如下:
1. 调整AuthProvider的logout逻辑
保留登出延迟逻辑,让它专注处理业务逻辑,移除UI相关操作:
const authProvider = { // 其他auth方法(如login、checkAuth等)... logout: () => { return new Promise(resolve => { setTimeout(() => { localStorage.removeItem('username'); resolve(); }, 5000); // 5秒延迟 }); }, };
2. 在布局组件中实现模态框控制
利用React-Admin的useLogout钩子和React状态,在全局布局组件中添加模态框并关联登出操作:
import { useState } from 'react'; import { useLogout, Admin, Resource, UserMenu, MenuItemLink } from 'react-admin'; import { Dialog, DialogContent, Typography } from '@mui/material'; // 自定义用户菜单,替换默认登出按钮 const CustomUserMenu = () => { const [isLoggingOut, setIsLoggingOut] = useState(false); const logout = useLogout(); const handleLogout = async () => { setIsLoggingOut(true); // 显示"logging out..."模态框 await logout(); // 执行AuthProvider的延迟登出 setIsLoggingOut(false); // 登出完成后关闭模态框 }; return ( <> <UserMenu> <MenuItemLink onClick={handleLogout} primaryText="Logout" /> </UserMenu> {/* 登出提示模态框 */} <Dialog open={isLoggingOut} disableEscapeKeyDown disableBackdropClick > <DialogContent> <Typography variant="h6">logging out...</Typography> </DialogContent> </Dialog> </> ); }; // 自定义全局布局 const CustomLayout = ({ children }) => ( <> {children} <CustomUserMenu /> </> ); // 应用入口组件 const App = () => ( <Admin layout={CustomLayout} authProvider={authProvider}> {/* 你的资源配置,例如:<Resource name="posts" /> */} </Admin> ); export default App;
核心逻辑说明
- AuthProvider仅处理异步登出的业务逻辑:延迟清除本地存储、返回Promise
- UI层面的模态框由React组件通过
useState管理显示状态,通过useLogout触发登出流程 - 点击登出按钮时,先显示模态框,等待AuthProvider的登出Promise完成后自动关闭模态框
内容的提问来源于stack exchange,提问作者Woodchuck
相关产品推荐
相关产品推荐

