记一次Vue3中使用vue-awesome-swiper遇到的坑

记一次Vue3中使用vue-awesome-swiper遇到的坑

在最近的Vue2组件切换到Vue3时,发现了 vue-awesome-swiper版本V5.0.1 的一处坑。记录一下,希望对大家有所帮助。

问题现象

<template>
	...
	<swiper
	  class="swiper"
	  :activeIndex="state.activePosterIndex"
	  :options="state.swiperOptions"
	  @slide-change="handlePosterChange"
	  ref="mySwiperRef"
	>
	  <swiper-slide v-for="(item, index) in state.detailItemCodesList" :key="index">
	    <div class="swiper-item">
	      <a-image style="width: 300px; height: 300px" :src="item.previewUrl" />
	    </div>
	  </swiper-slide>
	</swiper>
	<div
	 v-for="(item, index) in state.detailItemCodesList"
	  :key="index"
	  :class="['poster', state.activePosterIndex === index ? 'active' : '']"
	  @click="handlePosterClick(index)"
	>
	  <img style="width: 120px; height: 120px" fit="fill" :src="item.previewUrl" />
	  <div class="poster-code">{{ item.itemCode }}</div>
	</div>
	...
</template>
<script setup lang="ts">
  	import { Swiper, SwiperSlide } from 'vue-awesome-swiper'
	import type { Swiper as SwiperClass } from 'swiper/types'
	const mySwiperRef = ref<SwiperClass>()
	// 监听封面图点击
	const handlePosterClick = (index) => {
	  state.activePosterIndex = index
	  console.log('mySwiperRef.value---', mySwiperRef.value)
	  mySwiperRef.value.slideTo(state.activePosterIndex, 500, false)
	}
</script>

主要逻辑是这样的:

  1. 顶部一个Swiper组件,下面一个缩略图;
  2. 滑动Swiper切换缩略图的选中状态;
  3. 选中不同缩略图切换到对应Swiper下标。

但是在点击缩略图切换Swiper下标时一直提示slideTo未定义 ,打印mySwiperRef.value也确实发现里面没有slideTo方法。后来查看文档(https://swiperjs.com/swiper-api)确实是有此方法,再多次搜索相关文章,终于在别人的示例代码中查到了蛛丝马迹:在标签上不需要使用refmySwiperRef.value的赋值需要在swiper回调中,更改后的代码如下:

<template>
	...
	<swiper
	  class="swiper"
	  :activeIndex="state.activePosterIndex"
	  :options="state.swiperOptions"
	  @slide-change="handlePosterChange"
-	  ref="mySwiperRef"
+	  @swiper="onSwiper"
	>
	  <swiper-slide v-for="(item, index) in state.detailItemCodesList" :key="index">
	    <div class="swiper-item">
	      <a-image style="width: 300px; height: 300px" :src="item.previewUrl" />
	    </div>
	  </swiper-slide>
	</swiper>
	<div
	 v-for="(item, index) in state.detailItemCodesList"
	  :key="index"
	  :class="['poster', state.activePosterIndex === index ? 'active' : '']"
	  @click="handlePosterClick(index)"
	>
	  <img style="width: 120px; height: 120px" fit="fill" :src="item.previewUrl" />
	  <div class="poster-code">{{ item.itemCode }}</div>
	</div>
	...
</template>
<script setup lang="ts">
  	import { Swiper, SwiperSlide } from 'vue-awesome-swiper'
	import type { Swiper as SwiperClass } from 'swiper/types'
	const mySwiperRef = ref<SwiperClass>()
+	const onSwiper = (swiper: SwiperClass) => {
+	  mySwiperRef.value = swiper
+	  console.log('mySwiperRef.value---', mySwiperRef.value)
+	}
	// 监听封面图点击
	const handlePosterClick = (index) => {
	  state.activePosterIndex = index
	  console.log('mySwiperRef.value---', mySwiperRef.value)
	  mySwiperRef.value.slideTo(state.activePosterIndex, 500, false)
	}
</script>
要在Vue 3项目中使用vue-awesome-swiper组件,首先需要确保已经安装了vue-awesome-swiper。你可以使用以下命令使用npm进行安装: ``` npm install vue-awesome-swiper --save ``` 安装完成后,在需要使用切换的界面中引入该组件,可以在组件文件中添加以下代码: ```javascript import { Swiper, SwiperSlide } from &#39;vue-awesome-swiper&#39; import &#39;swiper/dist/css/swiper.css&#39; export default { components: { Swiper, SwiperSlide }, data() { return { swiperOptions: { pagination: { el: &#39;.swiper-pagination&#39;, clickable: true }, loop: true, autoplay: { disableOnInteraction: false } } } }, methods: {} } ``` 这段代码会导入SwiperSwiperSlide组件,并将样式文件引入。然后,你可以在模板中使用SwiperSwiperSlide组件来创建轮播图。在template标签中,你可以添加以下代码来创建一个基本的轮播图: ```html <template> <Swiper :options="swiperOptions"> <SwiperSlide> Slide 1 </SwiperSlide> <SwiperSlide> Slide 2 </SwiperSlide> <SwiperSlide> Slide 3 </SwiperSlide> </Swiper> </template> ``` 这样就可以在Vue 3项目中使用vue-awesome-swiper组件了。得在组件中根据具体的需求修改swiperOptions来定制你的轮播图。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [vue-awesome-swipervue 项目中的使用](https://blog.csdn.net/m0_45925246/article/details/123731035)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [vue轮播图插件vue-awesome-swiper](https://download.csdn.net/download/weixin_38727087/13201307)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值