###### tags: `Vue3` # 以前不知道的 VUE 指令與用法 可能之前學 vue 的時候有些東西沒注意到,這次剛好參加了 :::success "六角學院" 的 vue3 vue-夏令營公開頻道 ::: 剛好複習一下 vue 而且也可以跟著學習最近新出的 vue3 ## 1. v-model 修飾符 這部分比較少用,透過這次的活動,有點發現新大陸 ~XD ### .lazy `lazy` : 避免持續性觸發,可以在編輯完後才觸發資料更新(使用 change 的形式進行同步) 當使用 input 時,如果使用 v-model.lazy="" 的綁定,在編輯輸入框時不會觸發 data 變動,而是離開了 input 才會觸發更新。 (感覺有點類似所謂防抖機制,可是又有點不一樣😂😂) ### .number `number`:限制只有數值型別的資料才能寫入,以下範例中的 number 資料會是以 number 型別傳入,無法透過該 input 套用其它資料型別。 :::warning 無論 input type 為何,input 預設所傳入的型別為字串 可以使用 v-model.number="" 的綁定,確保用戶所輸入的為純數值 ::: 這個覺得算是好用又簡單的功能,可惜太晚知道了~ 🤣 之前都還特別去找 JS 正規表達式的寫法去判斷,以防止被惡意亂輸入 ### .trim `trim`:修飾掉首尾的空白 這就比較熟悉了,可以自動去除頭尾的空白~ [六角筆記 v-model](https://hackmd.io/@hexschool/r1ETztpdI) --- ## 2. v-for ``` v-for="(item, key) in array" :key="" ``` 之前是只知道 v-for 用來渲染陣列而已,沒想到也可以渲染 **"物件(Object)"** (該打@@) :::danger key:如果是陣列則為該迭代的索引位置,如果是物件則為該迭代的物件屬性 ::: ![](https://i.imgur.com/7cmcoG8.png) [圖片範例 by 六角學院](https://codepen.io/hsiangfeng/pen/XWmpRqQ?editors=1010) --- ## 3. v-bind 不管是綁定 class 還是 style 都可以直接綁定 **"物件(Object)"** ,可以讓 html 看起來比較不會混亂 ### :class with object ```html <div class="box" :class="objectClass"> ... const app = { data() { return { objectClass: { 'rotate': false, 'bg-danger': false, }, } } } Vue.createApp(app).mount('#app') ``` ### :style with Object ```html <div class="box" :style="styleObject"></div> ... const app = { data() { return { // 使用駝峰式命名 styleObject: { backgroundColor: 'red', borderWidth: '5px' } } } } Vue.createApp(app).mount('#app') ``` 以上兩個用法上是差不多的,不過之前沒這麼使用過,現在學到一招了XD :::warning 第一次看到的用法~ **:class with array** <br> ```html <button class="btn" :class="[...arrayClass]">請操作本元件</button> <div class="form-check"> <input type="checkbox" class="form-check-input" id="classToggle3" v-model="arrayClass" value="btn-outline-primary"> <label class="form-check-label" for="classToggle3">切換樣式</label> </div> <div class="form-check"> <input type="checkbox" class="form-check-input" id="classToggle4" v-model="arrayClass" value="active"> <label class="form-check-label" for="classToggle4">啟用元素狀態</label> ... const app = { data() { return { // Array 操作 arrayClass: [], } } } Vue.createApp(app).mount('#app') ``` 透過 input value 直接給 class 的名稱 再透過 [...arrayClass] 複製陣列的方式,將每個被勾選的 value 都推送到 arrayClass 來綁定 class !!! ::: [六角筆記 v-bind](https://hackmd.io/@hexschool/S1DJeKTdL/%2FdxbCu6YTTh2q-Z0p1vWSjw) --- ## 4. computed :::danger computed : 不修改原始的數據,只是為了 **" 渲染畫面產生新的值 "** watch : 類似 methods 會更動原始的數據 ::: 以前只知道 computed 可以用來做資料運算而已,卻沒注意到其他的用法 反而多定義了很多變數來複製原始數據,再拿來渲染 @@(該打~) :warning: **觸發時機** :warning: 當被運算的值,發生改變的時候就會被觸發 但 值 需要是在 this 底下(也就是 data內所宣告的)才行 --- ## 5. v-cloak :::danger 如果使用 v-if / v-show 可能在一開始渲染時出現閃爍的情況 ::: :warning: **解決方式** :warning: 使用 v-cloak 指令和 css 規則 ``` // html : 需要加上 v-cloak <button v-if="count === 8" v-cloak>再玩一局</button> // css : 設定 css 樣式 [v-cloak]{ display:none; } ``` --- ## 更多關於 vue 的參考資料 [六角學院筆記](https://hackmd.io/@hexschool/S1DJeKTdL/%2Fd-oyhhRoRPSvL1uoM1BGJw)