收紧未登录场景下首页二维码弹窗展示规则

This commit is contained in:
liuwei
2026-05-07 15:23:49 +08:00
parent b476e034dc
commit 1d8bf58014

View File

@@ -124,12 +124,13 @@
<el-dialog
title="微信登录二维码"
:visible.sync="loginQrDialog.visible"
:visible="shouldShowLoginQrDialog"
width="760px"
class="login-qr-dialog"
:show-close="false"
:close-on-click-modal="false"
:close-on-press-escape="false">
:close-on-press-escape="false"
@update:visible="handleLoginQrDialogVisibleChange">
<div class="login-qr-dialog__body" v-loading="loginQrDialog.loading">
<div class="login-qr-dialog__hero">
<div class="login-qr-dialog__preview">
@@ -620,6 +621,16 @@
showLoginQrBanner() {
return !this.loginQrDialog.logged_in;
},
shouldShowLoginQrDialog() {
// 首页登录弹窗的展示规则尽量简单且稳定:
// 1. 只要当前还没登录成功,就必须强制显示二维码弹窗,避免前端局部状态抖动把弹窗意外关掉;
// 2. 登录成功后再退回到本地 visible 控制,兼容后续如果需要保留“手动再次查看”的空间;
// 3. 这样能直接满足“没有可用账号,就一直要求扫码登录”的目标,不再依赖多处代码同步开关。
if (!this.loginQrDialog.logged_in) {
return true;
}
return !!this.loginQrDialog.visible;
},
loginQrStatusTone() {
if (this.loginQrDialog.provider_stage === 'connection_pending') {
return 'soft';
@@ -882,6 +893,17 @@
openLoginQrDialog() {
this.loginQrDialog.visible = true;
},
handleLoginQrDialogVisibleChange(nextVisible) {
// 未登录时弹窗不允许被真正关闭:
// 1. Element UI 仍可能在内部触发 `update:visible` 事件;
// 2. 如果这里直接接受 false就会再次出现“业务要求必须常驻但组件自己收起”的问题
// 3. 因此只有在已登录成功后,才允许同步关闭状态。
if (!this.loginQrDialog.logged_in) {
this.loginQrDialog.visible = true;
return;
}
this.loginQrDialog.visible = !!nextVisible;
},
applyLoginQrState(state) {
const nextState = state || {};
const current = nextState.current || {};