組件效果圖如下:
在vue-cli腳手架上搭建的,用來輸入數字,兩個按鈕用來加減步長。可以設置初始值、最大最小值。
開始代碼:
父組件---App.vue
1 <input-component v-model.number='value'
2 :maxNum='maxNum' 3 :minNum='minNum' 4 :step='step' 5 ></input-component>
<input-component>該標簽是要引用的子組件自定義標簽,value為默認輸入值,maxNum為最大值,minNum為最小值,step為步長,即點擊加/減按鈕要增加/減少的數。
js:
1 data() { 2 return { 3 maxNum: 100, 4 minNum: 0, 5 value: 3, 6 step: 2 7 } 8 }
子組件---input.vue
1 <input :value="currentVal"> 2 <input type="button" value="+" @click="buttonClick(1)"> 3 <input type="button" value="-" @click="buttonClick(-1)"> 4 <p>默認值:{{value}}</p> 5 <p>當前值:{{currentVal}}</p> 6 <p>最大值:{{maxNum}}</p> 7 <p>步長:{{step}}</p>
1 export default { 2 data() { 3 return { 4 currentVal: this.value 5 } 6 }, 7 props: { 8 value: { 9 type: Number, 10 default: 10 11 }, 12 maxNum: { 13 type: Number, 14 default: Infinity 15 }, 16 minNum: { 17 type: Number, 18 default: -Infinity 19 }, 20 step: { 21 type: Number, 22 default: 1 23 } 24 } 25 }
vue組件是單向數據流,所以無法從組件內部直接修改prop value的值。可以給組件聲明一個data,默認引用value的值,在組件內部維護data,這里聲明的data值為currentVal。上面代碼第四行。
以上,解決了初始化引用父組件value的值,如果子組件修改了currentVal,那么父組件里value也要一起更新,使用watch監聽
在子組件中添加
1 export default { 2 ... //此處省略了代碼 3 watch: { 4 currentVal(val){ 5 console.log('子組件currentVal值改變') 6 this.$emit('input', val) 7 } 8 } 9 }
子組件里按鈕點擊加減
1 methods: { 2 updateVal(val){ 3 if(val > this.maxNum ) val = this.maxNum 4 if(val < this.minNum) val = this.minNum 5 this.currentVal = val 6 }, 7 buttonClick (flag) { 8 if(flag > 0){ 9 this.currentVal < this.maxNum ? this.currentVal += this.step : this.maxNum 10 this.updateVal(this.currentVal) 11 }else{ 12 this.currentVal > this.minNum ? this.currentVal -= this.step : this.minNum 13 this.updateVal(this.currentVal) 14 } 15 } 16 }
@click="buttonClick(1)"中,參數分別傳入1和-1,代表加和減,所以方法中通過判斷參數flag是否大於0來確定是加按鈕還是減按鈕,里面用了三元運算符。
方法updataVal判斷輸入值是否小於最小值,是否大於最大值,所以,還需要在第一次初始化時調用,及mounted中
1 mounted(){ 2 this.updateVal(this.value) 3 }
看起來OK了,但是,如果你在input框里輸入值,在點擊加減按鈕,它改變的值還是以前的值,所以要在input框上添加change事件
1 <input :value="currentVal" @change="fixNumber">
1 methods: { 2 ... //省略了其他方法 3 fixNumber ($event) { 4 let fix 5 if (typeof $event.target.value != 'number') {fix = Number($event.target.value.replace(/\D/g, ''))} 6 else {fix = $event.target.value} 7 this.updateVal(fix) 8 } 9 }
這里第5行代碼是判斷輸入值是否是數字類型並做了一個簡單的轉換。
這里獲取input輸入值,除了可以用$event.target.value,還可以用this.$refs.input.value。
以上。