uni-app scroll-view的滑动事件与子项列表的长按事件的冲突解决

本文分享了在uni-app中遇到的scroll-view与子view长按事件冲突问题,通过添加touchstart、touchmove和longpress事件及位置判断,避免了滑动时误触发长按。欢迎交流改进方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这几天又学习了新的技术,uni-app支持多平台的框架,实现功能的时候发现scroll-view的滑动事件会和子项的长按事件冲突

找了一个不太好的方法,结果浪费了好多时间,

现在发现view有一个touchmove事件(scroll-view的子项是用view包裹的),当我按住某一个view滑动scroll-view的时候,会触发view 的长按事件

解决方法如下:

在子项view上添加@touchstart,@touchmove,@longpress事件,用来支持长按事件

添加如下属性

在itemTouchstart中记录触屏的位置

然后在itemTouchmove中判断是否在移动,是移动的话,不响应长按事件

下面是长按事件

如果大家发现我说的有问题,或者有更好的方法,欢迎大家在评论里提出来,互相学习,嘻嘻

### 使用 `scroll-view` 组件实现无限循环滚动 为了实现在 Uni-app 中使用 `scroll-view` 组件达到无限循环滚动的效果,可以借鉴一些技巧和方法。虽然官方文档并没有直接提供关于 `scroll-view` 循环滚动的具体说明[^1],但是可以通过模拟数据集并巧妙利用 JavaScript 来创建这种体验。 #### 创建虚拟无尽的数据源 首先,在 Vue 数据模型中准备两份相同的内容作为初始渲染项,并将其拼接在一起形成一个看似无穷的数据集合: ```javascript data() { return { items: Array.from({ length: 20 }, (_, i) => ({ id: `${i}`, text: 'Item ' + (i % 10 + 1), })).concat(Array.from({ length: 20 }, (_, i) => ({ // 复制一份相同的数组片段 id: `${i + 20}`, text: 'Item ' + ((i + 20) % 10 + 1), }))), currentIndex: 0, }; } ``` 这里创建了一个由40个条目组成的列表,其中前半部分后半部分完全一致,以此来制造出一种“循环”的错觉。 #### 动态调整可见区域位置 当用户接近任一端点时(即第一个或最后一个元素),通过编程方式改变 `scroll-view` 的偏移量(`scrollTop`)以及当前索引值 (`currentIndex`) ,使得视觉上看起来像是无缝衔接地继续向下/向上滚动: ```html <template> <view class="container"> <scroll-view :scroll-y="true" @scroll="handleScroll" style="height: 300px;"> <block v-for="(item, index) in visibleItems" :key="index"> <text>{{ item.text }}</text><br/> </block> </scroll-view> </view> </template> <script> export default { computed: { visibleItems(){ const start = this.currentIndex; let end = Math.min(this.items.length - 1, this.currentIndex + 9); if(end === this.items.length - 1 && this.currentIndex >= this.items.length / 2){ setTimeout(() => {this.scrollToTop()}, 50); // 当到达底部且处于下半区时重置顶部 } return this.items.slice(start, end + 1); }, }, methods:{ handleScroll(e){ const offset = e.detail.scrollTop; if(offset <= 0 && this.currentIndex < this.items.length / 2){ this.scrollToBottom(); } this.updateCurrentIndex(offset); }, updateCurrentIndex(scrollOffset){ this.currentIndex = parseInt((scrollOffset / 40).toFixed()); }, scrollToTop(){ this.$nextTick(()=>{ this.scrollViewRef.scrollTo({ top: -(this.items.length * 40)/2, duration: 0 }); this.currentIndex = this.items.length / 2; }) }, scrollToBottom(){ this.$nextTick(()=>{ this.scrollViewRef.scrollTo({ top: (this.items.length * 40)/2, duration: 0 }); this.currentIndex = this.items.length / 2 - 10; }) } } }; </script> ``` 上述代码实现了基本的上下循环滚动逻辑。每当检测到即将触碰边界条件时就会触发相应的处理函数去平滑过渡至另一侧起点处而不打断用户体验流程。 需要注意的是,实际开发过程中可能还需要考虑更多细节优化,比如动画效果、性能调优等方面的问题。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值