[vue]自訂一個只能輸入數字的控制項

[vue]自訂一個只能輸入數字的控制項

HTML雖然已經提供了number的控制項,但是預設是能輸入e和+跟-的,而我們有有些畫面是只能輸入純數字的,那就來看一下用vue如何簡單實現這個功能吧

不符合預期值的話,就不允許輸入,這個需要定義在keypress的事件裡面

keypress (e) {     
  if (e.key === '+' || e.key === 'e' || e.key === '-') {
    e.preventDefault()
  }
}

為求方便所以我一樣為了調用方使用v-model來做

props: {
  value: Number,    
}

所以當我們的值有改變的時候,就去emit通知父元件值已更新,但這邊我只定義change事件,所以預設是類似lazy的效果,不會馬上key完馬上反應。

change (e) {
  this.$emit('input', +e.target.value)
}

如果當我們focus的時候,想要預設選中控制項裡的值,可以在focus裡定義

focus () {
  this.$el.select()
}

這樣子就完成了禁止輸入數字以外的值,並且只要進入在控制項裡面,就會選中值了,完整程式碼

<template>
  <input @keypress="keypress" @change="change" type="number" :value="value" @focus="focus">
</template>

<script>
export default {
  props: {
    value: Number
  },
  methods: {
    keypress (e) {
      if (e.key === '+' || e.key === 'e' || e.key === '-') {
        e.preventDefault()
      }
    },
    change (e) {
      this.$emit('input', +e.target.value)
    },
    focus () {
      this.$el.select()
    }
  }
}
</script>

<style>

</style>