From b418e036dd79d2dab121b24a691ef9cae5fffa3d Mon Sep 17 00:00:00 2001 From: kuaifan Date: Wed, 28 Oct 2026 08:48:26 +0000 Subject: [PATCH] =?UTF-8?q?feat(manage):=20=E5=88=87=E6=8D=A2=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E5=90=8E=E8=BF=94=E5=9B=9E=E6=97=B6=E8=AE=B0=E5=BF=86?= =?UTF-8?q?=E6=BB=9A=E5=8A=A8=E4=BD=8D=E7=BD=AE=EF=BC=8C=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E4=B8=8E=E9=80=9A=E8=AE=AF=E5=BD=95=E5=88=86=E5=88=AB=E8=AE=B0?= =?UTF-8?q?=E5=BF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/assets/js/pages/manage.vue | 19 +++++++++++-------- .../assets/js/pages/manage/messenger.vue | 12 ++++++++++++ 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/resources/assets/js/pages/manage.vue b/resources/assets/js/pages/manage.vue index fbbb37192..d688b9822 100644 --- a/resources/assets/js/pages/manage.vue +++ b/resources/assets/js/pages/manage.vue @@ -542,6 +542,7 @@ export default { viewTransition: {enter: '', leave: ''}, tabbarTransition: 'mobile-slide', viewCoverEl: null, + viewLeavePath: '', mateName: /macintosh|mac os x/i.test(navigator.userAgent) ? '⌘' : 'Ctrl', @@ -1116,6 +1117,7 @@ export default { */ updateViewTransition(to, from) { this.releaseViewCover() + this.viewLeavePath = from.path const isSubPage = route => /^manage-(setting|calendar|file)/.test(route.name || '') if (this.$isEEUIApp && this.windowPortrait) { if (from.name === 'manage-application' && isSubPage(to)) { @@ -1137,16 +1139,16 @@ export default { }, /** - * 停留在下层的页面(应用)离开前记录滚动位置(keep-alive 移出 DOM 后会丢失) + * 页面离开前记录滚动位置(keep-alive 移出 DOM 后会丢失) * @param el */ onViewBeforeLeave(el) { - if (this.viewTransition.leave !== 'manage-view-stay') { - return + el.__scrollSnapshot = { + path: this.viewLeavePath, + items: [el, ...el.querySelectorAll('*')] + .filter(item => item.scrollTop > 0 || item.scrollLeft > 0) + .map(item => ({item, top: item.scrollTop, left: item.scrollLeft})), } - el.__scrollSnapshot = [el, ...el.querySelectorAll('*')] - .filter(item => item.scrollTop > 0 || item.scrollLeft > 0) - .map(item => ({item, top: item.scrollTop, left: item.scrollLeft})) }, /** @@ -1164,10 +1166,11 @@ export default { return } delete el.__scrollSnapshot - if (this.viewTransition.enter !== 'manage-view-stay') { + // 同一页面实例换了内容(如切换到另一个项目)时不恢复 + if (snapshot.path !== this.$route.path) { return } - snapshot.forEach(({item, top, left}) => { + snapshot.items.forEach(({item, top, left}) => { if (el.contains(item)) { item.scrollTop = top item.scrollLeft = left diff --git a/resources/assets/js/pages/manage/messenger.vue b/resources/assets/js/pages/manage/messenger.vue index b070694fb..f9ef5b70d 100644 --- a/resources/assets/js/pages/manage/messenger.vue +++ b/resources/assets/js/pages/manage/messenger.vue @@ -318,6 +318,7 @@ export default { firstLoad: true, activeNum: 0, tabActive: 'dialog', + tabScrollTop: {}, // 消息、通讯录共用列表,分别记忆滚动位置 dialogSearchLoad: 0, dialogSearchKey: '', @@ -691,6 +692,7 @@ export default { tabActive: { handler(val) { + this.restoreListScroll(); if (val == 'contacts') { this.loadContactsView(); this.dialogSearchSelectedParams = null; @@ -759,12 +761,22 @@ export default { }, listScroll() { + this.tabScrollTop[this.tabActive] = this.$refs.list.scrollInfo().scrollY if (this.scrollE() < 10) { this.getContactsNextPage() } this.operateVisible = false; }, + restoreListScroll() { + this.$nextTick(_ => { + const el = this.$refs.list?.scrollElement() + if (el && el.isConnected) { + el.scrollTop = this.tabScrollTop[this.tabActive] || 0 + } + }) + }, + scrollE() { if (!this.$refs.list) { return 0