uniapp开发小程序 使用scroll-view时左右滑动切换无法回到最左边的bug解决方案

bug场景:项目中是会用了tabs,scroll-view,在切换的时候,选择最右边的分类,切换tabs回来之后没有默认的值已经切换最左边,但是页面没有滚动到最左边

按理说,要让scroll-view横向滚动回到最左边,我们可以使用scroll-left属性,设置为0即可回到最左边。通过动态设置scroll-left的值,并调用scroll-viewscrollTo方法或直接改变scroll-left的值并刷新视图,可以实现滚动到最左边,但是实际上给了scroll-left重置了scroll-left为依然没有回到最左边,这就是问题所在

这是原来的代码,

html 复制代码
		<u-tabs :list="list" :is-scroll="false" :current="tabsCurrent" active-color="#1F2533" bg-color="transparent" inactive-color="#748099" bar-width="0" @change="change"></u-tabs>
		<!-- 标签 -->
		<view class="label">
			<scroll-view  :scroll-left="scrollFeft" :scroll-x="true"  :show-scrollbar='false'  >
				<view class="label-scroll">
					<view class="label-item" v-for="(item, i) in classificationlList"  :key="i" :class="i == labelCurrent ? 'label-active' : 'label-color'" @click="clickLabel(item, i)">
						{{tabsCurrent ? (item.name || "") : (item.typeName  || "")}}
					</view>
				</view>
			</scroll-view>
		</view>
javascript 复制代码
			// 切换tabs
			change(index) {
				this.tabsCurrent = index;
				this.labelCurrent = 0;
				//业务场景....
				this.scrollFeft = 0;

			},
			// 点击分类
			clickLabel(e,i) {
				this.labelCurrent = i;
				//业务场景....
			},

核心原因是:用户手动滑动后,scroll-view 的实际滚动位置已经改变,而我们在代码中只重置了 labelCurrent 但没有真正重置滚动条的 DOM 位置。

还有一个可能,scroll-view 的滚动位置可能被小程序底层或 Vue 的渲染机制缓存了。我们需要用一个更直接、更底层的方法来强制重置。

最小改动方案

1.在你的 scroll-view 上添加一个 :key 属性:

:key="`{labelCurrent}-{new Date().getTime()}`"

2.使用 scroll-into-view 强制滚动到第一个元素,添加 scroll-into-view 绑定和第一个标签的ID,

:scroll-into-view="scrollIntoId"

:id="i == 0 ? 'firstLabel' : ''"

3.在 data 中添加控制变量,并修改 change 方法,

置滚动到第一个标签

this.scrollIntoId = 'firstLabel';

暂延迟后清空ID,以便下次能再次触发

setTimeout(() => {
this.scrollIntoId = '';
}, 100);

击标签时,要确保 scrollIntoId 是空的,以免干扰
this.scrollIntoId = '';

修改后代码:

html:

html 复制代码
		<!-- tabs -->
		<u-tabs :list="list" :is-scroll="false" :current="tabsCurrent" active-color="#1F2533" bg-color="transparent" inactive-color="#748099" bar-width="0" @change="change"></u-tabs>
		<!-- 标签 -->
		<view class="label">
			<scroll-view  :scroll-left="scrollFeft" :scroll-x="true" :enhanced="true" :show-scrollbar='false' :key="`${labelCurrent}-${new Date().getTime()}`" :scroll-into-view="scrollIntoId">
				<view class="label-scroll">
					<view class="label-item" v-for="(item, i) in classificationlList" :id="i == 0 ? 'firstLabel' : ''" :key="i" :class="i == labelCurrent ? 'label-active' : 'label-color'" @click="clickLabel(item, i)">
						{{tabsCurrent ? (item.name || "") : (item.typeName  || "")}}
					</view>
				</view>
			</scroll-view>
		</view>
javascript 复制代码
			// 切换tabs
			change(index) {
				this.tabsCurrent = index;
				this.labelCurrent = 0;
				if(this.tabsCurrent  == 1) {
					//业务场景....
					}
				}else{
					// 查询商品所有一级分类
					this.getShopTypeList();
				}
				this.parseLoaded();
				this.scrollFeft = 0;
				this.scrollIntoId = 'firstLabel';
				setTimeout(() => {
					this.scrollIntoId = '';
				}, 100);
			},
			// 点击分类
			clickLabel(e,i) {
				this.labelCurrent = i;
				//业务场景....
				this.scrollIntoId = '';
			},
相关推荐
万物得其道者成9 小时前
UniApp 多端滑块验证码插件 zxj-slide-verify 实用指南
uni-app
蓝帆傲亦11 小时前
支付宝小程序性能暴增秘籍:UniApp项目极限优化全攻略
小程序·uni-app
CHU72903516 小时前
淘宝扭蛋机抽盒小程序前端功能解析:解锁趣味抽盒新体验
前端·小程序
2501_9339072117 小时前
深圳本凡科技专业企业APP开发,助力手机应用创新优化
科技·微信小程序·小程序
每天都要加油呀!19 小时前
TypeError: uni.requestPayment is not a function
小程序
java1234_小锋19 小时前
分享一套优质的微信小程序校园志愿者系统(SpringBoot后端+Vue3管理端)
微信小程序·小程序·校园志愿者
2501_9160088921 小时前
深入解析iOS机审4.3原理与混淆实战方法
android·java·开发语言·ios·小程序·uni-app·iphone
打破砂锅问到底00721 小时前
AI 驱动开发实战:10分钟从零构建「微信群相册」小程序
人工智能·微信·小程序·ai编程
CHU72903521 小时前
扭蛋机盲盒小程序前端功能设计解析:打造趣味与惊喜并存的消费体验
前端·小程序
QT.qtqtqtqtqt1 天前
uni-app小程序前端开发笔记(更新中)
前端·笔记·小程序·uni-app