From 5890b1d114d879f3dd80382d0734407c318b7a98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=96=87=E6=98=8A?= <15984991+wwh2328692301@user.noreply.gitee.com> Date: Mon, 25 May 2026 10:10:53 +0800 Subject: [PATCH] =?UTF-8?q?refactor(todo):=20=E6=9B=BF=E6=8D=A2=E6=BB=91?= =?UTF-8?q?=E5=8A=A8=E8=A7=A6=E5=8F=91=E5=8A=A0=E8=BD=BD=E4=B8=BA=E7=82=B9?= =?UTF-8?q?=E5=87=BB=E5=8A=A0=E8=BD=BD=E6=9B=B4=E5=A4=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重构了待办页面的加载更多逻辑:移除滚动监听和自动加载逻辑,改为点击按钮触发加载;优化了加载状态提示和UI样式,简化了滚动视图高度计算逻辑,移除了多余的状态变量和防抖冷却逻辑。 --- apps/hand-factory/pages/todo/index.vue | 236 ++++++++++--------------- 1 file changed, 95 insertions(+), 141 deletions(-) diff --git a/apps/hand-factory/pages/todo/index.vue b/apps/hand-factory/pages/todo/index.vue index 991ebf3..8ef4f6a 100644 --- a/apps/hand-factory/pages/todo/index.vue +++ b/apps/hand-factory/pages/todo/index.vue @@ -37,8 +37,6 @@ :refresher-enabled="true" :refresher-triggered="refreshing" @refresherrefresh="onRefresh" - @scroll="onScroll" - lower-threshold="100" > @@ -69,18 +67,21 @@ - - - - ↑ 向上滑动加载更多 + + + + 加载中... - - + + 点击加载更多 + (已加载 {{ list.length }} / {{ total }} 条) + + + + 已加载全部 {{ total }} 条数据 + @@ -119,10 +120,6 @@ export default { list: [], loading: false, refreshing: false, - loadMoreCooldown: false, // 加载更多冷却期标志 - isAtBottom: false, // 是否滑动到底部 - canLoadMore: false, // 是否可以加载更多(需要再次向上滑动) - lastScrollTop: 0, // 上次滚动位置 query: { pageNum: 1, pageSize: 10, @@ -134,7 +131,8 @@ export default { itemManufacturer: '', hasTransferType: true // 待贴标签只显示有调拨类型的钢卷 }, - total: 0 + total: 0, + loadMoreTimer: null // 加载更多防抖定时器 } }, created() { @@ -146,13 +144,11 @@ export default { }, onReady() { // 页面就绪后再次计算高度(确保布局完成) - this.$nextTick(() => { - this.calcScrollViewHeight() - }) + this.calcScrollViewHeight() }, computed: { loadMoreStatus() { - if (this.loading || this.loadMoreCooldown) return 'loading' + if (this.loading) return 'loading' if (this.list.length >= this.total) return 'noMore' return 'more' } @@ -170,13 +166,11 @@ export default { // 各区域高度(单位:px) const navBarHeight = 44 // 导航栏高度 const tabBarHeight = 50 // Tab栏高度 - const filterBarHeight = 60 // 筛选栏高度(留有余量) + const filterBarHeight = 50 // 筛选栏高度(收起状态) const bottomSafeArea = systemInfo.safeAreaInsets?.bottom || 0 // 底部安全区域 - const tabBarOffset = 50 // 底部TabBar高度 - // 计算 scroll-view 可用高度(确保最小高度为200px) - let calcHeight = windowHeight - statusBarHeight - navBarHeight - tabBarHeight - filterBarHeight - bottomSafeArea - tabBarOffset - this.scrollViewHeight = Math.max(calcHeight, 200) + // 计算 scroll-view 可用高度 + this.scrollViewHeight = windowHeight - statusBarHeight - navBarHeight - tabBarHeight - filterBarHeight - bottomSafeArea console.log('scroll-view 高度计算:', { windowHeight, @@ -185,8 +179,6 @@ export default { tabBarHeight, filterBarHeight, bottomSafeArea, - tabBarOffset, - calcHeight, scrollViewHeight: this.scrollViewHeight }) }, @@ -262,11 +254,6 @@ export default { } finally { this.loading = false this.refreshing = false - // 延迟解除冷却期,防止立即再次触发加载 - setTimeout(() => { - this.loadMoreCooldown = false - console.log('加载冷却期结束') - }, 500) } }, @@ -303,97 +290,47 @@ export default { this.fetchList() }, - // 滚动事件处理 - onScroll(e) { - const scrollTop = e.detail.scrollTop - const scrollHeight = e.detail.scrollHeight - const clientHeight = this.scrollViewHeight - - // 防止无效值 - if (!scrollHeight || !clientHeight) return - - // 判断是否滑动到底部(距离底部小于 150px) - const distanceToBottom = scrollHeight - scrollTop - clientHeight - const isNearBottom = distanceToBottom < 150 - - // 判断滑动方向(增加最小变化阈值,防止微小抖动) - const scrollDelta = scrollTop - this.lastScrollTop - const isScrollingDown = scrollDelta > 3 - const isScrollingUp = scrollDelta < -3 - - console.log('滚动事件:', { - scrollTop, - scrollHeight, - clientHeight, - distanceToBottom, - isNearBottom, - isScrollingDown, - isScrollingUp, - isAtBottom: this.isAtBottom, - canLoadMore: this.canLoadMore - }) - - // 如果滑动到底部,标记状态但不加载 - if (isNearBottom && !this.isAtBottom) { - console.log('滑动到底部,等待再次向上滑动触发加载') - this.isAtBottom = true - this.canLoadMore = true - } - - // 如果已经到底部,并且用户开始向上滑动,触发加载 - if (this.isAtBottom && this.canLoadMore && isScrollingUp) { - console.log('底部后向上滑动,触发加载更多') - this.canLoadMore = false - this.doLoadMore() - } - - // 如果离开底部区域,重置状态 - if (!isNearBottom && this.isAtBottom) { - console.log('离开底部区域') - this.isAtBottom = false - this.canLoadMore = false - } - - // 只有滑动方向明确时才更新 lastScrollTop - if (Math.abs(scrollDelta) > 3) { - this.lastScrollTop = scrollTop - } - }, - - // 实际执行加载更多 - doLoadMore() { - console.log('执行加载更多', { + // 加载更多 + onLoadMore() { + console.log('触发加载更多', { listLength: this.list.length, total: this.total, loading: this.loading, - loadMoreCooldown: this.loadMoreCooldown, pageNum: this.query.pageNum }) - - // 防抖保护:如果正在加载、冷却期或已到最后一页,直接返回 - if (this.list.length >= this.total || this.loading || this.loadMoreCooldown) { - console.log('加载更多被阻止:已到最后一页、正在加载中或冷却期内') + + // 检查是否已加载全部数据 + if (this.list.length >= this.total) { + console.log('加载更多被阻止:已加载全部数据') + uni.showToast({ + title: '已加载全部数据', + icon: 'none', + duration: 1500 + }) return } - - // 设置冷却期,防止连续触发 - this.loadMoreCooldown = true - - // 增加短暂延迟,防止 scrolltolower 立即重复触发 - if (this._loadMoreTimer) { - clearTimeout(this._loadMoreTimer) + + // 检查是否正在加载中 + if (this.loading) { + console.log('加载更多被阻止:正在加载中') + return } - - this._loadMoreTimer = setTimeout(() => { - this.query.pageNum++ - console.log('加载第', this.query.pageNum, '页') - this.fetchList(true) - }, 150) - }, - - // 加载更多(点击按钮时调用) - onLoadMore() { - this.doLoadMore() + + // 防抖保护:防止重复点击 + if (this.loadMoreTimer) { + console.log('加载更多被阻止:防抖保护中') + return + } + + // 设置防抖定时器 + this.loadMoreTimer = setTimeout(() => { + this.loadMoreTimer = null + }, 800) + + // 执行加载 + this.query.pageNum++ + console.log('加载第', this.query.pageNum, '页') + this.fetchList(true) }, // 重贴标签 @@ -534,11 +471,11 @@ export default { -webkit-overflow-scrolling: touch; .coil-list { - padding-bottom: 40rpx; + padding-bottom: 20rpx; } - + .load-more-wrapper { - padding: 30rpx 0; + padding: 16rpx 0; display: flex; justify-content: center; align-items: center; @@ -546,33 +483,50 @@ export default { &:active { opacity: 0.7; } - } - .bottom-hint { - padding: 30rpx 0 50rpx; - display: flex; - justify-content: center; - align-items: center; + .load-more-btn { + display: flex; + flex-direction: column; + align-items: center; + padding: 12rpx 32rpx; + background: #ffffff; + border-radius: 8rpx; + box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.08); - .hint-text { - font-size: 28rpx; - color: #1a73e8; - font-weight: 500; - animation: pulse 1.5s ease-in-out infinite; + .btn-text { + font-size: 26rpx; + color: #1a73e8; + font-weight: 500; + } + + .btn-hint { + font-size: 20rpx; + color: #999999; + margin-top: 4rpx; + } + } + + .load-more-loading { + display: flex; + align-items: center; + padding: 12rpx 32rpx; + + .loading-text { + font-size: 26rpx; + color: #999999; + } + } + + &.no-more { + padding: 16rpx 0; + + .no-more-text { + font-size: 22rpx; + color: #bbbbbb; + } } } - - @keyframes pulse { - 0%, 100% { - opacity: 0.5; - transform: translateY(0); - } - 50% { - opacity: 1; - transform: translateY(-3rpx); - } - } - + .placeholder-page { display: flex; flex-direction: column;