uni-app 快手小程序中scroll-view触底有几率触发里边盒子的点击事件

发布于 1周前 作者 sinazl 来自 Uni-App

uni-app 快手小程序中scroll-view触底有几率触发里边盒子的点击事件

示例代码:

// 页面所有代码

操作步骤:

频繁触发触底事件 ,详见视频

预期结果:

正常更新数据

实际结果:

触发了里面盒子的点击事件

bug描述:

在快手小程序使用scroll-view滚动到底部事件触发时有一定几率触发scroll-view盒子点击事件
在快手模拟器中用滚轮几乎百分百触发,用手势滚动有几率触发



| 项目信息       | 版本/方式         |
|----------------|-------------------|
| 产品分类       | uniapp/小程序     |
| PC开发环境操作系统 | Windows           |
| PC开发环境操作系统版本号 | 22H2 19045.5131   |
| 第三方开发者工具版本号 | 1.61.2            |
| 基础库版本号    | 1.98.1            |
| 项目创建方式    | CLI               |
| CLI版本号      | 5.0.8             |

1 回复

在uni-app开发快手小程序时,遇到scroll-view触底(到底部)时偶尔触发内部盒子(例如按钮或可点击元素)的点击事件,通常是由于滚动事件的冒泡或者处理不当的触底检测逻辑导致的。我们可以通过一些技术手段来避免这种情况。

以下是一个简化的代码示例,展示如何在scroll-view中处理触底事件,同时避免误触发内部元素的点击事件。

HTML模板

<template>
  <view>
    <scroll-view 
      scroll-y="true" 
      @scrolltolower="handleScrollToLower"
      style="height: 100vh;">
      <view v-for="(item, index) in items" :key="index" class="item">
        <button @click="handleClick(item)">{{ item.name }}</button>
      </view>
      <!-- 模拟大量内容 -->
      <view v-for="i in 50" :key="i" class="dummy-content">更多内容...</view>
    </scroll-view>
  </view>
</template>

JavaScript逻辑

<script>
export default {
  data() {
    return {
      items: [
        { name: 'Item 1' },
        { name: 'Item 2' },
        // 更多项目...
      ],
      scrollTimeout: null, // 用于防抖处理
    };
  },
  methods: {
    handleScrollToLower() {
      // 清除之前的防抖定时器
      if (this.scrollTimeout) clearTimeout(this.scrollTimeout);
      // 设置防抖定时器,避免快速滚动时多次触发
      this.scrollTimeout = setTimeout(() => {
        console.log('Scroll to lower boundary');
        // 在这里处理触底逻辑,比如加载更多数据
      }, 300); // 300ms 防抖时间
    },
    handleClick(item) {
      console.log('Clicked:', item.name);
    },
  },
};
</script>

CSS样式

<style scoped>
.item {
  padding: 16px;
  border-bottom: 1px solid #ddd;
}
.dummy-content {
  padding: 16px;
  color: #888;
}
button {
  display: block;
  width: 100%;
  padding: 10px;
  background-color: #007aff;
  color: white;
  border: none;
  border-radius: 4px;
}
</style>

说明

  1. 防抖处理:在handleScrollToLower方法中,我们使用了一个防抖定时器来避免在快速滚动时多次触发触底事件。这有助于减少误触发的几率。
  2. 事件处理隔离:确保点击事件(@click)与滚动事件(@scrolltolower)的处理逻辑是独立的,避免相互干扰。

通过上述方法,可以有效减少在scroll-view触底时误触发内部元素点击事件的情况。如果问题依然存在,可能需要进一步检查具体的事件触发顺序和逻辑处理。

回到顶部