【问题标题】:Space in 4 digits for a credit card with vuejs带有 vuejs 的信用卡的 4 位空格
【发布时间】:2021-07-15 10:11:13
【问题描述】:

我在输入信用卡号码时尝试在 4 位数字后留出一个空格。例如:0000 0000 0000 0000 我正在使用 vue js。我已经看到了示例,但使用的是 jquery,我不想使用 jquery。

感谢您的帮助

<!--template -->
<div>
  <div>
    <p>Numéro de carte</p>
    <input class="numeroCarte" type="tel" name="numeroCarte" placeholder="Saisissez votre numéro de carte " maxlength="19" pattern="\d*"><i class="fas fa-credit-card"></i>
  </div>
  <div>
    <p>Date d'expiration</p>
    <input type="tel" name="expiration" pattern="\d*" maxlength="7" placeholder="MM / AA">
  </div>
  <div>
    <p>CVV</p>
    <input type="tel" name="cvv" pattern="\d*" maxlength="4" placeholder="CVV">
  </div>
</div>
<!-- /template -->

【问题讨论】:

  • 不幸的是,并非所有卡片的每 4 个数字之间都有一个空格,它们的长度也不相同,您需要进行更多验证而不仅仅是检查数字,这里是一个示例 codesandbox.io/s/vue-payment-form-6mhs3

标签: javascript vue.js vuejs3


【解决方案1】:

Vue2 中,filters 就是为这种目的而设计的。

const app = new Vue({
  el: '#app',
  data(){
    return {
      cardNumber: '' 
    } 
  },
  filters: {
    formatCardNumber(value){
      return value ? value.match(/.{1,4}/g).join(' ') : '';
    } 
  },
  methods: {
    updateValue(e){
       this.cardNumber = e.target.value.replace(/ /g,'');
    }
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<main id="app">
  <input :value="cardNumber | formatCardNumber" @input="updateValue"/>
</main>

Vue3中,你可以使用computed来替换它。 Filters are removed from Vue 3.0 and no longer supported.

Vue.createApp({
      data(){
        return {
          cardNumber: '' 
        } 
      },
      computed: {
        formatCardNumber(){
          return this.cardNumber ? this.cardNumber.match(/.{1,4}/g).join(' ') : '';
        } 
      },
      methods: {
        updateValue(e){
           this.cardNumber = e.target.value.replace(/ /g,'');
        }
      }
    }).mount('#app')
<script src="https://unpkg.com/vue@next"></script>
<main id="app">
  <input :value="formatCardNumber" @input="updateValue"/>
</main>

【讨论】:

  • 非常感谢@User10519069 的帮助,这正是我所需要的。谢谢
【解决方案2】:

我认为在 Vuejs 中输入模式的最简单方法是使用 vue-the-mask

例如,您可以将此模式用于银行帐户:

...

<div>
 <label>Bank Account</label>
 <the-mask
  v-model="bankAccount"
  :mask="['###-#', '####-#', '#####-#', '######-#']"
 />
</div>

...

【讨论】:

  • 感谢您的回答 @Ari Shojaei ,但我只是想在输入 4 位数字后留出一个空格
【解决方案3】:

我猜你的卡片输入连接到数据对象:

data() {
  return {
    card: ''
  }
}

在带有 v-model 的模板中,您可以为 keyup 添加事件监听器:

<input v-model="card" @keyup="formatCard" class="numeroCarte" type="tel" name="numeroCarte" placeholder="Saisissez votre numéro de carte " maxlength="19" pattern="\d*"><i class="fas fa-credit-card"></i>

制作方法:

methods: {
  formatCard() {
    let nn = this.card;
    (nn.length - (nn.split(" ").length - 1)) % 4 === 0 ? this.card += ' ' : ''
  }
}

在每个 keyup 事件的方法中,您检查在卡片输入中输入的文本长度(没有空格)是否可以被 4 整除。

【讨论】:

  • 非常感谢@Nikola Pavicevic 的帮助
【解决方案4】:

 const app = new Vue({
       el: '#app',
         data(){
          return {
           cardNumber: '' 
           } 
          },
        filters: {
           formatCardNumber(value){
               return value ? (value.replace(/ /g, '')).match(/.{1,4}/g).join(' ') : '';
           } 
         },
         methods: {
          isNumber(evt) {
            evt = (evt) ? evt : window.event;
            var charCode = (evt.which) ? evt.which : evt.keyCode;
            if ((charCode > 31 && (charCode < 48 || charCode > 57)) && charCode !== 46) {
                evt.preventDefault();
            } else {
                return true;
            }
        },
            updateValue(e){
               if (e.target.value.trim() != "") {
                   this.cardNumber = (e.target.value.replace(/ /g, '')).match(/.{1,4}/g).join(' ')
                } else {
                   this.cardNumber = ""
                }
            }
         }
         })
#app {
display: flex;
    flex-direction: column;
}
#app label{ 
height: 20px;
        font-size:15px;
        color:green;
}
      <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"> 
      </script>
      <main id="app">
         <label>{{cardNumber}}</label>
         <input placeholder="Enter Number Card" :value="cardNumber | formatCardNumber" @input="updateValue" @keypress="isNumber($event)"/>
      </main>
     

【讨论】:

    猜你喜欢
    • 2020-10-18
    • 2013-05-10
    • 1970-01-01
    • 2023-04-10
    • 2016-02-02
    • 2011-07-03
    • 2018-10-18
    • 2012-04-09
    • 2018-10-05
    相关资源
    最近更新 更多