亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

說說如何在Vue.js中實現數字輸入組件的方法

2019-11-19 12:18:36
字體:
來源:轉載
供稿:網友

我們對普通輸入框進行擴展,實現一個可快捷輸入數字組件。

首先制定規則:

  • 只能輸入數字。
  • 設計兩個快捷按鈕,可直接在當前值的基礎上增 1 或者減 1。
  • 數字輸入組件可設置初始值、最大值與最小值。

接著,規劃好 API。一個 Vue.js 組件最重要的 3 個部分就是 props、events 以及 slot,我們需要定義這三個部分的命名以及業務規則。這個組件比較簡單,所以我們只用到  props 與 events。

1 基礎版

html:

<!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8">  <title>數字輸入組件</title></head><body><div id="app">  <number-input v-model="value" :min="0" :max="6"></number-input></div><script src="https://cdn.bootcss.com/vue/2.2.2/vue.min.js"></script><script src="number.js"></script><script>  var app = new Vue({    el: '#app',    data: {      value: 3    }  });</script></body></html>

這里,我們使用了 v-model,雙向綁定了 value。

number.js:

/** * 是否為數字 * @param val * @returns {boolean} */function isNum(val) {  return (/^[0-9]*$/).test(val);}/** * 數字輸入組件 */Vue.component('number-input', {  template: '/  <div class="number-input">/    <input /      type="text"/      :value="currentVal"/      @change="change">/    <button/      @click="down"/      :disabled="currentVal<=min">-</button>/    <button/      @click="up"/      :disabled="currentVal >=max">+</button>/  </div>',  props: {//校驗    //最大值    max: {      type: Number,      default: Infinity    },    //最小值    min: {      type: Number,      default: -Infinity    },    //初始值    value: {      type: Number,      default: 0    }  },  data: function () {    return {      currentVal: this.value    }  },  watch: {    currentVal: function (val) {      console.log("currentVal:" + this.currentVal);      this.$emit('input',val);    },    value: function (val) {//更新 currentVal      this.update(val);    }  },  methods: {    /**     * 更新     * @param val     */    update: function (val) {      //讓輸入的值在限定范圍內      if (val > this.max) {        val = this.max;      }      if (val < this.min) {        val = this.min      }      this.currentVal = val;    },    /**     * 減少     */    down: function () {      if (this.currentVal <= this.min) {        return;      }      this.currentVal -= 1;    },    /**     * 增長     */    up: function () {      if (this.currentVal >= this.max) {        return;      }      this.currentVal += 1;    },    /**     * 如果輸入的值,     * @param event     */    change: function (event) {      var val = event.target.value.trim();//獲取輸入值      if (isNum(val)) {//賦值 currentVal        val = Number(val);        this.currentVal = val;        //超出限定范圍時,規整        var max = this.max;        var min = this.min;        if (val > max) {          this.currentVal = max;        } else if (val < min) {          this.currentVal = min;        }      } else {//還原為 currentVal        event.target.value = this.currentVal;      }    }  },  mounted: function () {    //對初始值進行范圍限定    this.update(this.value);  }});

這里,我們專門定義了一個 number.js,用于定義數字輸入組件。
在 number.js 中,我們做了如下工作:

  1. 利用正則表達式 ,定義了一個判斷 “是否為數字” 的函數。
  2. 在模板定義中,我們定義了一個輸入框以及兩個按鈕,首先在 input 中綁定了 currentVal 數據以及原生的 change 事件。接著,定義了遞增與遞減按鈕,每個按鈕都綁定了相應的事件,還綁定了 disabled 屬性,這樣當輸入的值超出范圍時,按鈕就會置灰不可用。
  3. 在定義的 change() 方法中,先獲取輸入值,然后判斷是否為數字。如果是數字,則賦值給 currentVal;如果不是數字,則還原為 currentVal,這樣可以保證組件的內容始終是數字。
  4. 接著在 props 中,對每一個參數(最大值、最小值、初始值)定義了相應的校驗規則。這樣就可以在父組件中初始化這個數字輸入組件啦O(∩_∩)O~
  5. 因為 Vue.js 組件時單向數據流,所以不能在組件內部修改之前在 props 中定義的 value。我們可以在 data 函數中,聲明一個 currentVal,并把  props 中定義的 value 值賦給它。這樣就實現了組件初始化時,引用父組件中的值的工作。
  6. 為了當父組件修改了輸入值,也要更新子組件中的 currentVal 的功能,我們需要用到 watch 屬性。 watch 屬性用于監聽某個 prop 或者 data,當它們發生變化時,會觸發定義在 watch 中的函數。這里我們監聽了 currentVal 與 value,監聽了 currentVal 是為了將來當內部更新了 currentVal 的場景時,可以同步到 Value,這里起核心作用的是監聽 value 值。為了讓輸入的值在限定范圍內,這里封裝了一個 update() 函數。
  7. watch 中的監聽函數,有兩個入參,第一個是新值,第二個是舊值。這里只用到新值。因為監聽函數中的 this ,指向的是當前組件實例,所以可以直接調用定義在 methods 中的函數。
  8. 為了在組件初始化時,對初始值進行范圍限定,這里在 mounted 掛載函數中,也調用了 update() 函數。

效果:

2 按鍵支持

當輸入框獲得焦點時,按下“向上鍵”時,增長;按下“向上鍵”時,減少。

這可以利用按鍵修飾符來實現,我們修改示例中的組件模板:

... <input       type="text"      :value="currentVal"      @change="change"      @keyup.up="up"      @keyup.down="down">...

Vue.js 定義按鍵別名有這些:

  • .enter
  • .tab
  • .delete(捕獲“刪除”和“退格”鍵)
  • .esc
  • .space
  • .up
  • .down
  • .left
  • .right

效果:

3 控制步伐

新增一個步伐屬性,增長或者減少以步伐值為變化量。之前的示例,步伐為 1。

首先在 props 中,定義一個步伐屬性:

//步伐step: {  type: Number,  default: 1}

然后在增長與減少函數中,使用步伐屬性做為變化量:

/** * 減少 */down: function () {  if (this.currentVal <= this.min) {    return;  }  this.currentVal -= this.step;},/** * 增長 */up: function () {  if (this.currentVal >= this.max) {    return;  }  this.currentVal += this.step;},

最后為組件重新配置參數:

<number-input v-model="value" :min="0" :max="50" :step="5"></number-input>

效果:

本文示例代碼

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美一区二区三区在线| 日韩电影中文字幕| 一区二区三区国产视频| 亚洲 日韩 国产第一| 日本人成精品视频在线| 亚洲精品少妇网址| 国精产品一区一区三区有限在线| 一区二区三区视频免费在线观看| 另类图片亚洲另类| 92看片淫黄大片看国产片| 庆余年2免费日韩剧观看大牛| 国产日韩在线亚洲字幕中文| 中文字幕不卡在线视频极品| 亚洲精品天天看| 日韩精品视频观看| 久久视频国产精品免费视频在线| 91精品在线观看视频| 国产精品jvid在线观看蜜臀| 久久影院资源网| 日韩国产在线看| 欧美三级免费观看| 欧美日本黄视频| 国产精品第七影院| 亚洲全黄一级网站| 夜夜嗨av色一区二区不卡| 久久久久久久久久久免费| 国产精品久久久av久久久| 精品五月天久久| 国产精品欧美激情| 久久久亚洲福利精品午夜| 久久久国产精彩视频美女艺术照福利| 亚洲免费小视频| 成人免费观看网址| 欧美激情一区二区三区久久久| 91精品中文在线| 欧美黑人性猛交| 亚洲视频免费一区| 91香蕉嫩草神马影院在线观看| 亚洲精品美女久久久| 国产一区视频在线播放| 国产精品免费视频久久久| 日韩欧美999| 青青在线视频一区二区三区| 亚洲国产精品久久久久秋霞蜜臀| 精品国偷自产在线视频99| 秋霞成人午夜鲁丝一区二区三区| 亚洲第一二三四五区| 黄色成人av网| 992tv在线成人免费观看| 日韩中文字幕视频| 91久久久久久久| 国产精品视频专区| 久久69精品久久久久久国产越南| 91精品国产99久久久久久| 欧美极品少妇全裸体| 国产精品久久久久av免费| 国产精品成人av性教育| 亚洲精品720p| 欧美国产视频日韩| 国产一区二区日韩精品欧美精品| 97在线观看免费| 亚洲精品欧美一区二区三区| 亚州av一区二区| 日韩激情视频在线播放| 欧美性猛交xxxx乱大交蜜桃| 久久男人的天堂| 一本一本久久a久久精品综合小说| 久久69精品久久久久久国产越南| 亚洲一区二区三区在线免费观看| 国产精品免费视频xxxx| 久久国产精彩视频| 日韩中文娱乐网| 另类少妇人与禽zozz0性伦| 国产精品视频自拍| 久久精品一本久久99精品| 青青草国产精品一区二区| 国产欧美精品xxxx另类| 久久精品美女视频网站| 亚洲最大的免费| 欧美在线国产精品| 欧美在线亚洲在线| 欧美精品激情视频| 国产精选久久久久久| 久久久av亚洲男天堂| 亚洲欧美一区二区三区在线| 色噜噜久久综合伊人一本| 国产日韩欧美成人| 亚洲精品美女在线观看播放| 精品少妇v888av| 538国产精品一区二区在线| 中文字幕亚洲色图| 亚洲图片欧美午夜| 精品亚洲va在线va天堂资源站| 中文字幕日韩欧美| 国产成人精品最新| 国产一区二区欧美日韩| 韩国国内大量揄拍精品视频| 日韩电影大全免费观看2023年上| 久久久久久国产精品三级玉女聊斋| 国产精品丝袜一区二区三区| 国产精品一区二区久久国产| 亚洲嫩模很污视频| 国产精品亚洲网站| 午夜精品一区二区三区视频免费看| 欧美中文字幕视频在线观看| 日韩一区av在线| 亚洲乱亚洲乱妇无码| 国产精品久久久久久久天堂| 国产欧美久久久久久| 欧美一区亚洲一区| 亚洲a级在线播放观看| 青青久久aⅴ北条麻妃| 亚洲欧美国产精品专区久久| 日韩极品精品视频免费观看| 日韩精品视频在线免费观看| 欧洲成人性视频| 日韩在线一区二区三区免费视频| 曰本色欧美视频在线| 亚洲美女又黄又爽在线观看| 亚洲精品久久久久久下一站| 国产一区二区在线免费| 亚洲人成77777在线观看网| 欧美激情精品久久久| 青草青草久热精品视频在线观看| 欧美激情精品久久久久久久变态| 久久在线精品视频| 在线视频日本亚洲性| 人人做人人澡人人爽欧美| 亚洲欧美国产一区二区三区| 91热福利电影| 97精品国产97久久久久久免费| 96sao精品视频在线观看| 欧洲成人午夜免费大片| 国内精品中文字幕| 欧美最猛性xxxxx亚洲精品| 538国产精品视频一区二区| 日韩精品中文字幕久久臀| 日韩成人在线视频观看| 久久久久久国产精品美女| 精品亚洲一区二区三区在线播放| 影音先锋欧美精品| 亚洲综合第一页| 国产精品欧美久久久| 精品中文字幕在线观看| 性色av一区二区三区在线观看| 国产精品18久久久久久麻辣| 亚洲第一男人天堂| 国产精品久久久久久久一区探花| 亚洲美女性生活视频| 国产精品偷伦视频免费观看国产| 九九精品视频在线| 夜夜嗨av色一区二区不卡| 久热精品视频在线免费观看| 亚洲欧美日韩一区二区三区在线| 亚洲国内精品视频| 国产欧美日韩91| 在线观看欧美日韩| 亚州欧美日韩中文视频| 日韩中文字在线| 中文字幕日韩欧美精品在线观看| 欧美亚洲激情在线| 国产精品一区二区在线| 国产精品一区二区久久久| 奇门遁甲1982国语版免费观看高清|