uni-app scroll-view容器未被内容撑满且子组件添加click事件后 下拉操作无法触发refresh组件的@refresh @pullingdown事件
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事件
实际结果:
- 不能触发refresh组件的@refresh、@pullingdown事件,需要去掉@click事件或者多个子组件撑满scroll-view容器
bug描述:
在内容没有撑满容器(scroll-view),同时在子组件view上添加click事件时, 在其上进行下拉操作无法触发refresh组件的@refresh、@pullingdown事件
动态设置高度啊
只是好奇为什么不绑定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-view
的 scroll-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>