uni-app swiper内嵌swiper,无法滑动内部的swiper

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

uni-app swiper内嵌swiper,无法滑动内部的swiper

开发环境 版本号 项目创建方式
Windows 22000.2295 HBuilderX 3.98
示例代码:
```swift
<swiper :indicator-dots="true" :circular="true" style="height: 800rpx;" [@tap](/user/tap).stop>  
    <swiper-item v-for="(item,index) in 10" :key="index" [@tap](/user/tap).stop>  
        <view class="" style="height: 800rpx;background-color: red;" [@tap](/user/tap).stop>  
            <text style="color: white;">{{ index }}</text>  
            <swiper :indicator-dots="true" :circular="true"  style="height: 400rpx;margin-top: 100rpx;" [@tap](/user/tap).stop>  
                <swiper-item v-for="(item,index) in 3" :key="index" [@tap](/user/tap).stop>  
                    <view class="" style="height: 400rpx;background-color: blue;" [@tap](/user/tap).stop>  
                        <text style="color: white;">{{ index }}</text>  
                    </view>  
                </swiper-item>  
            </swiper>  
        </view>  
    </swiper-item>  
</swiper>

操作步骤: 见代码示例



预期结果:
内外分开滑动,像uni-app就可以。

实际结果: uni-app x不能实现滑动内部



bug描述:
如题

2 回复

uni-app 中使用 swiper 组件嵌套 swiper 时,可能会出现内部 swiper 无法滑动的情况。这通常是由于事件冒泡或手势冲突导致的。以下是一些解决方案:

1. 使用 @touchstart@touchend 事件

你可以在内部 swiper 上添加 @touchstart@touchend 事件来阻止事件冒泡,从而解决滑动冲突。

<template>
  <swiper>
    <swiper-item>
      <swiper @touchstart="handleTouchStart" @touchend="handleTouchEnd">
        <swiper-item>内部内容1</swiper-item>
        <swiper-item>内部内容2</swiper-item>
      </swiper>
    </swiper-item>
    <swiper-item>外部内容2</swiper-item>
  </swiper>
</template>

<script>
export default {
  methods: {
    handleTouchStart(e) {
      e.stopPropagation();
    },
    handleTouchEnd(e) {
      e.stopPropagation();
    }
  }
}
</script>

2. 使用 @change 事件

你可以在外部 swiper@change 事件中动态控制内部 swiper 的滑动行为。

<template>
  <swiper @change="handleSwiperChange">
    <swiper-item>
      <swiper :current="innerCurrent">
        <swiper-item>内部内容1</swiper-item>
        <swiper-item>内部内容2</swiper-item>
      </swiper>
    </swiper-item>
    <swiper-item>外部内容2</swiper-item>
  </swiper>
</template>

<script>
export default {
  data() {
    return {
      innerCurrent: 0
    };
  },
  methods: {
    handleSwiperChange(e) {
      // 根据外部 swiper 的滑动情况,动态调整内部 swiper 的 current
      this.innerCurrent = e.detail.current;
    }
  }
}
</script>

3. 使用 @touchmove 事件

你可以在内部 swiper 上添加 @touchmove 事件来阻止事件冒泡。

<template>
  <swiper>
    <swiper-item>
      <swiper @touchmove="handleTouchMove">
        <swiper-item>内部内容1</swiper-item>
        <swiper-item>内部内容2</swiper-item>
      </swiper>
    </swiper-item>
    <swiper-item>外部内容2</swiper-item>
  </swiper>
</template>

<script>
export default {
  methods: {
    handleTouchMove(e) {
      e.stopPropagation();
    }
  }
}
</script>

4. 使用 @transition 事件

你可以在外部 swiper@transition 事件中动态控制内部 swiper 的滑动行为。

<template>
  <swiper @transition="handleSwiperTransition">
    <swiper-item>
      <swiper :current="innerCurrent">
        <swiper-item>内部内容1</swiper-item>
        <swiper-item>内部内容2</swiper-item>
      </swiper>
    </swiper-item>
    <swiper-item>外部内容2</swiper-item>
  </swiper>
</template>

<script>
export default {
  data() {
    return {
      innerCurrent: 0
    };
  },
  methods: {
    handleSwiperTransition(e) {
      // 根据外部 swiper 的滑动情况,动态调整内部 swiper 的 current
      this.innerCurrent = e.detail.current;
    }
  }
}
</script>

5. 使用 [@animationfinish](/user/animationfinish) 事件

你可以在外部 swiper[@animationfinish](/user/animationfinish) 事件中动态控制内部 swiper 的滑动行为。

<template>
  <swiper [@animationfinish](/user/animationfinish)="handleSwiperAnimationFinish">
    <swiper-item>
      <swiper :current="innerCurrent">
        <swiper-item>内部内容1</swiper-item>
        <swiper-item>内部内容2</swiper-item>
      </swiper>
    </swiper-item>
    <swiper-item>外部内容2</swiper-item>
  </swiper>
</template>

<script>
export default {
  data() {
    return {
      innerCurrent: 0
    };
  },
  methods: {
    handleSwiperAnimationFinish(e) {
      // 根据外部 swiper 的滑动情况,动态调整内部 swiper 的 current
      this.innerCurrent = e.detail.current;
    }
  }
}
</script>
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!