--- title: Vue 3 與指令 tags: 六角學院, Vue 3 新手夏令營 date: 2021/8/2 --- ###### tags: `六角學院` `Vue 3 新手夏令營` ###### *date: 2021/8/2* [![hackmd-github-sync-badge](https://hackmd.io/O8xSWPUHR1KoxiDBXiN15g/badge)](https://hackmd.io/@JohnsonMao/Front-end/%2FSLONN50fSdqVPt7D5gOf7A) # ⛺ Vue 3 與指令 [![week2](https://i.imgur.com/Xd2g377.png)](https://johnsonmao.github.io/summer-camp-vue3/week2/) *第二週作業展示,運用了 Vue 進階指令與 localStrage,同時也自我挑戰運用了鍵盤監聽,只使用鍵盤就能操控計算機功能,點擊圖片可察看成果* [TOC] ## 課堂重點 - 可以用修飾符取得自己想要的資料型態。 - 用`v-for`時,必須填入`key`,不然資料無法綁定。 - 用`:class`時,當判斷式為`true`時,會代入`class`。 ## 課堂範例 ### v-model 修飾符 - `.number`:限制只有數值型別的資料才能寫入 `v-model` 預設是字串型別 ```HTML <div id="app"> <input type="text" v-model.number="number" > {{ number }} <!-- 顯示數字 --> {{ typeof( number ) }} <!-- 顯示 Number --> <input type="text" v-model="number" > {{ number }} <!-- 顯示數字 --> {{ typeof( number ) }} <!-- 顯示 String --> </div> ``` - `trim()`:去除字串前後多於的空白 ```HTML const text = ' 六角學院 Vue 3 夏令營 ' console.log( text.trim() ) // 顯示'六角學院 Vue 3 夏令營' ``` ### v-on:事件觸發器 - 最常用:`.prevent`(去除預設事件) ### v-bind - 縮寫:`:` ### v-for - ==key 唯一且必填== - 當 input 輸入內容後,按下反轉陣列時: 1. 如果沒有`key`時,則`input`位置不會被同時更動 2. 當有加上`key`時,`input`位置會與原本的資料內容位置一起變動 ![key](https://i.imgur.com/Gbdl20j.gif) ```HTML <div id="app"> <h4>缺少 key</h4> <ul> <li v-for="( item, key ) in arrayData" class="pb-1"> {{ key }} - {{ item.name }} {{ item.age }} 歲 <input type="text" /> </li> </ul> <h4>加上 key</h4> <ul> <li v-for="( item, key ) in arrayData" class="pb-1" :key="item.age"> {{ key }} - {{ item.name }} {{ item.age }} 歲 <input type="text" /> </li> </ul> <button class="btn btn-outline-primary" @click="reverseArray"> 反轉陣列 </button> </div> ``` ```JS Vue.createApp({ data(){ return{ arrayData: [ { name:"魯夫", age: 19 }, { name:"索隆", age: 21 }, { name:"娜美", age: 20 }, ], } }, methods: { reverseArray() { this.arrayData.reverse() console.log( this.arrayData ) } }, }).mount('#app') ``` ### :class - 範例一 按鈕樣式 - 按下去自動 active ![active](https://i.imgur.com/eo8pNrp.gif) ```HTML <button type="button" class="btn btn-outline-primary" :class="{active: isActive}" @click="isActive = !isActive" > Primary </button> ``` ```JS const app = { data() { return { isActive: false, } }, methods: {} } Vue.createApp(app).mount('#app') ``` - 範例二 頁籤切換 - 達到頁籤效果 ![page](https://i.imgur.com/O9kfLAx.gif) ```HTML <div id="app"> <ul class="nav nav-tabs" id="myTab" role="tablist"> <li class="nav-item" role="presentation"> <button class="nav-link" :class="{active: isActive === 'Home'}" @click="isActive = 'Home'"> Home </button> </li> <li class="nav-item" role="presentation"> <button class="nav-link" :class="{active: isActive === 'Profile'}" @click="isActive = 'Profile'"> Profile </button> </li> <li class="nav-item" role="presentation"> <button class="nav-link" :class="{active: isActive === 'Casper'}" @click="isActive = 'Casper'"> Casper </button> </li> </ul> <div class="tab-content" id="myTabContent"> <div class="tab-pane" :class="{active: isActive === 'Home'}"> Home </div> <div class="tab-pane" :class="{active: isActive === 'Profile'}"> Profile </div> <div class="tab-pane" :class="{active: isActive === 'Casper'}"> Casper </div> </div> </div> ``` ```JS const app = { data() { return { isActive: '', } }, methods: {} } Vue.createApp(app).mount('#app') ``` ## 雙向綁定 > ![v-model](https://i.imgur.com/ogKK8jt.png) > [name=卡斯伯] 綠色:**只能讀出**資料渲染 紅色:**雙向**綁定可讀可寫 藍色:利用**事件觸發**調整 data,再利用渲染方法渲染到畫面上 黑色:**初始化**渲染畫面 ( 1 次 ) ### 參考資料 - [第二堂 - 共筆文件](https://hackmd.io/@dbFY0UD9SUeKmNXhWf01ew/BkJoW-hn_/%2FbvLEkrTRRnWsImZ5-sWwRg) - [六角學院 Vue 3 夏令營](https://www.hexschool.com/2021/07/07/2021-07-07-vue3-summer-camp/) {%hackmd @JohnsonMao/theme-Wood-Fired %}