在vue中swiper動態(tài)獲取數(shù)據(jù)渲染時產(chǎn)生的問題

在項目中有這樣一個需求:頂部上下輪播用戶獲獎信息

輪播里面的文字是后端返回給前端的,我直接用vue渲染,此時的需求是后端返回的數(shù)據(jù)在變更了之后應該在頁面上實時更新,但是實際情況并非如此。
所以用到了Vue原生api:Vue.nextTick(),在數(shù)據(jù)改變之后立馬在視圖里面渲染出來,但是這時還是有問題,因為"swiper-slide"這一項是vue批量生成的,這造成了swiper切換的問題。所以在js中我先停掉上一個swiper,在數(shù)據(jù)更新并且渲染在了dom中,再開啟一個swiper:

<div class="swiper-slide" v-for="item in loopInfo">
    <span>{{item}}</span>
</div>

在需要更新數(shù)據(jù)時這樣寫:

    this.lockUpSwiper();
    this.loopInfo = [];
    Vue.nextTick(function () {
        console.log('更新dom');
        // self.unlockUpSwiper();
        self.topLoop();     //DOM更新時直接開啟swiper不用解鎖上一個上了鎖的swiper,因為dom更新了,上一個swiper被干掉了
    })

其中lockUpSwiper();是我自己封裝的方法,里面就兩行代碼:

    this.topSwiper.lockSwipeToPrev();
    this.topSwiper.lockSwipeToNext();

topSwiper是swiper實例,lockSwipeToPrev()lockSwipeToNext()是swiper的api,就是字面意思:鎖住swiper不讓swiper上翻或者下翻,那么問題來了,為什么要鎖住swiper而不用解鎖呢:self.unlockUpSwiper();。在鎖住swiper后由于改變了數(shù)據(jù),實際上swiper已經(jīng)重新被定義了,這時候如果調(diào)用self.unlockUpSwiper();會導致swiper數(shù)據(jù)錯亂,簡單形容現(xiàn)象就是亂刷,具體為什么會亂刷需要看源碼中的邏輯,感興趣的大家可以看一下,這里就不深究原因啦只小小的展開一下,

錯誤圖片:

正常圖片:

從上面兩張圖可以看出出錯時同一時間有6個(甚至更多)項目在切換class,這直接導致樣式錯亂。而正常時只有4個項目在切換class。swiper是通過添加和刪除樣式來改變每一項,具體的swiper-slide所在的元素上的改變是三個class:swiper-slide-prev swiper-slide-active swiper-slide-next,分別對應上一個顯示內(nèi)容,當前顯示內(nèi)容和下一次顯示的內(nèi)容,在swiper.css中,這三個class分別是:

.swiper-slide-prev{pointer-events:auto;visibility:visible}
.swiper-slide-active{pointer-events:auto}

或者

.swiper-container-cube .swiper-slide-active{pointer-events:auto;visibility:visible}
.swiper-slide-next{pointer-events:auto;visibility:visible}

可以看到active有visiblity的狀態(tài)變化,具體需要參照.swiper-slide的樣式來看,這里也不過分展開了。

寫了一堆有的沒的,把想表達的總結(jié)一下:swiper中的切換項在改變之前應該停止siper,然后項目就為之后不需要開啟(unlockto)swiper,而重新實例化一個swiper就可以了。swiper是一款可用度非常高的插件,希望大家將使用中遇到的問題和解決辦法總結(jié)出來分享出來。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容