1. 概述
洛克定律告訴我們:
當我們的目標很遠大,遠到我們都看不到終點時,放棄機率就會很大,就像跑馬拉松比賽,由於時間長、距離長,很多選手都會選擇在中途放棄。
其實有個好辦法,就是拆分,把大目標拆分成很多的小目標,這些小目標都是能夠看到終點的,讓自己有一種努力一下就能完成目標的感覺,當把所有的小目標完成後,大目標自然也就完成了。
言歸正傳,上一節我們聊了子元件修改父元件資料的幾種方式,今天我們繼續聊一些更高階的用法。
2. 多個 v-model 繫結
2.1 回顧 v-model 方式,修改父元件資料的值
const app = Vue.createApp({ data() { return { num : 1 } }, template:` <div> <test v-model:num="num" /> </div> ` }); app.component("test", { props:['num'], methods : { incrNum() { this.$emit('update:num', this.num + 1); } }, template:` <div @click="incrNum" >{{num}}</div> ` });
這是我們上一節的最後,使用 v-model 的方式修改父元件傳遞過來的 num 的例子。
這裡父元件只傳了一個引數給子元件,那如果父元件傳遞兩個或多個引數給子元件呢,同學們應該已經知道怎麼做了吧,我們看下面的例子
2.2 多個 v-model 繫結
const app = Vue.createApp({ data() { return { num1 : 1, num2 : 1 } }, template:` <div> <test v-model:num1="num1" v-model:num2="num2"/> </div> ` }); app.component("test", { props:['num1', 'num2'], methods : { incrNum1() { this.$emit('update:num1', this.num1 + 1); }, incrNum2() { this.$emit('update:num2', this.num2 + 2) } }, template:` <div @click="incrNum1" >{{num1}}</div> <div @click="incrNum2" >{{num2}}</div> ` });
這個例子很簡單,父元件在使用 test 子元件時使用 <test v-model:num1="num1" v-model:num2="num2"/> 傳遞了兩個引數 num1、num2 給子元件。
子元件在事件方法中,使用 this.$emit('update:num1', this.num1 + 1); 和 this.$emit('update:num2', this.num2 + 2); 修改 num1、num2 的值,num1每次點選加1,num2每次點選加2。
3. v-mode 修飾符
3.1 初識 v-model 修飾符
const app = Vue.createApp({ data() { return { num : 1 } }, template:` <div> <test v-model:num.double="num" /> </div> ` }); app.component("test", { props:{'num': Number, 'numModifiers': { default: () => ({}) }}, methods : { incrNum() { let newValue = this.num; if(this.numModifiers.double) { newValue = newValue * 2; } this.$emit('update:num', newValue); } }, template:` <div @click="incrNum" >{{num}}</div> ` });
主元件在使用 test 子元件時,使用 <test v-model:num.double="num" /> 程式碼傳參,在這段程式碼中有一個新知識,就是 double 修飾符,這是我們自定義的一個修飾符,名稱是隨意取的。
子元件接收父元件引數時,不僅接收了 num,還接收了 numModifiers。
注意,這裡 props 需要以物件的方式接收引數。
numModifiers 的命名規則是 引數+Modifiers,因為引數的命名是 num,所以這裡是 numModifiers。
numModifiers 需要指定一個預設值 default: () => ({}) ,() => ({}) 意思是預設什麼都不做,如果不指定預設值的話,當父元件傳參時,沒有指定修飾符,則會報錯
最後在事件方法中使用 if(this.numModifiers.double) 判斷是否使用了 double 修飾符,如果使用了,num 就乘 2。
這裡只是舉了一個簡單的例子,可以根據指定的修飾符的不同,做很多不同的事情,例如:字母變大寫,字母首字母大寫,數字執行某個特殊計算等等。
3.2 多個引數包含修飾符
如果多個引數包含相同或不同的修飾符,該如何寫呢,其實很簡單,照貓畫虎就可以
const app = Vue.createApp({ data() { return { num : 1, num2 : 1 } }, template:` <div> <test v-model:num.double="num" v-model:num2.triple="num2" /> </div> ` }); app.component("test", { props:{ 'num': Number, 'numModifiers': { default: () => ({}) }, 'num2': Number, 'num2Modifiers': { default: () => ({}) }, }, methods : { incrNum() { let newValue = this.num; if(this.numModifiers.double) { newValue = newValue * 2; } this.$emit('update:num', newValue); }, incrNum2() { let newValue = this.num2; if(this.num2Modifiers.triple) { newValue = newValue * 3; } this.$emit('update:num2', newValue); } }, template:` <div @click="incrNum" >{{num}}</div> <div @click="incrNum2" >{{num2}}</div> ` });
這裡我們增加了一個 num2 引數,num2 引數使用了 triple(三倍) 修飾符,這也是個自定義的修飾符,名稱是隨意取的。
test 子元件用同樣的方式接收 num2 和 num2Modifiers。
最後在事件方法中使用 if(this.num2Modifiers.triple) 判斷是否使用了 triple 修飾符,如果使用了就把 num2 乘 3。
4. 綜述
今天聊了一下 VUE3 的 多個 v-model 繫結及 v-model 修飾符的使用,希望可以對大家的工作有所幫助,下一節我們繼續講元件的相關知識,敬請期待
歡迎幫忙點贊、評論、轉發、加關注 :)
關注追風人聊Java,每天更新Java乾貨。
5. 個人公眾號
追風人聊Java,歡迎大家關注