From 9f3155a9f20499d4b75a991933fedddc8d971c05 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Tue, 8 Sep 2026 15:27:13 +0800 Subject: [PATCH] =?UTF-8?q?fix(mobile):=20=E5=BA=95=E9=83=A8Tab=E7=82=B9?= =?UTF-8?q?=E5=87=BB=E6=97=A0=E5=93=8D=E5=BA=94+=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E7=AA=97=E5=8F=A0=E5=BC=80=E2=80=94=E2=80=94=E2=91=A0=5Fmobile?= =?UTF-8?q?=5Fbar=5Fclicked=E4=B8=8D=E8=A7=A3=E5=8C=85dispatch=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6({params:=E6=95=B0=E6=8D=AE})=E8=87=B4item.name?= =?UTF-8?q?=E6=81=92undefined=E9=9D=99=E9=BB=98return(=E5=AE=9E=E6=B5=8B?= =?UTF-8?q?=E6=A0=B9=E5=9B=A0,Toolbar/Menu=E5=90=8C=E7=BA=A6=E5=AE=9A);?= =?UTF-8?q?=E2=91=A1withLoginInfo=E5=8A=A0=E7=99=BB=E5=BD=95=E7=AA=97?= =?UTF-8?q?=E5=8D=95=E4=BE=8B=5Fbricks.=5Flogin=5Fwindow=5Fpending,?= =?UTF-8?q?=E5=B9=B6=E5=8F=91401=E5=85=B1=E4=BA=AB=E4=B8=80=E7=AA=97?= =?UTF-8?q?=E5=90=8E=E6=9D=A5=E8=80=85=E7=AD=89=E9=94=80=E6=AF=81=E5=90=8E?= =?UTF-8?q?=E9=87=8D=E8=AF=95,=E9=87=8D=E8=AF=95=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E6=8A=BD=5Fretry=5Fafter=5Flogin=E5=85=B1=E4=BA=AB=E5=B0=BE?= =?UTF-8?q?=E9=83=A8(2026-09-08=E7=94=A8=E6=88=B7=E6=8A=A5=E9=9A=9C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bricks/jsoncall.js | 14 +++++++++++++- bricks/tab.js | 4 ++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/bricks/jsoncall.js b/bricks/jsoncall.js index 6e9e2c0..162acb1 100644 --- a/bricks/jsoncall.js +++ b/bricks/jsoncall.js @@ -168,6 +168,14 @@ bricks.HttpText = class { return result; } async withLoginInfo(url, opts){ + // 登录窗单例(2026-09-08):手机首屏并发多个 401 请求时,旧实现每个请求 + // 各建一个登录窗 → 叠开多个登录页。共享同一个窗:后来者等它销毁后重试。 + if (bricks._login_window_pending){ + await new Promise(resolve => { + bricks._login_window_pending.bind('destroy', resolve); + }); + return await this._retry_after_login(url, opts); + } var login_window = await bricks.widgetBuild({ "widgettype":"urlwidget", "options":{ @@ -182,12 +190,16 @@ bricks.HttpText = class { console.log('withLoginInfo: failed to build login widget'); return null; } + bricks._login_window_pending = login_window; // Wait for login window to be destroyed (successful login) await new Promise(resolve => { login_window.bind('destroy', resolve); }); - + bricks._login_window_pending = null; + return await this._retry_after_login(url, opts); + } + async _retry_after_login(url, opts){ console.log('withLoginInfo: login window destroyed, retrying request'); // Retry the original request diff --git a/bricks/tab.js b/bricks/tab.js index 87ca925..3e24ef1 100644 --- a/bricks/tab.js +++ b/bricks/tab.js @@ -104,6 +104,10 @@ bricks.TabPanel = class extends bricks.Layout { this._mobile_bar_apply(bricks.is_mobile()); } _mobile_bar_clicked(item){ + // bind 事件经 dispatch 包装为 {params: 数据}(Toolbar/Menu 同约定); + // 框架内部直调传裸对象 —— 两种形态都兼容(2026-09-08 实测:不解包则 + // 用户点底部 Tab 静默无响应) + if (item && item.params) item = item.params; var desc = null; for (var i=0;i