uni-app scroll-view容器未被内容撑满且子组件添加click事件后 下拉操作无法触发refresh组件的@refresh @pullingdown事件

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

uni-app scroll-view容器未被内容撑满且子组件添加click事件后 下拉操作无法触发refresh组件的@refresh @pullingdown事件

项目属性
产品分类 uniapp/App
PC开发环境操作系统 Windows
PC开发环境操作系统版本号 Windows11 21H2
HBuilderX类型 正式
HBuilderX版本号 3.4.7
手机系统 Android
手机系统版本号 Android 6.0
手机厂商 小米
手机机型 MI 4C
页面类型 nvue
vue版本 vue2
打包方式 云端
项目创建方式 HBuilderX

示例代码:

<template>  
    <view class="page-content">  
        <scroll-view style="width:750rpx;height: 800rpx; scroll-y="true" show-scrollbar="false" >  
            <refresh class="refresh" :display="refreshing ? 'show' : 'hide'" [@pullingdown](/user/pullingdown)="onPullDown" [@refresh](/user/refresh)="onRefresh">  
                <loading-indicator class="refresh-indicator"></loading-indicator>  
                <text class="jdxs-font-size-sm">{{refreshText}}</text>  
            </refresh>  
            <view style="width:750rpx;height: 200rpx; background-color: antiquewhite;" [@click](/user/click)="">  

            </view>  
        </scroll-view>  
    </view>  
</template>

操作步骤:

  • 在scroll-view内的子组件view内进行下拉滑动操作

预期结果:

实际结果:

  • 不能触发refresh组件的@refresh@pullingdown事件,需要去掉@click事件或者多个子组件撑满scroll-view容器

bug描述:

在内容没有撑满容器(scroll-view),同时在子组件view上添加click事件时, 在其上进行下拉操作无法触发refresh组件的@refresh@pullingdown事件


3 回复

动态设置高度啊


只是好奇为什么不绑定click事件,就可以触发refresh组件的事件

uni-app 中使用 scroll-view 组件时,如果遇到容器未被内容撑满且子组件添加 click 事件后,下拉操作无法触发 refresh 组件的 [@refresh](/user/refresh)[@pullingdown](/user/pullingdown) 事件,可能是由于以下几个原因导致的。以下是一些可能的解决方案:

1. 确保 scroll-view 高度正确

scroll-view 容器的高度需要正确设置,以确保内容能够撑满容器。如果高度设置不正确,可能会导致下拉刷新无法触发。

<scroll-view style="height: 100vh;" scroll-y>
  <!-- 内容 -->
</scroll-view>

2. 确保 scroll-viewscroll-y 属性已启用

scroll-view 需要启用 scroll-y 属性,以便在垂直方向上滚动。

<scroll-view scroll-y>
  <!-- 内容 -->
</scroll-view>

3. 确保 refresh 组件的 [@refresh](/user/refresh)[@pullingdown](/user/pullingdown) 事件正确绑定

确保 refresh 组件的 [@refresh](/user/refresh)[@pullingdown](/user/pullingdown) 事件已经正确绑定,并且在事件处理函数中执行了相应的逻辑。

<scroll-view scroll-y [@refresh](/user/refresh)="onRefresh" [@pullingdown](/user/pullingdown)="onPullingDown">
  <!-- 内容 -->
</scroll-view>

<script>
export default {
  methods: {
    onRefresh() {
      // 处理刷新逻辑
    },
    onPullingDown() {
      // 处理下拉逻辑
    }
  }
}
</script>

4. 检查子组件的 click 事件是否阻止了事件冒泡

如果子组件中使用了 click 事件,并且在该事件中调用了 event.stopPropagation(),这可能会阻止事件冒泡,导致 scroll-view 的下拉事件无法触发。确保子组件的 click 事件没有阻止事件冒泡。

<template>
  <div @click="handleClick">
    <!-- 子组件内容 -->
  </div>
</template>

<script>
export default {
  methods: {
    handleClick(event) {
      // 不要调用 event.stopPropagation()
      // 处理点击逻辑
    }
  }
}
</script>

5. 使用 touch 事件替代 click 事件

如果 click 事件确实需要阻止事件冒泡,可以尝试使用 touch 事件来替代 click 事件,以避免影响 scroll-view 的下拉事件。

<template>
  <div @touchstart="handleTouchStart">
    <!-- 子组件内容 -->
  </div>
</template>

<script>
export default {
  methods: {
    handleTouchStart(event) {
      // 处理触摸逻辑
    }
  }
}
</script>

6. 确保 scroll-view 的内容足够多

如果 scroll-view 的内容不足以撑满容器,可能会导致下拉刷新无法触发。确保内容足够多,或者手动设置 scroll-view 的高度。

<scroll-view style="height: 100vh;" scroll-y>
  <div v-for="item in items" :key="item.id">
    {{ item.content }}
  </div>
</scroll-view>

7. 使用 ref 手动触发下拉刷新

如果以上方法都无法解决问题,可以尝试使用 ref 手动触发下拉刷新。

<scroll-view ref="scrollView" scroll-y [@refresh](/user/refresh)="onRefresh" [@pullingdown](/user/pullingdown)="onPullingDown">
  <!-- 内容 -->
</scroll-view>

<script>
export default {
  methods: {
    onRefresh() {
      // 处理刷新逻辑
    },
    onPullingDown() {
      // 处理下拉逻辑
    },
    triggerRefresh() {
      this.$refs.scrollView.triggerPullToRefresh();
    }
  }
}
</script>
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!