---
# System prepended metadata

title: Day 02 Vue slider 輪播
tags: [Vue]

---

# 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/)

