uni-app 原生的swiper组件不好用 能不能自己实现一个 抖音快手微信小程序能用就行

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

uni-app 原生的swiper组件不好用 能不能自己实现一个 抖音快手微信小程序能用就行

5 回复

插件市场挺多swiper插件的 都不符合你的要求?


都是一些做banner用的,没找到合适的

先收藏一波,非常感谢

当然可以,自己实现一个自定义的swiper组件来满足特定需求是可行的。以下是一个简化的自定义swiper组件实现示例,该组件能够在uni-app中使用,并且可以在抖音、快手、微信小程序等平台上运行。

首先,我们需要创建一个自定义组件MySwiper.vue

<template>
  <view class="swiper-container" :style="{ width: containerWidth + 'px', height: containerHeight + 'px' }">
    <view class="swiper-wrapper" :style="wrapperStyle">
      <view
        v-for="(item, index) in items"
        :key="index"
        class="swiper-slide"
        :style="{ transform: `translateX(-${currentIndex * 100}%)` }"
      >
        <slot :name="'slide' + index" :data="item"></slot>
      </view>
      <!-- Clone nodes for infinite loop -->
      <view
        v-for="(item, index) in items"
        :key="'clone-' + index"
        class="swiper-slide"
        :style="{ transform: `translateX(-${(currentIndex + items.length) * 100}%)` }"
      >
        <slot :name="'slide' + index" :data="item"></slot>
      </view>
    </view>
  </view>
</template>

<script>
export default {
  props: {
    items: Array,
    containerWidth: {
      type: Number,
      default: 375,
    },
    containerHeight: {
      type: Number,
      default: 200,
    },
  },
  data() {
    return {
      currentIndex: 0,
    };
  },
  computed: {
    wrapperStyle() {
      return {
        width: `${this.items.length * 2 * this.containerWidth}px`,
      };
    },
  },
  methods: {
    // Add methods to handle swipe logic, e.g., touch events
  },
};
</script>

<style scoped>
.swiper-container {
  overflow: hidden;
  position: relative;
}
.swiper-wrapper {
  display: flex;
  transition: transform 0.3s ease-in-out;
}
.swiper-slide {
  flex-shrink: 0;
  width: 100%;
  height: 100%;
}
</style>

在这个组件中,我们简化了swiper的实现,只展示了基本的结构和样式。要实现完整的swiper功能,你需要添加触摸事件监听来处理滑动逻辑。这可以通过监听touchstarttouchmovetouchend事件来实现,并相应地更新currentIndex

使用这个组件时,你可以在父组件中这样引用:

<template>
  <MySwiper :items="swiperItems" :containerWidth="375" :containerHeight="200">
    <template v-slot:slide0="{ item }">
      <view>{{ item }}</view>
    </template>
    <template v-slot:slide1="{ item }">
      <view>{{ item }}</view>
    </template>
    <!-- Add more slots as needed -->
  </MySwiper>
</template>

<script>
import MySwiper from '@/components/MySwiper.vue';

export default {
  components: {
    MySwiper,
  },
  data() {
    return {
      swiperItems: ['Slide 1', 'Slide 2'],
    };
  },
};
</script>

这个示例提供了一个基础框架,你可以根据实际需求进一步完善和优化。

回到顶部