---
# System prepended metadata

title: Vue常用指令的種類與功能、修飾符
tags: [Vue, 指令]

---

{%hackmd BJrTq20hE %}
###### tags: `Vue` `指令`
# Vue常用指令的種類與功能、修飾符

與 [Vue 指令](https://codepen.io/efzdamnp-the-lessful/pen/yLPyqba?editors=1011)一起查詢。

## 1. v-text與{{}}

### 1.1 v-text、{{}}的功能主要是顯示資料。

```htmlembedded=
<div id="app">
  <p v-text="text"></p>
  <p>{{text}}</p>
</div>
```
可以在html標籤間使用{{}}與使用指令v-text,但是要注意v-text會蓋掉html標籤間的內容。
```javascript=
const app = Vue.createApp({
  data(){
    return{text:"123"}
  },
  methods:{},
  compute:{},
  watch:{},
  mounted(){},
})
app.mount("#app")
```
## 2. v-for 

### 2.1 v-for指令的功能是把迴圈或物件的資料一一的顯示在畫面
```htmlembedded=
<div id="app">

<!- 陣列 ->
<ul>
    <li v-for="(item,index) in data1" :key="item+1">item:{{item}}/index:{{index}}</li>
  </ul>
<!- 物件 ->
  <ul>
    <li v-for="(item,key,index) in data2" :key="item+2">item:{{item}}/key:{{key}}/index:{{index}}</li>
  </ul>
<!- 純數字 ->
<ul>
    <li v-for="i in 5" >{{i}}</li>
  </ul>
<!- 元件 ->
<元件名稱 v-for="item in datas" key="item.name+1"></元件名稱>
</div>
    
```
1.在使用v-for時需要與:key="獨一無二的值"一起使用，上面的例子是使用item+1。
2.資料來源是array時能使用的自帶參數依序是item、index
3.資料來源是object時能使用的自帶參數依序是item、key、index
```javascript=
const app = Vue.createApp({
  data(){
    return{data1:['a','b','c'],
           data2:{
             first:'a',
             second:'b',
             third:'c}
  },
  methods:{},
  compute:{},
  watch:{},
  mounted(){},
})
app.mount("#app")
```

### 2.2 v-for不與key一起使用的問題
```htmlembedded=
<div id="app">
<li v-for="(item,index) in data1" >item:{{item}}/index:{{index}}
    <input type="text"></li>
  </ul>
</div>
```
1.上面的v-for沒有:key，只要沒有變動，就不會重新渲染，可以試著在[v指令範例](https://codepen.io/efzdamnp-the-lessful/pen/yLPyqba)，移除:key並在input輸入隨意的文字，按下reverse鈕，就會看到input的內容沒有隨著資料改變排序而跟著改變。
```javascript=
const app = Vue.createApp({
  data(){
    return{data1:['a','b','c'],
           data2:{
             first:'a',
             second:'b',
             third:'c}
  },
  methods:{},
  compute:{},
  watch:{},
  mounted(){},
})
app.mount("#app")

```
## 3 v-if、v-else、v-else-if

### 3.1 這個指令就是要來判斷html的節點要不要出現在畫面上
#### 3.1.1 v-if
```htmlmixed=
<div id="app">
<p v-if="isExist===true">我出現啦</p>
  <button type="button" @click="isExist=!isExist">Switch</button>
</div>
```
依據v-if="結果" 結果為true就顯示，false就不顯示
```javascript=
onst app = Vue.createApp({
data(){
    return{isExist:true}
  },
    }
app.mount("#app")
```
#### 3.1.2 v-if v-else v-else-if
```htmlmixed=
<div id="app">
<p v-if="name===小明">小明出現啦</p>
<p v-else-if="name===咚咚">咚咚出現啦</p>
<p v-else-if="name===小美">小美出現啦</p>
  <button type="button" @click="name='小明'">招喚小明</button>
    <button type="button" @click="name='咚咚'">招喚咚咚</button>
    <button type="button" @click="name='小美'">招喚小美</button>
</div>
```
只要滿足條件，也就是v-if / v-else-if 為ture時就換顯示html節點
```javascript=
onst app = Vue.createApp({
data(){
    return{name:''}
  },
    }
app.mount("#app")
```

### 3.2 v-if 與 v-for 不要一起用在同一個html標籤
v-if不推薦與v-for在同一個標籤使用。如果需要同時使用，則需要使用template這個標籤。
```htmlembedded=
<div id="app">
<ul>
    <template  v-for="i in productList">
      <li class="border" v-if="i.price>30">{{i.name}}//{{i.price}}//{{i.unit}}</li>
    </template>

</div>    
```
這邊要注意的是，需要template包住li 因為如果是li包template的情況下，會出現空白行的情況，原因是li的數量等於productList的資料數，又因為v-if的原因使templat不會被顯示，所以就只剩下空的li，如果是template包住li因為template在html不代表任何意思所以內部為空，不會渲染在畫面上。
[範例 v-if](https://codepen.io/efzdamnp-the-lessful/pen/yLPyqba?editors=1111)

```javascript=
const app = Vue.createApp({
data(){
    return{
        productList:[{
             name:"Apple",
             price:50,
             unit:"100kg"
           },{
             name:"Orange",
             price:35,
             unit:"100kg"
           },{
             name:"Watermelon",
             price:25,
             unit:"100kg"
           }]}
  },
    }
app.mount("#app")
```

### 3.3 v-if 與 v-show 的區別
v-if 與 v-show 最大的區別就在dom元素存不存在畫面上，沒有達到v-if條件的dom元素，不會存在畫面，沒有達到v-show條件會存在畫面但是是以display:none 形式存在。

### 4.1 v-bind
是屬性綁定，縮寫為:，常用於html標籤內的屬性綁定
#### 4.1.1 scr與title
用於img內的屬性與資料綁定。
```htmlembedded=
<div id='app'>
    <img :src="imgUrl" :title="titleInfo" alt="">
    </div>
```
```javascript=
const app = Vue.createApp({
data(){
    return{
    imgUrl:'https://upload.cc/i1/2021/12/09/94D8vq.jpg',
    titleInfo:"打到風之力超爽Der",
       }
  },
    }
app.mount("#app")
```
#### 4.1.2 disable
```htmlembedded=
<div id='app'>
    你的貓咪現在{{catPlaySatus? "不想玩":"想玩"}}
<button type="button" @click="changeCatStatus()">改變貓咪狀態</button>
  <select name="cat" id="cat">
    <option value="不想玩" :disabled="catPlaySatus? false:true">不想玩</option>
    <option v-for="item in catPlaythings" :key="item" value="item" :disabled="catPlaySatus">{{item}}</option>
  </select>
    </div>
```
```javascript=
const app = Vue.createApp({
data(){
    return{
        catPlaySatus:true,
      catPlaythings:["球","逗貓棒","玩偶","紙板"],
       }
  },
methods:{
    changeCatStatus(){
      this.catPlaySatus = !this.catPlaySatus
    },
}
    }
app.mount("#app")
```
#### 4.1.3 v-bind與v-for一起使用
```htmlembedded=
<div id='app'>
   <ul>
    <li  v-for="item in diableItems" :key="item"> <img class="imgSize":src="item.url" alt=""><label :for="item.name">{{item.name}}</label><input type="checkbox" :id="item.name"></li>
  </ul>
    </div>
```
```javascript=
const app = Vue.createApp({
data(){
    return{
         diableItems: [
        {
          name: "風之力",
          url: "https://upload.cc/i1/2021/12/09/94D8vq.jpg"
        },
        {
          name: "貝",
          url: "https://upload.cc/i1/2022/02/06/nMIKtu.jpg"
        },
        {
          name: "羅",
          url: "https://upload.cc/i1/2022/02/06/OuCDEF.png"
        }
      ],
       }
  },
}
    }
app.mount("#app")
```
#### 4.1.4 表達式運用-串接
```htmlembedded=
<div id='app'>
    <input v-model="inputrange" type="range" max="1500" nim="100"> {{inputrange}}
  <img :src="`${productimg}&w=${inputrange}`" alt="">
    </div>
```
```javascript=
const app = Vue.createApp({
data(){
    return{
        inputrange:200,
      productimg:"https://images.unsplash.com/photo-1600182610361-4b4d664e07b9?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&q=80",
       }
  },
    }
app.mount("#app")
```
#### 4.1.5 動態屬性綁定
```htmlembedded=
<div id='app'>
    改變狀態
  <button type="button" @click="dynamic=dynamic==='disabled'? 'readonly':'disabled'">{{dynamic}}</button>
  
 <input type="text" value="咚咚" :[dynamic] 
    </div>
```
```javascript=
const app = Vue.createApp({
data(){
    return{
        dynamic:'disabled',
       }
  },
    }
app.mount("#app")
```
#### 4.1.6 元件使用屬性綁定傳遞資料
[Vue的元件化(施工中)](https://hackmd.io/2k17WOjQQvWDb6WKvamG0A)
簡單的範例如下 :data這個用v-bind綁定的屬性可以當作是把資料傳入元件的通道而後面的"sendInToComponent"是要傳入的資料。
```htmlembedded=
<div id='app'>
<list :data="sendInToComponent"></list>
</div>
```
```javascript=
const app = Vue.createApp({
data(){
    return{
        sendInToComponent:'我是外面的資料',
       }
  },
    };
app.component('list',{
     data(){
    return{
        text:"我是元件"
    }
},
    props:["data"],
    template:`{{text}}//{{data}}`
                          });                         
app.mount("#app")
```

### 4.2 v-bind 樣式綁定
class的v-bind可以使用物件或是陣列，在物件時的key是樣式樣式名稱，value為true或false
#### 4.2.1 以物件綁定

```htmlembedded=
<div id='app'>
<div class="box" :class={blueBG:true}></div>
</div>
```

```javascript=
const app = Vue.createApp({
data(){
    return{
        
       }
  },
    };
                        
app.mount("#app")
```
下面的css在4.2.1-4.2.11以下都需要使用後面就不重複貼了。
```css=
.box{
  width: 100px;
  height: 100px;
  border: 1px solid #000;
  background: red;
  margin-bottom: 30px;
  transition:  all 1s;
}
.blueBG{
  background: blue;
}
.box-rotate{
  transform: rotate(45deg);
}

```
#### 4.2.2 以陣列綁定
```htmlembedded=
<div id='app'>
<div class="box" :class=['blueBG']></div>
</div>
```
#### 4.2.3 多種樣式寫法-物件
如果class名稱有-則在物件的key要轉為字串才不會出錯，多個樣式名稱只要以，區隔。
```htmlembedded=
<div id='app'>
<div class="box" :class={blueBG:true,'box-rotate':true}></div>
</div>
```
#### 4.2.4 多種樣式寫法-陣列
```htmlembedded=
<div id='app'>
<div class="box" :class={blueBG:true,'box-rotate':true}></div>
</div>
```
#### 4.2.5 物件寫法的樣式可以值綁定變數
true與false可以綁定變數
```htmlembedded=
<div id='app'>
<div class="box" :class={blueBG:bgBlue,'box-rotate':isRotate}></div>
  <button type="button" @click="bgBlue=!bgBlue;isRotate=!isRotate">變形</button>
</div>
```
```javascript=
const app = VuecreatApp({
    data(){
        return{
      bgBlue:true,
      isRotate:true,
        }
    },
    methods:{
        
    }
})
app.mount('#app')
```
#### 4.2.6 物件樣式寫法-2
把樣式整理到data內，注意物件內key有-需要全部轉成字串
```htmlembedded=
<div id='app'>
<div class="box" :class="boxStyle"></div>
</div>
```
```javascript=
const app = VuecreatApp({
    data(){
        return{
      boxStyle:{
        blueBG:true,
        'box-rotate':true
      }
        }
    },
    methods:{
        
    }
})
app.mount('#app')
```
#### 4.2.7 以陣列樣式寫法-2
把樣式整理到data內，注意物件內key有-需要全部轉成字串

```htmlembedded=
<div id='app'>
<div class="box" :class="boxStyleArr"></div>
</div>
```
```javascript=
const app = VuecreatApp({
    data(){
        return{
       boxStyleArr:['blueBG','box-rotate'],
        }
    },
    methods:{
        
    }
})
app.mount('#app')
```
#### 4.2.8 使用陣列改變樣式
```htmlembedded=
<div id='app'>
 <div class="box" :class="boxStyleArr2"></div>
  <button type="button" @click="addboxStyle(['blueBG','box-rotate'])">變形</button>
</div>
```
```javascript=
const app = VuecreatApp({
    data(){
        return{
      boxStyleArr2:[],
        }
    },
    methods:{
        
    }
})
app.mount('#app')
```
#### 4.2.9 行內樣式寫法-1 物件
1.v-bind的style寫法與class不同，物件的key為style的屬性，value為style的值。
2.在物件的key中如果sytle的樣式屬性有-則-後的英文改為大寫，即為駝峰式命名 例如background-color改為backgroundColor。
3.物件的value改為style的值但要寫成字串 例如blue改為'blue'
```htmlembedded=
<div id='app'>
<div class="box" :style="{backgroundColor:'green',transform:'rotate(45deg)'}"></div>
</div>
```
#### 4.2.10 行內樣式寫法-2 物件樣式寫在data
```htmlembedded=
<div id='app'>
<div class="box" :style="boxStyleObj"></div>
</div>
```
```javascript=
const app = VuecreatApp({
    data(){
        return{
      boxStyleObj:{
        backgroundColor:"green",
        transform:"rotate(45deg)"
      },
        }
    },
    methods:{
        
    }
})
app.mount('#app')
```
#### 4.2.11 行內樣式寫法-3 陣列寫法
雖然陣列寫法但是原始的style是以物件的形事寫在data內
```htmlembedded=
<div id='app'>
<div class="box" :style="[boxStyleObj2,boxStyleObj3]"></div>
</div>
```
```javascript=
const app = VuecreatApp({
    data(){
        return{
       boxStyleObj2:{
        backgroundColor:"green"
      },
      boxStyleObj3:{
        transform:"rotate(45deg)"
      }
        }
    },
    methods:{
        
    }
})
app.mount('#app')
### 5.1 v-model
v-model是html標籤與資料做雙向綁定，其中一個資料變動，另一個也會跟著變動。
```htmlembedded=
<div id='app'>
<input type="text" v-model="string">
  {{string}}
</div>
```
```javascript=
const app = Vue.createApp({
data(){
    return{
       string:"abc"}
  },
    }
app.mount("#app")
```
#### 5.1.1 v-model的checkbox單選框應用

```htmlembedded=
<div id='app'>
 <input type="checkbox" v-model="isCheck"> <label for="">點我
  </label> <p>{{isCheck ? '我被點了':'我沒被點'}}</p>   

</div>
```
```javascript=
const app = Vue.createApp({
data(){
    return{
        isCheck:true,
       }
  },
    }
app.mount("#app")
```
#### 5.1.2 v-model的checkbox單選框應用 使用true-value與false-value
```htmlembedded=
<div id='app'>
<input type="checkbox" v-model="isCheck2" true-value="我被點了" false-value="我沒被點"><label for="">點我
  </label><p>{{isCheck2}}</p>    

</div>
```
```javascript=
const app = Vue.createApp({
data(){
    return{
        isCheck2:''
       }
  },
    }
app.mount("#app")
```
#### 5.1.3 v-model的checkbox 複選應用
可以把checkbox的值透過v-model，儲存到isCheck3陣列中，這邊多選要使用陣列作為存放value的容器，如果使用''則會只存true ane false 而且全部的checkbox會一起出現被點選或不被點選的錯誤情況。
```htmlembedded=
<div id='app'>
<input type="checkbox" v-model="isCheck3" value="Apple">
  <label for="">Apple</label>
  <input type="checkbox" v-model="isCheck3" value="Lemon">
  <label for="">Lemon</label>
  <input type="checkbox" v-model="isCheck3" value="Orange">
  <label for="">Orange</label>
  {{showIsCheck3}}    

</div>
```
```javascript=
const app = Vue.createApp({
data(){
    return{
        isCheck3:[]
       }
  },
    computed:{
    showIsCheck3(){
    let result = '我選的是';
    this.isCheck3.forEach((item)=>{
       result+= `${item} `;
     })
     return result
    },
    }
    }
app.mount("#app")
```
#### 5.2.4 v-model的radio應用
因為是radio，所以與v-model雙向綁定data的資料只要使用字串。
```htmlembedded=

<div id="app">
  <input type="radio" v-model="radioAns" value="水餃"  id="水餃" name="food">
  <label for="水餃">水餃</label>
  <input type="radio" v-model="radioAns" value="蛋餅"  id="蛋餅" name="food">
  <label for="蛋餅">蛋餅</label>
  <input type="radio" v-model="radioAns" value="水煎包"  id="水煎包" name="food">
  <label for="水煎包">水煎包</label>
    {{showRadio}}
</div>
```
```javascript=

const app = Vue.createApp({
    data(){
        return{
            
        }
    },
    computed:{
      showRadio() {
      let result = "";
      if (this.radioAns === "") {
        result = "還沒選要吃甚麼";
      } else if (this.radioAns !== "") {
        result=`你選的是${this.radioAns}`;
      }
      return result;
    }
    }
})
app.mount('#app')
```

#### 5.2.5 v-model的select應用 單選

在Vue中 v-model需要寫在select標籤，才會把option的value雙向綁定，如果需要default或是預先選擇的話value可以與綁定資料相同，或是在生命週期created
時使資料v-model綁定的資料與option中的value相同。
v-for 是需要寫在option中。
```htmlembedded=
<div id='app'>
    <select  v-model="selectAns">
    <option value='' disabled selected>請選擇運送方式</option>
    <option :value="item" v-for="item in transferData" >{{item.transferWay}}</option>
  </select>
  {{showSelect}}
    
</div>

```
```javascript=

const app = Vue.creatApp({
    data(){
        return{
            selectAns: "",
      transferData: [
        { transferWay: "Land Transfer", price: 500, transferTime: "50hours" },
        { transferWay: "Air Transfer", price: 2500, transferTime: "10hours" },
        { transferWay: "Shipping", price: 85, transferTime: "150hours" }
      ]
        }
    },
    computed:{
        showSelect() {
      let result = "";
      if (this.selectAns === "") {
        result = "尚未選擇運送方式";
      } else {
        result = `你選擇的是${this.selectAns.transferWay}，價格為${this.selectAns.price}，運送時間為${this.selectAns.transferTime}`;
      }
      return result;
    }
    }
})
app.mount('#app')
```

#### 5.2.6 v-model的select應用 多選

```htmlembedded=
<div id="app">
    <select v-model="selectedPets"  multiple>
    <option  disabled >請選擇傭有的寵物</option>
    <option :value="item" v-for="item in ownPets" :key="item.type">{{item.type}}</option>
  </select>
  {{showPet}}
</div>

```
```javascript=

const app =Vue.createApp({
    data(){
        return{
            selectedPets:[],
      ownPets:[{
        type:'dog',
        num:5,
      },{
        type:'cat',
        num:4,
      },{
        type:'bird',
        num:2,
      },]
        }
    },
    computed:{
        showPet(){
      let result = '';
      if(this.selectedPets.length===0){
        result = '尚未選擇寵物類別';
      }else{
        result = '所選寵物類別為'
        this.selectedPets.forEach((item)=>{
          result += `  ${item.type}，數量為${item.num}`
        })
      }
      return result;
    }
    },
})
app.mpunt('#app')
```

### 5.2 v-model修飾符
修飾符的目的在於對v-model所雙向綁定的資料作出調整，在v-model加上.修飾符，例如v-model.lazy

#### 5.2.1 lazy
lazy修飾符是在資料change狀態時才會更新至資料中。
```htmlembedded=
<div id="app">
<input type="text" v-model.lazy="moldifier1Data">
  {{moldifier1Data}}
</div>

```
```javascript=
const app = VuecreateApp({
    data(){
        return{
            moldifier1Data:'',
        }
    }
})
app.mount('#app')
```

#### 5.2.2 number
number修飾符是把v-model資料轉為number型別的修飾符，要注意需要與type="number"一起使用才能確定輸入的資料型別為number，如果type="text"則可以輸入string這個時候所輸入的資料型別是字串。
```htmlembedded=
<div id="app">
<input type="number" v-model.number="moldifier2Data">
  {{moldifier2Data}} {{typeof moldifier2Data}}
</div>

```
```javascript=
const app = VuecreateApp({
    data(){
        return{
        moldifier2Data:0,    
        }
    }
})
app.mount('#app')
```
#### 5.2.3 trim
將資料前後空白刪除的修飾符。
```htmlembedded=
<div id="app">
<input type="text"v-model.trim="moldifier3Data" >
  {{moldifier3Data}}
</div>

```
```javascript=
const app = VuecreateApp({
    data(){
        return{
        moldifier3Data:'',    
        }
    }
})
app.mount('#app')
```
#### 5.2.4 修飾符可以一起使用-1 
number與lazy一起使用。
```htmlembedded=
<div id="app">
<input type="number" v-model.number.lazy="moldifier4Data">
  {{moldifier4Data}}
</div>

```
```javascript=
const app = VuecreateApp({
    data(){
        return{
        moldifier4Data:0,    
        }
    }
})
app.mount('#app')
```
#### 5.2.5 修飾符可以一起使用-2
trim與lazy一起使用。
```htmlembedded=
<div id="app">
<input type="text" v-model.trim.lazy="moldifier5Data">
  {{moldifier5Data}}
</div>

```
```javascript=
const app = VuecreateApp({
    data(){
        return{
        moldifier5Data:'',    
        }
    }
})
app.mount('#app')
```

### 6.1 v-on
v-on就是以事件(滑鼠事件/或是鍵盤事件/DOM事件等..)與方法綁定，並控制資料或畫面。
v-on可以縮寫為@
##### 6.1.1 click
```htmlembedded=
<div id="app">
<div class="box" :class="{blueBG:bgBlue,'box-rotate':isRotate}"></div>
</div>

```
本css在6.1.2也會用到。
```css=
.box{
  width: 100px;
  height: 100px;
  border: 1px solid #000;
  background: red;
  margin-bottom: 30px;
  transition:  all 1s;
}
.blueBG{
  background: blue;
}
.box-rotate{
  transform: rotate(45deg);
}

```
```javascript=
const app = VuecreateApp({
    data(){
        return{
            bgBlue:true,
            isRotate:true,
        }
    }
})
app.mount('#app')
```
##### 6.1.2 帶入參數
```htmlembedded=
<div id="app">
<div class="box" :class="{blueBG:bgBlue,'box-rotate':isRotate}"></div>
<button type="button" @click="change(isRotate,bgBlue)">change</button>
</div>

```
```javascript=
const app = VuecreateApp({
    data(){
        return{
            
        }
    }
})
app.mount('#app')
```
##### 6.1.3 DOM原生事件-change
change要input內容有改變才會觸發
```htmlembedded=
<div id="app">
<input type="text" @change="showChangeEvent()">
</div>

```
```javascript=
const app = VuecreateApp({
    data(){
        return{
            
        }
    },
    methods:{
        showChangeEvent(){
      alert('觸發change')
    },
    }
})
app.mount('#app')
```
##### 6.1.3 DOM原生事件-submit
submit功能可以不用透過click觸發提交表單，要注意要加prvent這個修飾符是因為不觸發原生post標單功能，而是觸發自己寫的submitForm()
```htmlembedded=
<div id="app">
<form action="" @submit.prevent="submitForm()">
    <input type="text"><button>點我</button>
</form>
</div>

```
```javascript=
const app = VuecreateApp({
    data(){
        return{
            
        }
    },
    methods:{
        submitForm(){
      alert('標單已提交')
    },
    }
})
app.mount('#app')
```
##### 6.1.4 動態事件 陣列

```htmlembedded=
<select name="" id="" v-model="event">
    <option value="click">click</option>
    <option value="change">change</option>
  </select>
  
  <input type="text" @[event]="showEvent()">

```
```javascript=
const app = VuecreateApp({
    data(){
        return{
        event:"click"    
        }
    },
    methods:{
        showEvent(){
      alert(`現在事件是${this.event}`)
    },
    }
})
app.mount('#app')
```
##### 6.1.5 動態事件 物件
用物件帶入的方法無法傳入參數，如果參數會出錯，所帶入的方法會無法執行
```htmlembedded=
<div id="app">
<button class="box" @="{
       mousedown:down,
       mouseup:up
       }"></button>
</div>

```
```javascript=
const app = VuecreateApp({
    data(){
        return{
            
        }
    },
    methods:{
    down(){
      console.log("mousedown")
    },
    up(){
      console.log("mouseup")
    }
    }
})
app.mount('#app')
```
### 6.2 v-on修飾符
v-on修飾符分為三大類，鍵盤修飾符、滑鼠修飾符、事件修飾符。
簡單的來說就是在v-on:事件加上.修飾符；例如@keyup.enter="方法" 就是在input改變資料後需要按下enter鍵才會觸發方法。
#### 6.2.1 鍵盤修飾符
別名修飾符.enter, .tab, .delete, .esc, .space, .up, .down, .left, .right

```htmlembedded=
<div id="app">
    別名修飾符
    <input type="text" v-model="vonModifiers" @keyup.enter="active('enter別名修飾符')">
    相應鍵修飾符
    可以另外加上.ctrl, .alt, .shift, .meta與別名修飾符組合成相應件修飾符
    <input type="text" v-model="vonModifiers" @keyup.enter.ctrl="active('相應鍵修飾符')" >
    特定案件修飾符
    <input type="text" v-model="vonModifiers" @keyup.a="active('特定鍵修飾符')">
</div>
```
javascript會在 6.2.1-6.2.3之後都會使用，就不重複貼上。
```javascript=
const app =Vue.creatApp({
    data(){
        return{
            
        }
    },
    methods:{
      active(data){
      console.log(`${data}觸發了`)
    },  
    }
})
```
#### 6.2.2 滑鼠修飾符
```htmlembedded=
<div id="app">
 <button style="width:50px; height:50px; border:1px solid black; background:red" @click.right="active('right滑鼠修飾符')"></button>
</div>
```

#### 6.2.3 事件修飾符
1.  .stop - 調用 event.stopPropagation()
2.  .prevent - 調用 event.preventDefault() 常使用的修飾符
3.  .capture - 添加事件偵聽器時使用 capture 模式
4.  .self - 只當事件是從偵聽器綁定的元素本身觸發時才觸發回調。
5.  .once - 只觸發一次回調。
     
```htmlembedded=
<div id="app">
  冒泡事件
  <div style="height:100px; width:300px;background:green;display:flex; align-items:center" @click="active('div')">
    <div class="box" style="height:75px;width:75px; margin:0 auto; background:blue; display:flex; justify-content:center; align-items:center" @click="active('box')">
      <button @click="active('button')">click</button>
    </div>
  </div>
  stop修飾符
  防止向外尋找，範例把stop修飾符放在box上，點擊button後只會出發到box而已，最外層的div不會觸發
  <div style="height:100px; width:300px;background:green;display:flex; align-items:center" @click="active('div')">
    <div class="box" style="height:75px;width:75px; margin:0 auto; background:blue; display:flex; justify-content:center; align-items:center" @click.stop="active('box')">
      <button @click="active('button')">click</button>
    </div>
  </div>
  capture修飾符
  capture是由外而內查找，原本預設為由內而外。
  <div style="height:100px; width:300px;background:green;display:flex; align-items:center" @click.capture="active('div')">
    <div class="box" style="height:75px;width:75px; margin:0 auto; background:blue; display:flex; justify-content:center; align-items:center" @click.capture="active('box')">
      <button @click.capture="active('button')">click</button>
    </div>
  </div>
  self修飾符
  只會觸發自己。
  <div style="height:100px; width:300px;background:green;display:flex; align-items:center" @click.self="active('div')">
    <div class="box" style="height:75px;width:75px; margin:0 auto; background:blue; display:flex; justify-content:center; align-items:center" @click.self="active('box')">
      <button @click.self="active('button')">click</button>
    </div>
  </div>
  
  once修飾符
只會觸發一次的修飾符，可以與self capture stop修飾符一起使用。
  <div style="height:100px; width:300px;background:green;display:flex; align-items:center" @click.self.once="active('div')">
    <div class="box" style="height:75px;width:75px; margin:0 auto; background:blue; display:flex; justify-content:center; align-items:center" @click.self.once="active('box')">
      <button @click.self.once="active('button')">click</button>
    </div>
  </div>
</div>
```
#### 6.2.4 v-on DOM事件補充

```htmlembedded=
<div id="app">
  沒有參數時
  沒有參數時會，所綁定的方法會預設event
  <button type="button" value="你點到我了" @click="buttonActive">click</button>
  有參數時
  有參數時，需要增加$event作為事件參數
  <button type="button" value="你點到我了" @click="buttonActive2('我是參數',$event)">click</button>
  取得input數值(不靠v-model)
  <input type="text" @keyup="showInputInfo" >
  按鍵監聽事件
  <input type="text" @keyup="showKeyCode" >
</div>
```

```javascript=
const app =Vue.creatApp({
    data(){
        return{
        }
    },
    methods:{
     buttonActive(e){
      console.log(e.target.value)
    },
    buttonActive2(parameter,e){
    console.log(parameter,e.target.value)
    },
    showInputInfo(e){
      console.log(e.target.value)
    },
    showKeyCode(e){
      console.log(e.keyCode)
    },             
  
    }
})
```