uni-app中,swiper内嵌list-view无法上下滚动
uni-app中,swiper内嵌list-view无法上下滚动
开发环境与项目信息
项目信息 | 描述 |
---|---|
产品分类 | uniapp/App |
PC开发环境操作系统 | Windows |
PC开发环境版本号 | windows11 |
HBuilderX类型 | 正式 |
HBuilderX版本号 | 4.15 |
手机系统 | Android |
手机系统版本号 | Android 12 |
手机厂商 | 一加 |
手机机型 | 一加7pro |
页面类型 | nvue |
vue版本 | vue3 |
打包方式 | 离线 |
项目创建方式 | HBuilderX |
示例代码
<template>
<view>
<swiper>
<swiper-item v-for="i:QuestionModel in QuestionList" style="height: 100%;">
<list-view>
<list-item>
<text>{{i.description}}</text>
<view v-for="(item:QuestionItem,index) in i.questions" :key="index">
<text>{{item.question}}</text>
<text v-for="(c:Choices,cindex) in item.choices">{{c.description}}</text>
</view>
</list-item>
</list-view>
</swiper-item>
</swiper>
</view>
</template>
<script lang="uts">
type QuestionItem = {
question: string;
choices: Choices[];
answer: string;
analysis: string;
}
type Choices = {
title: any | null;
description: any | null;
}
type QuestionModel = {
id: any | null;
questionId: any | null;
description: any | null;
questionType: any | null;
discipline: any | null;
subject: any | null;
title: any | null;
subTitle: any | null;
questions: QuestionItem[];
createdTime: any | null;
year: any | null;
}
export default {
data() {
var result = "[{...}]";
}
}
</script>
操作步骤
参考以上代码。
预期结果
可以左右滑动切换,以及上下滚动。
实际结果
可以左右滑动,但是无法上下滚动。
Bug描述
一个题库的APP,要实现左右滑动可以切换题目,类似轮播图的效果,一个题目如果内容比较多,可以上下滚动。所以在swiper里面内嵌了一个list-view,以支持上下滚动,但是实际无法滚动。
建议直接附件提供完整demo项目 你这种大量贴代码还不全对我们判断问题意义不大
普遍情况吧,都不需要demo,只测试了安卓端,4.15版本,你写个swiper,swiper-item里面放个list-view,list-view可以滑动,swiper不能滑动
只要页面有滚动,list就无法滚动,这个组件就是让你用来代替页面滚动的,真的坑
在uni-app中,swiper组件和list-view(或scroll-view)的嵌套使用确实可能会遇到一些滚动冲突的问题。这主要是因为swiper组件默认会捕获所有的触摸事件来进行左右滑动切换,这可能会阻止内部的scroll-view进行上下滚动。
为了解决这个问题,我们可以尝试通过一些技巧来让内部的scroll-view能够正常滚动。以下是一个可能的解决方案,使用catchtouchmove
事件来阻止swiper对特定区域的触摸事件捕获:
<template>
<view class="container">
<swiper :autoplay="false" :interval="3000" :duration="500">
<swiper-item v-for="(item, index) in items" :key="index">
<view class="swiper-content">
<!-- 使用catchtouchmove阻止swiper捕获这个区域的滑动事件 -->
<scroll-view scroll-y="true" class="scroll-view" catchtouchmove="handleCatchTouchMove">
<view v-for="(subItem, subIndex) in item.subItems" :key="subIndex" class="list-item">
{{ subItem }}
</view>
</scroll-view>
</view>
</swiper-item>
</swiper>
</view>
</template>
<script>
export default {
data() {
return {
items: [
{ subItems: ['Item 1-1', 'Item 1-2', 'Item 1-3', /* ...more items... */] },
{ subItems: ['Item 2-1', 'Item 2-2', 'Item 2-3', /* ...more items... */] },
// ...more swiper items...
]
};
},
methods: {
handleCatchTouchMove(e) {
// 这个方法实际上不需要做任何操作,
// 主要目的是通过catchtouchmove属性阻止swiper捕获这个区域的触摸事件
// 从而允许scroll-view进行上下滚动
}
}
};
</script>
<style>
.container {
width: 100%;
height: 100%;
}
.swiper-content {
height: 100%; /* 根据需要调整高度 */
}
.scroll-view {
height: 100%; /* 根据需要调整高度 */
}
.list-item {
padding: 10px;
border-bottom: 1px solid #ddd;
}
</style>
在这个例子中,我们通过在scroll-view
上使用catchtouchmove
事件,并定义一个空的处理函数handleCatchTouchMove
,来阻止swiper组件捕获这个区域的触摸事件。这样,当用户在这个区域内进行上下滑动时,事件将不会被swiper捕获,而是传递给内部的scroll-view
,从而允许其进行正常的上下滚动。