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 = '';
			},
相关推荐
2501_915918415 小时前
在 iOS 环境下查看 App 详细信息与文件目录
android·ios·小程序·https·uni-app·iphone·webview
前端呆头鹅5 小时前
Websocket使用方案详解(uniapp版)
websocket·网络协议·uni-app
浮桥6 小时前
uniapp+h5 公众号实现分享海报绘制
uni-app·notepad++
2501_916007476 小时前
没有 Mac 用户如何上架 App Store,IPA生成、证书与描述文件管理、跨平台上传
android·macos·ios·小程序·uni-app·iphone·webview
天空属于哈夫克36 小时前
Go 语言实战:构建一个企微外部群“技术贴收藏夹”小程序后端
小程序·golang·企业微信
wangjun51597 小时前
uniapp uni.downloadFile 偶发性下载文件失败 无响应
uni-app
菜鸟una7 小时前
【微信小程序+Taro 3+NutUI 3】input (nut-input) 、 textarea (nut-texteare)类型使用避坑
前端·vue.js·微信小程序·小程序·taro
计算机毕设指导67 小时前
基于微信小程序的校园二手交易系统【源码文末联系】
java·spring boot·spring·微信小程序·小程序·tomcat·maven
Jiaberrr7 小时前
小程序setData性能优化指南:避开坑点,让页面丝滑如飞
前端·javascript·vue.js·性能优化·小程序
Code王7 小时前
【课程设计/毕业设计】基于springboot +微信小程序的家政服务平台系统基于小程序的家政服务系统安全开发【附源码、数据库、万字文档】
spring boot·小程序·课程设计