From 44d60471ca1acccb41f6e131ceae0bae3d657f93 Mon Sep 17 00:00:00 2001 From: cheney Date: Sat, 8 Aug 2026 05:37:40 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E6=88=90=E5=8A=9F=E4=BD=86=E6=9C=AA=E8=B7=B3=E8=BD=AC=E5=86=85?= =?UTF-8?q?=E9=83=A8=E9=A1=B5=E9=9D=A2=E7=9A=84=E7=AB=9E=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit LoginPage.onSubmit 在 setUser 异步提交前手动 navigate(from), 切到受保护页时 user 仍为 null, 被 RequireAuth 立即踢回 /login, 导致提示登录成功却进不去内部页面。改为依赖组件顶部 在 user 就绪后可靠跳转。 --- src/pages/LoginPage.jsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/pages/LoginPage.jsx b/src/pages/LoginPage.jsx index 7a99a63..2980a2a 100644 --- a/src/pages/LoginPage.jsx +++ b/src/pages/LoginPage.jsx @@ -1,5 +1,5 @@ import { useState } from 'react' -import { useNavigate, useLocation, Navigate } from 'react-router-dom' +import { useLocation, Navigate } from 'react-router-dom' import { Button, Card, Checkbox, Input, Toast } from 'antd-mobile' import { useAuth } from '../auth/AuthContext.jsx' @@ -7,7 +7,6 @@ import { useAuth } from '../auth/AuthContext.jsx' // 使用 antd-mobile: Input / Checkbox / Button / Card / Toast export default function LoginPage() { const { user, login } = useAuth() - const navigate = useNavigate() const location = useLocation() const from = location.state?.from?.pathname || '/' @@ -17,6 +16,9 @@ export default function LoginPage() { const [busy, setBusy] = useState(false) const [err, setErr] = useState('') + // 登录成功后 user 会变成非空, 由顶部 负责可靠跳转 + // 不能在 onSubmit 里手动 navigate: setUser 是异步的, 在它提交前导航会切到受保护页, + // 此时 user 仍为 null 被 RequireAuth 立刻踢回 /login, 造成"提示成功却进不去" if (user) return async function onSubmit(e) { @@ -26,7 +28,6 @@ export default function LoginPage() { try { await login(email.trim(), password, remember) Toast.show({ icon: 'success', content: '登录成功' }) - navigate(from, { replace: true }) } catch (e) { setErr(e.message) } finally {