<template> <div class="common_conponents common_conponents_base_input"> <div class="input_item_wrap" v-if="property.type === 'text' || property.type === 'password'"> <div class="input_item clearfix" :style="cssText" :class="{'active': activeLight, 'noEnpty': value, 'error': property.errorFlag}"> <div class="base_input_wrap"> <div class="label">{{property.label}}</div> <div class="base_input"> <input :type="property.type || 'text'" :value="value" :ref="property.name" autocomplete="off" :maxlength="property.maxlength || '100'" :placeholder="property.placeholder || ''" @input="handle('input',$event.target.value, $event)" @focus="handle('focus',$event.target.value, $event)" @blur="handle('blur', $event.target.value, $event)"> </div> <div class="other_icon clearfix"> <div class="clear_wrap icon_wrap" v-if="value && property.visibe && property.visibe.eye" @click="changeEye"> <i class="iconfont " :class="property.type === 'password' ? 'iconic_see_pressed' : 'iconic_see_default'"></i> </div> <div class="eye_wrap icon_wrap" v-if="value && (property.visibe && property.visibe.clear)" @click="clearValue"> <i class="iconfont iconic_clos"></i> </div> </div> <span class="tips" v-if="property.errorFlag">{{property.errorText}}</span> </div> </div> </div> <div class="input_item_wrap" v-if="property.type === 'divide'"> <div class="input_item clearfix" :style="cssText" :class="{'active': activeLight, 'noEnpty': value, 'error': property.errorFlag}"> <div class="base_input_wrap"> <div class="label">{{property.label}}</div> <div class="input_num"> <div class="num clearfix"> <span v-for="(item, index) in codeLength" :key='index' :ref="'item' + index"> <!-- {{value.charAt(index)}} --> <em v-if="value && value.length >= index">{{value.charAt(index)}}</em> </span> </div> </div> <div class="base_input" style="visible:hidden;opacity: 0;"> <input :type="property.type || 'text'" :value="value" :ref="property.name" autocomplete="off" :maxlength="property.maxlength || '100'" :placeholder="property.placeholder || ''" @input="handle('input',$event.target.value=$event.target.value.replace(/[^d]/g,''), $event)" @focus="handle('focus',$event.target.value, $event)" @blur="handle('blur', $event.target.value, $event)"> </div> <span class="tips" v-if="property.errorFlag">{{property.errorText}}</span> </div> </div> </div> </div> </template> <script> export default { name: 'baseInput', data() { return { codeLength: this.property.maxlength || 6, activeLight: false, // 是否获得焦点 } }, props: { property: { type: Object, default: () => {} }, value: { type: [String, Number], default: '', }, cssText: { type: Object, default: () => {}, }, }, watch: { 'value' (val) { if (this.property.type === 'divide') { let len = val.length if (len === this.codeLength) { console.log('输入完成') } for (let i = 0; i < this.codeLength; i++) { this.$nextTick(() => { if (this.$refs['item' + i]) { this.$refs['item' + i][0].className = '' } }) } this.$nextTick(() => { // val && (this.$refs['item' + val.length-1][0].className = 'prev_span') if (val.length > 0) { this.$refs['item' + (val.length-1)][0].className = 'prev_span' } if (!(val.length >= this.codeLength)) { this.$refs['item' + val.length][0].className = 'input_span' } }) } } }, methods: { // 清除值 clearValue() { this.$emit('input', '') }, // 清除值 changeEye() { this.property.type = this.property.type === 'password' ? 'text' : 'password' }, // 向父组件派发input的各种事件 handle(type, data, e) { if (type === 'focus') { this.activeLight = true } else if (type === 'blur') { this.activeLight = false } let obj = { handleType: type, value: data } if (type === 'input') { // this.clearErrorInfo(data) } this.$emit('input', data) this.$emit('onevents', obj) }, }, } </script>