vue組件:input數字輸入框


組件效果圖如下:

在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。

 

以上。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM