vue.js實(shí)現(xiàn)只能輸入數(shù)字的輸入框
在菜鳥(niǎo)教程里,看了vue.js的教程,看完后,練練手,就試著實(shí)現(xiàn)了只能輸入數(shù)字的輸入框。在之前的博客里,用jquery也實(shí)現(xiàn)了這樣的功能,這里用vue.js來(lái)實(shí)現(xiàn),把實(shí)現(xiàn)的過(guò)程記錄下來(lái)
如果只是一個(gè)輸入框,要實(shí)現(xiàn)就非常的簡(jiǎn)單了,輸入框的內(nèi)容和數(shù)據(jù)綁定,給數(shù)據(jù)加一個(gè)監(jiān)聽(tīng)器就可以了,代碼如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue</title>
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
</head>
<body>
<div id="div1">
<input v-model="content">
</div>
<script>
var mydata = new Vue({
el: '#div1',
data: {
content: ''
},
watch: {
content: function(val){
this.content = val.replace(/\D/g, '')
}
}
})
</script>
</body>
</html>
如果頁(yè)面或是系統(tǒng)里有很多這樣的輸入框,這樣做,就不是很好了。每個(gè)數(shù)據(jù)都加一個(gè)監(jiān)聽(tīng)器,然后某一天突然需求改了,可以輸入數(shù)字和字母了,那就要改得吐血了!而且這樣做,代碼也沒(méi)有可移植性,到了另一個(gè)系統(tǒng)里,還得重寫(xiě)一遍,所以,就要寫(xiě)一個(gè)通用的方法來(lái)實(shí)現(xiàn)這個(gè)需求。這個(gè)時(shí)候就要用到組件的功能,先新建一個(gè)js文件,我這里就叫num.js。然后num.js里面的代碼:
Vue.component('number', {
template: '<input type="text" v-model="con">',
data: function(){
return {
con: ''
}
},
watch: {
con: function(val){
this.con = val.replace(/\D/g, '');
}
}
})
這樣就定義了一個(gè)組件number,組件里是一個(gè)輸入框,輸入框的內(nèi)容與數(shù)據(jù)con綁定,監(jiān)聽(tīng)器控制con只能是數(shù)字。然后在html頁(yè)面里引入num.js,在頁(yè)面添加<number></number>標(biāo)簽,在瀏覽器里,看到的就是一個(gè)輸入框,但是輸入框只能輸入數(shù)字。在頁(yè)面放置輸入框,是為了讓用戶(hù)輸入內(nèi)容,輸入的內(nèi)容是要給程序用的。那要怎么獲取輸入框的內(nèi)容?如果是用jquery的話(huà),那就是通過(guò)dom來(lái)獲取,但vue的設(shè)計(jì)理念是dom和數(shù)據(jù)分離,通過(guò)dom來(lái)獲取就不合適,所以就要讓輸入框與一個(gè)數(shù)據(jù)綁定起來(lái)。

