1. 程式人生 > 程式設計 >vue+swiper實現左右滑動的測試題功能

vue+swiper實現左右滑動的測試題功能

最近在做一個測試題,前後可以切換題目,點選按鈕選擇答案,選擇答案的同時改變按鈕的背景色,如下圖所示:

vue+swiper實現左右滑動的測試題功能

初始程式碼

我用了vue和swiper。所有的題目是一個物件陣列,通過v-for渲染:

<swiper ref="mySwiper" :options="swiperOptions">
 <swiper-slide v-for="(item,index) in listData" :key="index">
  <div class="question-box">
   <div class="idx">- 第{{ index+1 }}題 -</div>
   <div class="question">{{ item.question }}</div>
  </div>
  <button @click="goNext(index,'a')" :class="item.answer=='a' ? 'active': ''">是</button>
  <button @click="goNext(index,'b')" :class="item.answer=='b' ? 'active': ''">否</button>
 </swiper-slide>
</swiper>

一開始我把每道題目的answer存放在物件裡面,點選的按鈕時候切換answer的值,button的動態class監聽到值改變後會引發背景色的改變。js部分:

goNext(index,answer) {
 this.$set(this.listData[index],'answer',answer)
 this.swiper.slideNext(100)
},

發現問題

測試發現這樣把點選事件和動態樣式互相依賴,會造成大概幾百毫秒的延遲才執行slideNext(),是可以直觀感受到的延遲。通過除錯,發現造成延遲有兩方面的原因:

  • this.$set 更改陣列
  • 執行完點選事件動態class監聽到資料的改變
    中間也有延遲。

於是我換了一個思路,不把每個題目的answer放在對像數組裡面,而是在data裡面定義一個answerMap,這樣解決了問題1。為了解決問題2,我選擇把動態樣式 :class 去掉,改成用原生js在點選事件裡面直接修改class。這樣兩步下來,確實看不到延遲了。

優化後的程式碼

html部分

<button @click="goNext($event,index,'a')">是</button>
<button @click="goNext($event,'b')">否</button>

js部分

goNext(e,answer) {
 const element = e.target
 const bro = element.parentNode.children
 for (let i = 0; i < bro.length; i++) {
  if (bro[i] !== element) {
   bro[i].classList.remove("active")
  }
 }
 element.classList.add('active')
 this.answerMap[this.listData[index].question] = answer
 this.swiper.slideNext(100)
},

測試結果:可喜可賀,slideNext()不再有肉眼可見的延遲了。

有的時候為了少寫點程式碼,不知不覺犧牲了效能。這次實踐,雖然原生JS使我增加了好幾行程式碼,但是帶來的效能提升也是非常明顯的。經過這次優化,我覺得如果對Vue原始碼理解透徹的人,大概是能馬上知道優化點。我雖然看過一遍原始碼,但還是理解不夠深入。需要學習的還有很多呀~

到此這篇關於vue+swiper實現左右滑動的測試題功能的文章就介紹到這了,更多相關vue左右滑動內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!