| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 | /*** @author minisola* @version 20190814*/<template>	<view class="so-mask">		<view class="so-plate animation-scale-up">			<view class="so-plate-head">				<view class="so-plate-type">					<radio-group @change="typeChange">						<label>							<radio value="1" :checked="type===1" />							普通车牌						</label>						<label>							<radio value="2" :checked="type===2" />							新能源车牌						</label>					</radio-group>				</view>			</view>			<view class="so-plate-body">				<view class="so-plate-word" :class="{ active: currentInputIndex == 0 }" @tap="inputSwitch" data-index="0">					<text>{{ currentInputValue[0] }}</text>				</view>				<view class="so-plate-word" :class="{ active: currentInputIndex == 1 }" @tap="inputSwitch" data-index="1">					<text>{{ currentInputValue[1] }}</text>				</view>				<view class="so-plate-dot"></view>				<view class="so-plate-word" :class="{ active: currentInputIndex == 2 }" @tap="inputSwitch" data-index="2">					<text>{{ currentInputValue[2] }}</text>				</view>				<view class="so-plate-word" :class="{ active: currentInputIndex == 3 }" @tap="inputSwitch" data-index="3">					<text>{{ currentInputValue[3] }}</text>				</view>				<view class="so-plate-word" :class="{ active: currentInputIndex == 4 }" @tap="inputSwitch" data-index="4">					<text>{{ currentInputValue[4] }}</text>				</view>				<view class="so-plate-word" :class="{ active: currentInputIndex == 5 }" @tap="inputSwitch" data-index="5">					<text>{{ currentInputValue[5] }}</text>				</view>				<view class="so-plate-word" :class="{ active: currentInputIndex == 6 }" @tap="inputSwitch" data-index="6">					<text>{{ currentInputValue[6] }}</text>				</view>				<view class="so-plate-word" :class="{ active: currentInputIndex == 7 }" @tap="inputSwitch" v-if="type == 2" data-index="7">					<text>{{ currentInputValue[7] }}</text>				</view>			</view>			<view class="so-plate-foot">				<view class="so-plate-keyboard"  :style="{height:keyboardHeight}">					<view id="keyboard">						<block v-if="inputType == 1">							<view hover-class="hover" class="so-plate-key" v-for="el of provinceText" :key="el" :data-value="el" @tap="chooseKey">{{ el }}</view>						</block>						<block v-if="inputType == 1">							<text class="so-plate-key fill-block"></text>							<text class="so-plate-key fill-block"></text>						</block>						<block v-if="inputType >= 3">							<view hover-class="hover" class="so-plate-key" v-for="el of numberText" :key="el" :data-value="el" @tap="chooseKey">{{ el }}</view>						</block>						<block v-if="inputType >= 2">							<view hover-class="hover" class="so-plate-key" v-for="el of wordText" :key="el" :data-value="el" @tap="chooseKey">{{ el }}</view>						</block>						<block v-if="inputType == 3">							<text v-for="el of fillBlock" :key="el.num" class="so-plate-key fill-block"></text>						</block>						<block v-if="inputType == 4">							<view hover-class="hover" class="so-plate-key" v-for="el of lastWordText" :key="el" :data-value="el" @tap="chooseKey">{{ el }}</view>						</block>							<text v-if="inputType == 4" class="so-plate-key fill-block"></text>					</view>				</view>				<view class="so-plate-btn-group">					<view>						<button class="so-plate-btn so-plate-btn--cancel" @tap="$emit('close')">取消</button>					</view>					<view>						<button class="so-plate-btn so-plate-btn--delete" @tap="deleteKey">删除</button>						<button class="so-plate-btn so-plate-btn--submit" @tap="exportPlate">完成</button>											</view>									</view>			</view>		</view>	</view></template><script>export default {	name: 'uni-plate-input',	data() {		return {			type: 1, //车牌类型			currentInputIndex: 0, //当前编辑的输入框			currentInputValue: ['', '', '', '', '', '', ''],			fillBlock:[{num:11},{num:12},{num:13},{num:14},{num:15},{num:16}],  //避免:key报错			keyboardHeightInit:false,			keyboardHeight:'auto',			provinceText: [				'粤',				'京',				'冀',				'沪',				'津',				'晋',				'蒙',				'辽',				'吉',				'黑',				'苏',				'浙',				'皖',				'闽',				'赣',				'鲁',				'豫',				'鄂',				'湘',				'桂',				'琼',				'渝',				'川',				'贵',				'云',				'藏',				'陕',				'甘',				'青',				'宁',				'新'			],			numberText: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'],			wordText: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'],			lastWordText: ['港', '澳', '学', '领', '警']		};	},	props: {		plate: {			type: String		}	},	computed: {		//输入框类型		inputType() {			switch (this.currentInputIndex) {				case 0:					return 1;					break;				case 1:					return 2;					break;				case 2:					return 3;					break;				case 3:					return 3;					break;				case 4:					return 3;					break;				case 5:					return 3;					break;				case 6:					return this.type==2 ? 3 :4 ;					break;				case 7:					return 4;					break;				default:					return 1;					break;			}		}	},	watch:{		currentInputIndex:function(n,o){			if(!this.keyboardHeightInit) return				this.$nextTick(()=>{					this.changeKeyboardHeight()				})		}	},	methods: {		//车牌类型切换		typeChange(e) {			const {value} = e.detail;			this.type = parseInt(value)			this.currentInputIndex = 0			if(value==1){				this.currentInputValue = ['','','','','','','']			}else{				this.currentInputValue = ['','','','','','','','']			}		},		inputSwitch(e) {			const { index } = e.currentTarget.dataset;			this.currentInputIndex = parseInt(index);		},		chooseKey(e) {			const { value } = e.currentTarget.dataset;			this.$set(this.currentInputValue, this.currentInputIndex, value);			if(this.type==1 && this.currentInputIndex<6){				this.currentInputIndex++			}			if(this.type==2 && this.currentInputIndex<7){				this.currentInputIndex++			}		},		deleteKey(){				this.$set(this.currentInputValue,this.currentInputIndex,'')				if(this.currentInputIndex!=0) this.currentInputIndex--		},		exportPlate(){			const plate = this.currentInputValue.join('')			let err = false			if(this.type===1&&plate.length!=7){				err = true			}else if(this.type===2&&plate.length!=8){				err = true			}			if(err) return uni.showToast({				title:'请输入完整的车牌号码',				icon:'none'			})						this.$emit('export',plate)		},		changeKeyboardHeight(){			const that = this			const query = uni.createSelectorQuery().in(this);			query.select('#keyboard').boundingClientRect();			query.exec(function(res) {				if(res&&res[0]){					that.keyboardHeight = res[0].height + uni.upx2px(30) + 'px'					that.keyboardHeightInit = true				}			});		}	},	mounted() {		console.log(this.plate);		const plateKey = this.plate.split('')		if(plateKey.length===7){			this.type=1		}else if(plateKey.length===8){			this.type=2		}		if(plateKey.length===7 || plateKey.length===8){			this.currentInputValue = plateKey			this.currentInputIndex = plateKey.length-1		}		setTimeout(() => {  //在动画结束之后才开始获取			this.$nextTick(()=>{				this.changeKeyboardHeight()			})		}, 500);	}};</script><style scoped lang="less">@import './uni-plate-input';</style>
 |