现象: 米家授权过期后, 扫码弹窗从底部弹出但瞬间消失, 看不到二维码.
三处缺陷:
1. 服务端 startQrLogin() 在已有流程运行时提前 return, 未清 done.
上一轮成功残留的 done=true 会让前端第一次轮询就拿到
{running:false, done:true}, 误判为扫码成功立即关窗.
改为复用流程时显式返回 done:false.
2. 前端 AuthPopup 的成功/失败判定没有幂等保护, 且 onClose/onOk 是
父组件每次渲染新建的函数. 父级轮询触发重渲染后, 回调身份变化
会波及弹窗关闭路径. 改用 ref 持有最新回调 + settledRef 保证
一轮流程只结算一次.
3. 弹窗遮罩绑定 onMaskClick=cancel, 手机端极易误触; 关闭遮罩点击,
只允许显式点「取消」关闭.
注意: 前端需重新构建发布, 服务端需重启后生效.
This commit is contained in:
@@ -91,8 +91,13 @@ export function getQrImageUrl() {
|
||||
}
|
||||
|
||||
export async function startQrLogin() {
|
||||
// 已有一轮在跑就直接复用: 同一张二维码继续有效, 不重复开
|
||||
if (qrState.running) return getQrState()
|
||||
// 已有一轮在跑就直接复用: 同一张二维码继续有效, 不重复开.
|
||||
// 注意: 这里绝不能提前 return 而不清 done —— 上一轮成功时 done=true 会残留,
|
||||
// 前端第一次轮询就拿到 {done:true, running:false}, 立刻误判成"扫码成功"关掉弹窗.
|
||||
if (qrState.running) {
|
||||
const snap = getQrState()
|
||||
return { ...snap, done: false, running: true }
|
||||
}
|
||||
const api = getApi()
|
||||
qrState.running = true
|
||||
qrState.done = false
|
||||
|
||||
Reference in New Issue
Block a user