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 {