怎么在vue.js中實現(xiàn)一個只能輸入數(shù)字的輸入框?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
成都創(chuàng)新互聯(lián)公司-云計算及IDC服務(wù)提供商,涵蓋公有云、IDC機(jī)房租用、BGP機(jī)房服務(wù)器托管、等保安全、私有云建設(shè)等企業(yè)級互聯(lián)網(wǎng)基礎(chǔ)服務(wù),歡迎聯(lián)系:028-86922220
代碼如下:
Vue
如果頁面或是系統(tǒng)里有很多這樣的輸入框,這樣做,就不是很好了。每個數(shù)據(jù)都加一個監(jiān)聽器,然后某一天突然需求改了,可以輸入數(shù)字和字母了,那就要改得吐血了!而且這樣做,代碼也沒有可移植性,到了另一個系統(tǒng)里,還得重寫一遍,所以,就要寫一個通用的方法來實現(xiàn)這個需求。這個時候就要用到組件的功能,先新建一個js文件,我這里就叫num.js。然后num.js里面的代碼:
Vue.component('number', { template: '', data: function(){ return { con: '' } }, watch: { con: function(val){ this.con = val.replace(/\D/g, ''); } } })
這樣就定義了一個組件number,組件里是一個輸入框,輸入框的內(nèi)容與數(shù)據(jù)con綁定,監(jiān)聽器控制con只能是數(shù)字。然后在html頁面里引入num.js,在頁面添加
現(xiàn)在頁面有三個輸入框,三個輸入框的內(nèi)容要分別綁定到val1、val2、val3。該怎么弄?一開始,我的做法是在number標(biāo)簽上定義一個方法,組件里con的監(jiān)聽器監(jiān)聽到con值有改變時,就調(diào)用這個方法,把con的值傳出來,而這個方法又會調(diào)用mydata里的一個方法,兩次傳遞,把值傳給對應(yīng)的val。這邏輯,聽著是不是感覺很繞。很繞都不怕,重要的是,別人用起來很不方便,需要自己到mydata里定義一個方法來賦值。所以后來就再改,輸入框的內(nèi)容不是要綁定一個數(shù)據(jù)嗎?那要綁定到哪個數(shù)據(jù),得告訴我吧,所以在number標(biāo)簽上,需要告訴我對象是哪個,屬性名是哪個,這樣,我就可以把輸入框的內(nèi)容綁定到這個對象的這個屬性上。在這里,對象就是mydata,屬性名就是val1、val2、val3。把對象傳進(jìn)去,傳的是字符串mydata,并不是一個對象,在組件里面,要怎么使用mydata這個對象?這個時候,就需要用到j(luò)s里非常強(qiáng)大的一個函數(shù)eval,eval函數(shù)接收一個字符串參數(shù),只能是字符串,然后函數(shù)會把這個字符串當(dāng)作js代碼來解析并執(zhí)行。代碼
vue 第一個輸入框的內(nèi)容是: {{val1}}
第二個輸入框的內(nèi)容是: {{val2}}
第三個輸入框的內(nèi)容是: {{val3}}
num.js的代碼:
Vue.component('number', { props: ['objname', 'keys'], template: '', data: function(){ return { con: '' } }, watch: { con: function(val){ this.con = val.replace(/\D/g, ''); eval(this.objname+'[this.keys]=this.con'); } }, })
運(yùn)行效果圖:
這樣,輸入框限制了只能輸入數(shù)字,也和數(shù)據(jù)綁字了,但這只是單向的綁字,輸入框的內(nèi)容改變了,外面的數(shù)據(jù)會跟著改變,但外面的數(shù)據(jù)改變了,輸入框的內(nèi)容不會跟著改變,所以,現(xiàn)在只是單向的綁定。在頁面下面再添加三個普通的輸入框,三個輸入框分別綁定val1、val2、val3
這個時候到頁面上操作就會發(fā)現(xiàn),上面的輸入框內(nèi)容改變會影響下面的,但下面的輸入框內(nèi)容改變了,就不會影響上面的輸入框的內(nèi)容
這個時候,要實現(xiàn)反向的綁定,那就需要在組件里為外面的數(shù)據(jù)添加監(jiān)聽器。有對象,有屬性名,為它加監(jiān)聽器,是可以加的,但是外面的屬性要綁定哪個組件里的輸入框呢?所以組件上要再添加一個屬性ref,這個ref是vue定義的一個屬性,用來找子組件的。這樣,代碼最終就變成
第一個輸入框的內(nèi)容是: {{val1}}
第二個輸入框的內(nèi)容是: {{val2}}
第三個輸入框的內(nèi)容是: {{val3}}
num.js里面
Vue.component('number', { props: ['objname', 'keys'], template: '', data: function(){ return { con: '' } }, mounted: function(){ var self = this; window.addEventListener('load', function(){ eval(self.objname+'.$watch(\''+self.keys+'\',function(val){this.$refs.'+self.keys+'.con=val})'); }) }, watch: { con: function(val){ this.con = val.replace(/\D/g, ''); eval(this.objname+'[this.keys]=this.con'); } }, })
這樣,數(shù)據(jù)就實現(xiàn)了雙向綁定。在mounted里面,addEventListener方法是有兼容問題的,IE8及以下版本沒有這個方法,我這里沒有做兼容處理。然后就是優(yōu)化,看代碼就發(fā)現(xiàn),在number標(biāo)簽上,ref和keys實際上是一樣的,可不可以只用一個?經(jīng)過實驗,在組件內(nèi)部獲取ref的值獲取不到,這個我還不知道怎么獲取,學(xué)得不夠深吶。然后就是objname可不可以不傳,不傳的話就默認(rèn)是組件的父對象,這個是可以實現(xiàn)的。最后,組件還可以進(jìn)行一些擴(kuò)展,比如再添加一個屬性mytype,mytype不傳則默認(rèn)輸入框只能輸入數(shù)字,如果為word,則輸入框只能輸入字母和數(shù)字,如果為chinses,則只能輸入中文漢字等。
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。