現(xiàn)在頁(yè)面有三個(gè)輸入框,三個(gè)輸入框的內(nèi)容要分別綁定到val1、val2、val3。該怎么弄?一開(kāi)始,我的做法是在number標(biāo)簽上定義一個(gè)方法,組件里con的監(jiān)聽(tīng)器監(jiān)聽(tīng)到con值有改變時(shí),就調(diào)用這個(gè)方法,把con的值傳出來(lái),而這個(gè)方法又會(huì)調(diào)用mydata里的一個(gè)方法,兩次傳遞,把值傳給對(duì)應(yīng)的val。這邏輯,聽(tīng)著是不是感覺(jué)很繞。很繞都不怕,重要的是,別人用起來(lái)很不方便,需要自己到mydata里定義一個(gè)方法來(lái)賦值。所以后來(lái)就再改,輸入框的內(nèi)容不是要綁定一個(gè)數(shù)據(jù)嗎?那要綁定到哪個(gè)數(shù)據(jù),得告訴我吧,所以在number標(biāo)簽上,需要告訴我對(duì)象是哪個(gè),屬性名是哪個(gè),這樣,我就可以把輸入框的內(nèi)容綁定到這個(gè)對(duì)象的這個(gè)屬性上。在這里,對(duì)象就是mydata,屬性名就是val1、val2、val3。把對(duì)象傳進(jìn)去,傳的是字符串mydata,并不是一個(gè)對(duì)象,在組件里面,要怎么使用mydata這個(gè)對(duì)象?這個(gè)時(shí)候,就需要用到j(luò)s里非常強(qiáng)大的一個(gè)函數(shù)eval,eval函數(shù)接收一個(gè)字符串參數(shù),只能是字符串,然后函數(shù)會(huì)把這個(gè)字符串當(dāng)作js代碼來(lái)解析并執(zhí)行。代碼
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>vue</title>
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
<script src="num.js"></script>
</head>
<body>
<div id="div1">
<number objname="mydata" keys="val1"></number>
<number objname="mydata" keys="val2"></number>
<number objname="mydata" keys="val3"></number>
<p>第一個(gè)輸入框的內(nèi)容是: {{val1}}</p>
<p>第二個(gè)輸入框的內(nèi)容是: {{val2}}</p>
<p>第三個(gè)輸入框的內(nèi)容是: {{val3}}</p>
</div>
<script>
var mydata = new Vue({
el: '#div1',
data: {
val1: '',
val2: '',
val3: ''
}
})
</script>
</body>
</html>
num.js的代碼:
Vue.component('number', {
props: ['objname', 'keys'],
template: '<input type="text" v-model="con">',
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ù)會(huì)跟著改變,但外面的數(shù)據(jù)改變了,輸入框的內(nèi)容不會(huì)跟著改變,所以,現(xiàn)在只是單向的綁定。在頁(yè)面下面再添加三個(gè)普通的輸入框,三個(gè)輸入框分別綁定val1、val2、val3

這個(gè)時(shí)候到頁(yè)面上操作就會(huì)發(fā)現(xiàn),上面的輸入框內(nèi)容改變會(huì)影響下面的,但下面的輸入框內(nèi)容改變了,就不會(huì)影響上面的輸入框的內(nèi)容

這個(gè)時(shí)候,要實(shí)現(xiàn)反向的綁定,那就需要在組件里為外面的數(shù)據(jù)添加監(jiān)聽(tīng)器。有對(duì)象,有屬性名,為它加監(jiān)聽(tīng)器,是可以加的,但是外面的屬性要綁定哪個(gè)組件里的輸入框呢?所以組件上要再添加一個(gè)屬性ref,這個(gè)ref是vue定義的一個(gè)屬性,用來(lái)找子組件的。這樣,代碼最終就變成
<div id="div1">
<number ref="val1" objname="mydata" keys="val1"></number>
<number ref="val2" objname="mydata" keys="val2"></number>
<number ref="val3" objname="mydata" keys="val3"></number>
<p>第一個(gè)輸入框的內(nèi)容是: {{val1}}</p>
<p>第二個(gè)輸入框的內(nèi)容是: {{val2}}</p>
<p>第三個(gè)輸入框的內(nèi)容是: {{val3}}</p>
<input v-model="val1">
<input v-model="val2">
<input v-model="val3">
</div>
num.js里面
Vue.component('number', {
props: ['objname', 'keys'],
template: '<input type="text" v-model="con">',
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ù)就實(shí)現(xiàn)了雙向綁定。在mounted里面,addEventListener方法是有兼容問(wèn)題的,IE8及以下版本沒(méi)有這個(gè)方法,我這里沒(méi)有做兼容處理。然后就是優(yōu)化,看代碼就發(fā)現(xiàn),在number標(biāo)簽上,ref和keys實(shí)際上是一樣的,可不可以只用一個(gè)?經(jīng)過(guò)實(shí)驗(yàn),在組件內(nèi)部獲取ref的值獲取不到,這個(gè)我還不知道怎么獲取,學(xué)得不夠深吶。然后就是objname可不可以不傳,不傳的話(huà)就默認(rèn)是組件的父對(duì)象,這個(gè)是可以實(shí)現(xiàn)的。最后,組件還可以進(jìn)行一些擴(kuò)展,比如再添加一個(gè)屬性mytype,mytype不傳則默認(rèn)輸入框只能輸入數(shù)字,如果為word,則輸入框只能輸入字母和數(shù)字,如果為chinses,則只能輸入中文漢字等。
更多教程點(diǎn)擊《Vue.js前端組件學(xué)習(xí)教程》,歡迎大家學(xué)習(xí)閱讀。
關(guān)于vue.js組件的教程,請(qǐng)大家點(diǎn)擊專(zhuān)題vue.js組件學(xué)習(xí)教程進(jìn)行學(xué)習(xí)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue利用better-scroll實(shí)現(xiàn)輪播圖與頁(yè)面滾動(dòng)詳解
在我們?nèi)粘5捻?xiàng)目開(kāi)發(fā)中,處理滾動(dòng)和輪播圖是再常見(jiàn)不過(guò)的需求了,下面這篇文章主要給大家介紹了關(guān)于vue利用better-scroll實(shí)現(xiàn)輪播圖與頁(yè)面滾動(dòng)的相關(guān)資料,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),需要的朋友們下面來(lái)一起看看吧。2017-10-10
Vue路由history模式解決404問(wèn)題的幾種方法
這篇文章主要介紹了Vue路由history模式解決404問(wèn)題的幾種方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
Vue3 組件庫(kù)的環(huán)境配置搭建過(guò)程
這篇文章主要介紹了Vue3 組件庫(kù)的環(huán)境配置搭建過(guò)程,使用 Vite+Ts 開(kāi)發(fā)的是 Vue3 組件庫(kù),所以我們需要安裝 typescript、vue3,同時(shí)項(xiàng)目將采用 Less 進(jìn)行組件庫(kù)樣式的管理,需要的朋友可以參考下2023-03-03
vue-cli項(xiàng)目代理proxyTable配置exclude的方法
今天小編就為大家分享一篇vue-cli項(xiàng)目代理proxyTable配置exclude的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
vue?路由跳轉(zhuǎn)打開(kāi)新窗口被瀏覽器攔截問(wèn)題處理
這篇文章主要介紹了vue?路由跳轉(zhuǎn)打開(kāi)新窗口被瀏覽器攔截問(wèn)題處理,下面文章操作中所遇到相關(guān)問(wèn)題解決的內(nèi)容介紹詳細(xì),需要的小伙伴可以參考一下2022-03-03
vuex中store.commit和store.dispatch的區(qū)別及使用方法
這篇文章主要介紹了vuex中store.commit和store.dispatch的區(qū)別及使用方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01

