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 = '';
			},
相关推荐
ChinaLzw2 小时前
解决uniapp web-view 跳转到mui开发的h5项目 返回被拦截报错的问题
前端·javascript·uni-app
游戏开发爱好者82 小时前
如何在 Windows 环境下测试 iOS App,实时日志,CPU监控
android·ios·小程序·https·uni-app·iphone·webview
计算机毕设指导62 小时前
基于微信小程序的社区医疗服务管理系统【源码文末联系】
java·spring boot·微信小程序·小程序·tomcat·maven·intellij-idea
fengGer的bugs2 小时前
微信小程序版「死了么APP」,它来了
微信小程序·小程序·死了么·死了么app
我的86呢!2 小时前
微信小程序蓝牙配网
微信小程序·小程序
花卷HJ3 小时前
【微信小程序】open-type=“contact“ 客服按钮样式无法设置?隐藏 button + label 触发完美解决
微信小程序·小程序·notepad++
康小庄3 小时前
通过NGINX实现将小程序HTTPS请求转为内部HTTP请求
java·spring boot·nginx·spring·http·小程序
peachSoda73 小时前
使用HBuilderX 自带hbuilderx-cli 自动化打包uniapp的移动端app(Android,iOS)
android·uni-app·自动化
说私域3 小时前
创作生命力与个体价值:基于AI大模型、AI智能名片与商城小程序的视角
人工智能·小程序·开源·流量运营