vue中swiper開啟loop后,點擊事件不響應的解決方案
swiper開啟loop后,點擊事件不響應
接手離職同事的項目,然后發(fā)現(xiàn)banner圖翻頁后會出現(xiàn)點擊事件不響應,于是修改,網(wǎng)上找了很多方法都無法實現(xiàn)
問題代碼如下
?? ?<swiper v-if="bannerArr.length>0" class="home-swper" ref="mySwiper" :options="swiperOptions"> ?? ??? ??? ??? ?<swiper-slide ?? ??? ??? ??? ??? ?v-for="(list,inx) in bannerArr" ?? ??? ??? ??? ??? ?:key="inx"> ?? ??? ??? ??? ??? ?<img class="banner-img" @click="videoPlay(list)" :src="list.bannerPhotoPath" alt=""> ?? ??? ??? ??? ?</swiper-slide> ? ?? ??? ??? ??? ?<div class="swiper-pagination" slot="pagination"></div> ?? ??? ??? ?</swiper>
data()中的swiperOptions配置如下
swiperOptions: { ?? ??? ??? ??? ?pagination: { ?? ??? ??? ??? ??? ?el: '.swiper-pagination' ?? ??? ??? ??? ?}, ?? ??? ??? ??? ?loop: true, ?? ??? ??? ??? ?autoplay: 5000, ?? ??? ??? ??? ?speed: 950, ?? ??? ??? ??? ?observer: true, ?? ??? ??? ??? ?// 修改swiper自己或子元素時,自動初始化swiper ?? ??? ??? ??? ?observeParents: true ?? ??? ??? ??? ?// Some Swiper option/callback... ?? ??? ??? ?},
loop配置項設置為true后,swiper 會將數(shù)組中的banner多復制出來兩張,分別是第一張和最后一張,這樣輪播起來才會流暢,但是復制的時候值復制了圖片內容 并沒有吧點擊事件復制了,所以會出現(xiàn)點擊事件不起效的現(xiàn)象.
例如:
輪播圖原本是3張[a,b,c] 但是執(zhí)行的時候是5張[c1,a,b,c,a1]
最終找到了一個解決辦法 使用@click-slide 但@click-slide 只能在swiper標簽上使用,所以點擊事件不能直接傳值 只能一同修改.
<swiper v-if="bannerArr.length>0" class="home-swper" ref="mySwiper" :options="swiperOptions" @click-slide="videoPlay"> ?? ??? ??? ??? ?<swiper-slide ?? ??? ??? ??? ??? ?v-for="(list,inx) in bannerArr" ?? ??? ??? ??? ??? ?:key="inx"> ?? ??? ??? ??? ??? ?<img class="banner-img" :src="list.bannerPhotoPath" alt=""> ?? ??? ??? ??? ?</swiper-slide> ?? ??? ??? ??? ?<div class="swiper-pagination" slot="pagination"></div> ?? ??? ??? ?</swiper>
@click-slide 在swiper標簽上,就無法直接渠道v-for循環(huán)時的直接取的值了,但@click-slide傳的參數(shù)有序列,遂點擊方法中只能通過對比數(shù)組中的索引號來進行取值
videoPlay(list){ ?? ??? ??? ?//將點擊時獲取的的banner圖的序列號轉為數(shù)組的索引值 ?? ??? ??? ?let inx = list-1 ?? ??? ??? ?//當序列號是0的時候判為數(shù)組的最后一位 ?? ??? ??? ?if(list == 0 ){ ?? ??? ??? ??? ?inx = this.bannerArr.length-1 ?? ??? ??? ?//當序列號是大于數(shù)組1的時候判為數(shù)組的第一位 ?? ??? ??? ?}else if(list == this.bannerArr.length+1){ ?? ??? ??? ??? ?inx = 0 ?? ??? ??? ?} ?? ??? ??? ?//取數(shù)組中的值 ?? ??? ??? ?let i = this.bannerArr[inx] ? ? ? ? ? ? console.log(i) ? ? ? ? }
前面說到
輪播圖原本是3張[a,b,c] 但是執(zhí)行的時候是5張[c1,a,b,c,a1]
所以這個輪播圖的索引就變成了 [c1,a,b,c,a1] ==> [0 1 2 3 4 ] 5個數(shù) 未判斷前能正常點擊的只有 序列123 而復制出來的0和4則無法點擊 ,而0是c圖 4則是a圖 需要走上方判斷.
swiper設置loop:true時點擊事件失效
項目中使用 swiper 時,設置 loop:true時,slides前后會clone若干個slide,從而形成一個環(huán)路,但是卻不會復制綁定在dom上的click事件,導致復制的slides點擊不會跳轉。
解決
不要將click事件綁定在dom上,而是在放在 on() 回調函數(shù)中調用。
代碼如下:
<div class="swiper-father swiper-hot"> ? ? <swiper :options="swiperOption" ref="mySwiper" v-if="homeData5"> ? ? <!-- slides --> ? ? ? ? ?<swiper-slide ? ? ? ? ? ? ? v-for='(item,index) in homeData[5]' ? ? ? ? ? ? :key="index">? ? ? ? ? ? ? <!-- @click="goInto(item.id)" --> ? ? ? ? ? ? <img :src="item.imgUrl" :data-itemid="item.id"> ? ? ? ? </swiper-slide> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? </swiper> ? ? <div class="swiper-button-prev btn-swiper swiper-button" ?slot="button-prev"></div> ? ? <div class="swiper-button-next btn-swiper swiper-button" slot="button-next"></div> </div> ? ?
data部分:
swiperOption: { slidesPerView: 3, centeredSlides:true, loop:true, observer:true, observeParents:true, // 當Swiper的父元素變化時,會更新swiper navigation: { nextEl: '.swiper-button-next', prevEl: '.swiper-button-prev' }, on:{ transitionStart(){ // 開始translate之前觸發(fā) // 如果是第一張 if(this.activeIndex == 0){ this.setTranslate(0); // 設置位移為0 } }, click(e) { // 使用e.target事件代理獲取點擊的元素,通過data語法獲取元素的屬性值 let url = e.target.dataset.itemid; // 這里的this指向輪播,所以我在外邊聲明了_this用來代表vue實例 _this.goInto(url); // 跳轉到詳情頁 } } },
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
5個可以加速開發(fā)的VueUse函數(shù)庫(小結)
VueUse為Vue開發(fā)人員提供了大量適用于Vue2和Vue3的基本Composition API 實用程序函數(shù)。具有一定的參考價值,感興趣的可以了解一下2021-11-11vue實現(xiàn)在線預覽pdf文件和下載(pdf.js)
這篇文章主要為大家詳細介紹了vue實現(xiàn)在線預覽pdf文件和下載,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-11-11vue自定v-model實現(xiàn)表單數(shù)據(jù)雙向綁定問題
vue.js的一大功能便是實現(xiàn)數(shù)據(jù)的雙向綁定。這篇文章主要介紹了vue自定v-model實現(xiàn) 表單數(shù)據(jù)雙向綁定的相關知識,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-09-09