本文介绍在 react 应用中可靠监听浏览器后退操作(如点击返回按钮或调用 history.back())的方法,结合模态框确认逻辑实现“点击后退 → 弹出登出确认 → 确认后执行登出”的完整交互流程。
在 React 单页应用(SPA)中,直接监听原生 popstate 事件往往不可靠——尤其当路由由 React Router 管理时,window.addEventListener('popstate') 可能被路由库内部拦截或覆盖,导致回调不触发或触发时机异常。更健壮的方案是借助底层路由历史对象(如 createBrowserHistory)进行监听。
首先安装 history(若未使用 React Router v6.4+ 的 createBrowserRouter,推荐此方式):
npm install history # 或 yarn add history
然后在组件中监听后退行为:
import { useEffect } from 'react';
import { createBrowserHistory } from 'history';
const browserHistory = createBrowserHistory();
function App() {
useEffect(() => {
const unlisten = browserHistory.listen((update) => {
if (update.action === 'POP') {
// 检测到用户点击了浏览器后退按钮
showLogoutConfirmModal(); // 自定义函数:显示登出确认弹窗
}
});
return () => unlisten(); // 清理监听器
}, []);
const showLogoutConfirmModal = () => {
const confirmed = window.confirm('您确定要退出登录吗?点击“确定”将退出当前会话。');
if (confirmed) {
handleLogout(); // 执行登出逻辑(如清除 token、跳转登录页等)
} else {
// 用户取消 → 手动前进一步,抵消后退动作(可选)
browserHistory.go(1);
}
};
const handleLogout = () => {
localStorage.removeItem('authToken');
// 重定向到登录页(注意:若使用 React Router,请用 navigate 替代 window.location)
window.location.href = '/login';
};
return 主应用内容;
}
export default App;
story 仅适用于客户端环境,在 useEffect 中使用已天然规避 SSR 报错,无需额外判断。通过该方案,你不仅能精准捕获后退意图,还能与业务逻辑(如登出确认流)无缝衔接,显著提升应用的安全性与用户体验。