vue+iview實(shí)現(xiàn)手機(jī)號(hào)分段輸入框
vue + iview 實(shí)現(xiàn)一個(gè)手機(jī)分段的提示框,知識(shí)點(diǎn)還沒(méi)總結(jié),供大家參考,具體內(nèi)容如下
<template> ? <div :class="{'ivu-form-item-error':!valid && dirty && validated}"> ? ? <div class="ivu-phone-input ivu-select ?ivu-select-multiple ivu-select-default" @keydown.delete.prevent @click.stop> ? ? ? <input type="text" class="ivu-select-selection number-block" ? ? ? ? ? ? ?v-for="(item,index) in phoneLength" :key="index" ? ? ? ? ? ? ?:ref="numberRefName+index" ? ? ? ? ? ? ?@focus="handlerFocus" ? ? ? ? ? ? ?@input="handlerInput($event,index)" ? ? ? ? ? ? ?@keydown.delete.prevent="deleteNumber($event,index)" ? ? ? ? ? ? ?@keydown.left.prevent="changeInput(index - 1)" ? ? ? ? ? ? ?@keydown.right="changeInput(index + 1)" ? ? ? /> ? ? ? <Icon type="ios-close-circle" class="clean-btn" @click="cleanValue"/> ? ? </div> ? </div> </template> ? <script> ? export default { ? ? data() { ? ? ? return { ? ? ? ? required: this.$attrs.hasOwnProperty('required'), ? ? ? ? phoneLength: 11, ? ? ? ? phoneReg: /^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\d{8}$/, ? ? ? ? numberRefName: 'numberBlock', ? ? ? ? validTimer: null, ? ? ? ? dirty: false, ? ? ? ? valid: false, ? ? ? ? validated: false, ? ? ? }; ? ? }, ? ? methods: { ? ? ? ? handlerFocus() { ? ? ? ? if (!this.dirty) { ? ? ? ? ? this.dirty = this.required ? true : false; ? ? ? ? } ? ? ? }, ? ? ? ? handlerInput(e, index) { ? ? ? ? if (!e.target.value) { ? ? ? ? ? return; ? ? ? ? } ? ? ? ? this.dirty = true; ? ? ? ? let value = e.target.value.replace(/\D+/g, ''); ? ? ? ? value = value ? value[0] : ''; ? ? ? ? //合法值,切換下一個(gè)輸入框 ? ? ? ? if (value.length) { ? ? ? ? ? this.changeInput(index + 1); ? ? ? ? } ? ? ? ? //#end ? ? ? ? e.target.value = value; ? ? ? ? this.debounceValidate(); ? ? ? }, ? ? ? changeInput(index) { ? ? ? ? if (index < 0 || index === this.phoneLength) return; ? ? ? ? const target = this.$refs[this.numberRefName + index][0]; ? ? ? ? target.focus(); ? ? ? ? if (target.value && target.setSelectionRange) { ? ? ? ? ? target.setSelectionRange(1, 1);//maxlength="1" 時(shí)無(wú)效,所以去掉了... ? ? ? ? } ? ? ? }, ? ? ? deleteNumber(e, index) { ? ? ? ? if (e.target.value) { ? ? ? ? ? e.target.value = '' ? ? ? ? } else { ? ? ? ? ? this.changeInput(index - 1); ? ? ? ? } ? ? ? }, ? ? ? resetStatus() { ? ? ? ? this.validated = false; ? ? ? ? this.dirty = false; ? ? ? }, ? ? ? cleanValue() { ? ? ? ? this.resetStatus(); ? ? ? ? const numberBlocks = this.$refs; ? ? ? ? for (let i in numberBlocks) { ? ? ? ? ? numberBlocks[i][0].value = ''; ? ? ? ? } ? ? ? ? if (this.required) { ? ? ? ? ? const FormItem = this.getFormItem(); ? ? ? ? ? if (FormItem) { ? ? ? ? ? ? FormItem.resetField(); ? ? ? ? ? ? FormItem.$emit('on-form-change', null); ? ? ? ? ? } ? ? ? ? } ? ? ? ? // this.changeInput(0); ? ? ? }, ? ? ? debounceValidate() { ? ? ? ? this.validTimer = setTimeout(() => { ? ? ? ? ? this.validate(); ? ? ? ? }, 300); ? ? ? }, ? ? ? validate(isLeave) { ? ? ? ? const numberBlocks = this.$refs; ? ? ? ? let result = ''; ? ? ? ? for (let i in numberBlocks) { ? ? ? ? ? result += numberBlocks[i][0].value; ? ? ? ? } ? ? ? ? if (result.length === this.phoneLength || isLeave) { ? ? ? ? ? this.validated = true; ? ? ? ? ? this.dispath({ ? ? ? ? ? ? value: result, ? ? ? ? ? ? valid: this.valid = this.phoneReg.test(result), ? ? ? ? ? }); ? ? ? ? } ? ? ? }, ? ? ? dispath(info) { ? ? ? ? this.$emit('input', info.valid ? info.value : ''); ? ? ? ? if (this.required) { ? ? ? ? ? const FormItem = this.getFormItem(); ? ? ? ? ? if (FormItem) { ? ? ? ? ? ? this.updateFormItem(FormItem, info.valid ? info.value : ''); ? ? ? ? ? } ? ? ? ? } ? ? ? }, ? ? ? getFormItem() { ? ? ? ? let MAX_LEVEL = 3; ? ? ? ? let parent = this.$parent; ? ? ? ? let name = parent.$options.name; ? ? ? ? while (MAX_LEVEL && name !== 'FormItem') { ? ? ? ? ? MAX_LEVEL--; ? ? ? ? ? if (!parent) return null; ? ? ? ? ? parent = parent.$parent; ? ? ? ? } ? ? ? ? return parent || null; ? ? ? }, ? ? ? updateFormItem(FormItem, data) { ? ? ? ? FormItem.$emit('on-form-change', data); ? ? ? }, ? ? ? pageEvent() { ? ? ? ? if (this.dirty) { ? ? ? ? ? this.validate(true); ? ? ? ? } ? ? ? }, ? ? }, ? ? created() { ? ? ? window.addEventListener('click', this.pageEvent); ? ? }, ? ? beforeDestroy() { ? ? ? window.removeEventListener('click', this.pageEvent); ? ? }, ? }; </script> ? <style scoped lang="less"> ? .ivu-phone-input { ? ? .clean-btn { ? ? ? transition: opacity .5s; ? ? ? opacity: 0; ? ? ? cursor: pointer; ? ? } ? ? &:hover { ? ? ? .clean-btn { ? ? ? ? opacity: 1; ? ? ? } ? ? } ? } ? ? .number-block { ? ? display: inline-block; ? ? padding: 0; ? ? height: 30px; ? ? width: 28px; ? ? text-align: center; ? ? margin-right: 2px; ? ? &:nth-child(3) { ? ? ? margin-right: 10px; ? ? } ? ? &:nth-child(7) { ? ? ? margin-right: 10px; ? ? } ? } </style>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
利用vue和element-ui設(shè)置表格內(nèi)容分頁(yè)的實(shí)例
下面小編就為大家分享一篇利用vue和element-ui設(shè)置表格內(nèi)容分頁(yè)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03vue從一個(gè)頁(yè)面跳轉(zhuǎn)到另一個(gè)頁(yè)面并攜帶參數(shù)的解決方法
這篇文章主要介紹了vue從一個(gè)頁(yè)面跳轉(zhuǎn)到另一個(gè)頁(yè)面并攜帶參數(shù)的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08vue自定義移動(dòng)端touch事件之點(diǎn)擊、滑動(dòng)、長(zhǎng)按事件
這篇文章主要介紹了vue自定義移動(dòng)端touch事件之點(diǎn)擊、滑動(dòng)、長(zhǎng)按事件的實(shí)例代碼,需要的朋友可以參考下2018-07-07詳解通過(guò)JSON數(shù)據(jù)使用VUE.JS
本篇文章主要介紹了詳解通過(guò)JSON數(shù)據(jù)使用VUE.JS,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05