React实现路由参数username变更时自动登出的方法
解决React中路由参数username变更时自动登出的问题
你的代码逻辑存在问题——当路由参数username变化时,useEffect的依赖会更新,此时username已经是新的路由参数值,window.location.href必然包含这个新值,所以!url.includes(username)永远为false,自然不会触发登出操作。
要实现目标功能,你需要拿路由参数里的username和当前实际登录的用户做对比,而不是和当前URL对比。具体实现如下:
修改后的代码示例
import { useParams, useNavigate } from 'react-router-dom'; import { useEffect } from 'react'; const TargetComponent = () => { const { username } = useParams(); const navigate = useNavigate(); const logoutR = async () => { try { await fetch("http://localhost:3000/logout", { method: "POST", credentials: "include", }); // 登出后清除本地存储的用户信息(如果有) localStorage.removeItem('currentUser'); navigate("/login"); } catch (err) { console.error('登出请求失败:', err); } }; useEffect(() => { // 从本地存储获取当前登录用户(如果你的用户信息存在Context/状态管理中,替换成对应获取方式) const currentUser = JSON.parse(localStorage.getItem('currentUser')); // 确认当前用户存在,且路由参数与当前用户不一致时触发登出 if (currentUser && username !== currentUser.username) { logoutR(); } }, [username, navigate]); return <div>你的组件内容</div>; }; export default TargetComponent;
补充说明
- 如果你的用户信息存储在React Context或Redux等状态管理工具中,直接替换
currentUser的获取逻辑即可 - 加入
try/catch是为了处理登出请求失败的情况,避免页面逻辑卡住 - 登出后记得清除本地存储的用户信息,防止后续逻辑出现异常
内容的提问来源于stack exchange,提问作者Thor
相关产品推荐
相关产品推荐

