# Day 02 Vue slider 輪播 ###### tags: `Vue` 延續上一個章節 [Day 01 jQuery vs Vue 使用兩者render畫面](https://hackmd.io/-4RldgsPRli09svhhKsumw?both)延伸,做一個切換輪播帶連結功能,連結所有開發小實做 ![](https://i.imgur.com/5yaWjMt.jpg) ### 1.html把左右arrow 和文字title顯示畫面畫出來 css部分比較冗長下面附上jsfiddle.再點進去看 ``` <div id="app"> <section class="container"> <div class="title"> <h1>{{title}}</h1> </div> <img class="logo" v-bind:src="src"> <div class="descrition"> <a class="fas fa-arrow-circle-left fa-2x arrow-left" ></a> <div class="menuItem"> <span class="number"></span> <span class="type"></span> <a class="class-title" ></a> </div> <a class="fas fa-arrow-circle-right fa-2x arrow-right" ></a> </div> </section> </div> ``` ### 2.data 綁入章節編號和所有章節data 章節序號為index , 起始為0 (0等於javascript 的第一個),將帶入章節物件命名menu , 並依序代入編號 , 章節分類 ,章節名稱等資料. Ps:也是menu array序列 [indexOf()](https://www.fooish.com/javascript/array/indexOf.html) ``` let data = { src: './img/pngegg.png', title: 'Vue level Up ', index: 0, menu: [ { type: '開發小實作', title: 'Day 01 jQuery vs Vue ', link: '' }, { type: '開發小實作', title: 'Day 02 Vue slider ', link: '' }, { type: '開發小實作', title: 'Day 03 Vue bind data to form ', link: '' }, ] } ``` ### 3.把資料綁到畫面上 #### 3.1綁上編號 編號的命名為index , index起始是0 ,但是第一筆是1 ,所以要 **index + 1** ` <span class="number">{{index + 1}}</span>` #### 3.2綁上章節分類 menu[index]為序列.type帶出章節分類資料 ` <span class="type">{{menu[index].type}}</span>` #### 3.3綁上章節名稱和url 綁上url部分使用**v-bind:href=""** , 標題章節 使用{{data}]方式綁定 , 所以是 ` <a class="class-title" target="vue-item" v-bind:href="menu[index].link">{{menu[index].title}}</a>` *參考網路資訊* [[ Vue.js 手牽手,一起嗑光全家桶 ] 開胃餐點 - 中式資料綁定佐無毒 jQuery 畫面處理](https://www.youtube.com/watch?v=68ItsYcqjHI&list=PLEfh-m_KG4dYor8h4Hi2lqKJ0xqNTFh16&index=4) *講師個人頻道資料很豐富,情況允許大家多多看完影片廣告,和每個月訂閱扣款donate,當做請講師喝杯咖啡犒賞辛苦無私 * ### 4.綁定畫面上一頁 & 下一頁資料 使用click觸發 <kbd>v-on:click=""</kbd> ,function名稱這邊命名為changeIndex,左邊頁數表達<kbd>-1</kbd>,右邊增加頁數<kbd>+1</kbd> ``` <a class="fas fa-arrow-circle-left fa-2x arrow-left" v-on:click="changeIndex(-1)"></a> <a class="fas fa-arrow-circle-right fa-2x arrow-right" v-on:click="changeIndex(+1)"></a> ``` ### 但純左右切換 在<kbd>data</kbd>下面新增<kbd>methods</kbd>,寫入<kbd>changeIndex</kbd>function . ``` methods: { changeIndex: function (change) { this.index += change } ``` 這樣即可執行左右切換,但是會有一個問題,可以無止盡往左/右切換,打開chorm vue開發工具可以發現index可能是負值,而要切換回來必須多按加回正值才能往右切換,為了避免這種狀況發生,必須控制index數字最小值和最大值. ![](https://i.imgur.com/OweXIut.jpg) ### 控制index value最大值/最小值 使用<kbd>if</kbd>,<kbd>else if</kbd> ``` methods: { changeIndex: function (change) { this.index += change if (this.index < 0 ){ this.index = 0 } else if (this.index > this.menu.length - 1){ this.index = this.menu.length - 1 } } ``` index小於0時 , index = 0 , index大於最長長度時 , index = 最長長度.因為index起始是0 , 所以最長長度使用 <kbd>this.menu.length - 1</kbd> . 但是這種作法無法輪播,為了使用者方便,我們希望往右+1,或往左-1到底時,跳回第一個/最後一個再次循環. 輪播概念使用到數學的餘數. ### 使用數學餘數概念來做輪播效果 數學裡,**任何數字只要大於除數**,除3,餘數一定等於0,1,2不會超過3 ,除4 ,餘數為0,1,2,3之一,除5,餘數為1,2,3,4,以此類推假設除29,餘數一定等於0~28共29個,所以我們可以使用餘數來控制循環輪播. 而因為<knd>change</knd>有+1 ,也有-1 ,如果是第一張 1 ,(-1)為負數 ,負數除任何數都是負數,所以我們要做一點處理確保他一定是大於0. ``` methods: { changeIndex: function (change) { this.index = (this.index + change + this.menu.length) % this.menu.length } } ``` 以上程式碼意思為 index編號(餘數) = (this.index +- 1 +長度 ) / 長度 舉例我們有30張,編號為0~29 , 長度30 ,如果是第一張編號 0 ,往左click會是-1 ,實際上是要掉到編號29 *數字可以除比自己大的數字,只是商數為0 ,餘數 = 本身 ,請用[商餘數計算機](https://miniwebtool.com/zh-tw/quotient-and-remainder-calculator/)試算 #### 第一張照片往左切換 <kbd>this.index = 0 </kbd> ``` (0-1+30)/30 = 商數0 ,餘數 29 ,跳到最後一張照片 ``` #### 最後一張照片往右切換 <kbd>this.index = 29 </kbd> `(29+1+30)/30 = 商數2 ,餘數 0 ,跳到第一張照片` ### 優化重複性程式 <kbd>this.menu.length)</kbd>在畫面中出現兩次,而長度較長情況下影響干擾視覺,所以我們使用代數<kbd>longer</kbd>來優化 , <kbd> let longer = this.menu.length</kbd> methods: { changeIndex: function (change) { let longer = this.menu.length this.index = (this.index + change + longer) % longer } } }) [Vue循環輪播原始碼參考](https://jsfiddle.net/Harrmonia/g8sqhea6/5/) ### 第一張照片-左邊按鈕關起 , 最後一張照片 - 最右邊按鈕關起 如果不喜歡循環輪播方式,另一種是第一張照片-左邊按鈕關起 , 最後一張照片 - 最右邊按鈕關起. 使用<kbd>v-if</kbd> #### 第一章照片-最左邊按鈕關起 * 如果是編號0就藏起來 * 如果不是編號0就秀出來 以上兩者意思一樣, 在這裡使用*如果不是編號0就秀出來* `index != 0 v-if="index != 0" ` #### 最後一張照片 - 最右邊按鈕關起 * 如果是編號最後一碼就藏起來 * 如果編號不是最後一碼就秀出來 以上兩者意思一樣, 在這裡使用`如果編號不是最後一碼就秀出來` ``` index != this.menu.length - 1 //因為第一個是0 ,所以計算正確長度要 -1 v-if="index != this.menu.length-1" ``` ![](https://i.imgur.com/Sphn94C.jpg) <kbd>v-if</kbd>這邊作法是,在html把它註解掉 ![](https://i.imgur.com/NS4n6tr.jpg) [第一張照片-左邊按鈕關起 , 最後一張照片 - 最右邊按鈕關起原始碼](https://jsfiddle.net/Harrmonia/wsz40mj6/3/)