| <template> | |
| 	<view | |
| 		class="uv-keyboard" | |
| 		@touchmove.stop.prevent="noop" | |
| 	> | |
| 		<view | |
| 			v-for="(group, i) in abc ? engKeyBoardList : areaList" | |
| 			:key="i" | |
| 			class="uv-keyboard__button" | |
| 			:index="i" | |
| 			:class="[i + 1 === 4 && 'uv-keyboard__button--center']" | |
| 		> | |
| 			<view | |
| 				v-if="i === 3" | |
| 				class="uv-keyboard__button__inner-wrapper" | |
| 			> | |
| 				<view | |
| 					class="uv-keyboard__button__inner-wrapper__left" | |
| 					hover-class="uv-hover-class" | |
| 					:hover-stay-time="200" | |
| 					@tap="changeCarInputMode" | |
| 				> | |
| 					<slot> | |
| 						<template v-if="!customabc"> | |
| 							<text | |
| 								class="uv-keyboard__button__inner-wrapper__left__lang" | |
| 								:class="[!abc && 'uv-keyboard__button__inner-wrapper__left__lang--active']" | |
| 							>中</text> | |
| 							<text class="uv-keyboard__button__inner-wrapper__left__line">/</text> | |
| 							<text | |
| 								class="uv-keyboard__button__inner-wrapper__left__lang" | |
| 								:class="[abc && 'uv-keyboard__button__inner-wrapper__left__lang--active']" | |
| 							>英</text> | |
| 						</template> | |
| 					</slot> | |
| 				</view> | |
| 			</view> | |
| 			<view | |
| 				class="uv-keyboard__button__inner-wrapper" | |
| 				v-for="(item, j) in group" | |
| 				:key="j" | |
| 			> | |
| 				<view | |
| 					:class="['uv-keyboard__button__inner-wrapper__inner',{'uv-keyboard__button__inner-wrapper__inner--disabled': isDisabled(i,j)}]" | |
| 					:hover-stay-time="200" | |
| 					@tap="carInputClick(i, j)" | |
| 					:hover-class="isDisabled(i,j)?'none':'uv-hover-class'" | |
| 				> | |
| 					<text class="uv-keyboard__button__inner-wrapper__inner__text">{{ item }}</text> | |
| 				</view> | |
| 				<view class="uv-keyboard__button__inner-wrapper__disabled--mask" v-if="isDisabled(i,j)"></view> | |
| 			</view> | |
| 			<view | |
| 				v-if="i === 3" | |
| 				@touchstart="backspaceClick" | |
| 				@touchend="clearTimer" | |
| 				class="uv-keyboard__button__inner-wrapper" | |
| 			> | |
| 				<view | |
| 					class="uv-keyboard__button__inner-wrapper__right" | |
| 					hover-class="uv-hover-class" | |
| 					:hover-stay-time="200" | |
| 				> | |
| 					<uv-icon | |
| 						size="28" | |
| 						name="backspace" | |
| 						color="#303133" | |
| 					></uv-icon> | |
| 				</view> | |
| 			</view> | |
| 		</view> | |
| 	</view> | |
| </template> | |
|  | |
| <script> | |
| 	import mpMixin from '@/uni_modules/uv-ui-tools/libs/mixin/mpMixin.js' | |
| 	import mixin from '@/uni_modules/uv-ui-tools/libs/mixin/mixin.js' | |
| 	import props from './props.js'; | |
| 	/** | |
| 	 * keyboard 键盘组件 | |
| 	 * @description 此为uvui自定义的键盘面板,内含了数字键盘,车牌号键,身份证号键盘3种模式,都有可以打乱按键顺序的选项。 | |
| 	 * @tutorial https://www.uvui.cn/components/keyboard.html | |
| 	 * @property {Boolean} random 是否打乱键盘的顺序 | |
| 	 * @event {Function} change 点击键盘触发 | |
| 	 * @event {Function} backspace 点击退格键触发 | |
| 	 * @example <uv-keyboard ref="uKeyboard" mode="car" v-model="show"></uv-keyboard> | |
| 	 */ | |
| 	export default { | |
| 		name: "uv-keyboard", | |
| 		mixins: [mpMixin, mixin, props], | |
| 		emits: ['backspace','change','changeCarInputMode'], | |
| 		data() { | |
| 			return { | |
| 				// 车牌输入时,abc=true为输入车牌号码,bac=false为输入省份中文简称 | |
| 				abc: false | |
| 			}; | |
| 		}, | |
| 		computed: { | |
| 			areaList() { | |
| 				let data = [ | |
| 					'京', | |
| 					'沪', | |
| 					'粤', | |
| 					'津', | |
| 					'冀', | |
| 					'豫', | |
| 					'云', | |
| 					'辽', | |
| 					'黑', | |
| 					'湘', | |
| 					'皖', | |
| 					'鲁', | |
| 					'苏', | |
| 					'浙', | |
| 					'赣', | |
| 					'鄂', | |
| 					'桂', | |
| 					'甘', | |
| 					'晋', | |
| 					'陕', | |
| 					'蒙', | |
| 					'吉', | |
| 					'闽', | |
| 					'贵', | |
| 					'渝', | |
| 					'川', | |
| 					'青', | |
| 					'琼', | |
| 					'宁', | |
| 					'挂', | |
| 					'藏', | |
| 					'港', | |
| 					'澳', | |
| 					'新', | |
| 					'使', | |
| 					'学' | |
| 				]; | |
| 				let tmp = []; | |
| 				// 打乱顺序 | |
| 				if (this.random) data = this.$uv.randomArray(data); | |
| 				// 切割成二维数组 | |
| 				tmp[0] = data.slice(0, 10); | |
| 				tmp[1] = data.slice(10, 20); | |
| 				tmp[2] = data.slice(20, 30); | |
| 				tmp[3] = data.slice(30, 36); | |
| 				return tmp; | |
| 			}, | |
| 			engKeyBoardList() { | |
| 				let data = [ | |
| 					1, | |
| 					2, | |
| 					3, | |
| 					4, | |
| 					5, | |
| 					6, | |
| 					7, | |
| 					8, | |
| 					9, | |
| 					0, | |
| 					'Q', | |
| 					'W', | |
| 					'E', | |
| 					'R', | |
| 					'T', | |
| 					'Y', | |
| 					'U', | |
| 					'I', | |
| 					'O', | |
| 					'P', | |
| 					'A', | |
| 					'S', | |
| 					'D', | |
| 					'F', | |
| 					'G', | |
| 					'H', | |
| 					'J', | |
| 					'K', | |
| 					'L', | |
| 					'Z', | |
| 					'X', | |
| 					'C', | |
| 					'V', | |
| 					'B', | |
| 					'N', | |
| 					'M' | |
| 				]; | |
| 				let tmp = []; | |
| 				if (this.random) data = this.$uv.randomArray(data); | |
| 				tmp[0] = data.slice(0, 10); | |
| 				tmp[1] = data.slice(10, 20); | |
| 				tmp[2] = data.slice(20, 30); | |
| 				tmp[3] = data.slice(30, 36); | |
| 				return tmp; | |
| 			}, | |
| 			isDisabled(i,j) { | |
| 				return (i,j)=>{ | |
| 					let value = ''; | |
| 					if (this.abc) value = this.engKeyBoardList[i][j]; | |
| 					else value = this.areaList[i][j]; | |
| 					return this.disKeys.indexOf(value) > -1; | |
| 				} | |
| 			} | |
| 		}, | |
| 		methods: { | |
| 			// 点击键盘按钮 | |
| 			carInputClick(i, j) { | |
| 				if(this.isDisabled(i,j)) return; | |
| 				let value = ''; | |
| 				// 不同模式,获取不同数组的值 | |
| 				if (this.abc) value = this.engKeyBoardList[i][j]; | |
| 				else value = this.areaList[i][j]; | |
| 				// 如果允许自动切换,则将中文状态切换为英文 | |
| 				if (!this.abc && this.autoChange) this.$uv.sleep(200).then(() => this.abc = true) | |
| 				this.$emit('change', value); | |
| 			}, | |
| 			// 修改汽车牌键盘的输入模式,中文|英文 | |
| 			changeCarInputMode() { | |
| 				this.abc = !this.abc; | |
| 				this.$emit('changeCarInputMode',this.abc); | |
| 			}, | |
| 			// 点击退格键 | |
| 			backspaceClick() { | |
| 				this.$emit('backspace'); | |
| 				clearInterval(this.timer); //再次清空定时器,防止重复注册定时器 | |
| 				this.timer = null; | |
| 				this.timer = setInterval(() => { | |
| 					this.$emit('backspace'); | |
| 				}, 250); | |
| 			}, | |
| 			clearTimer() { | |
| 				clearInterval(this.timer); | |
| 				this.timer = null; | |
| 			}, | |
| 		} | |
| 	}; | |
| </script> | |
| 
 | |
| <style lang="scss" scoped> | |
| 	$show-hover: 1; | |
| 	@import '@/uni_modules/uv-ui-tools/libs/css/variable.scss'; | |
| 	@import '@/uni_modules/uv-ui-tools/libs/css/components.scss'; | |
| 	@import '@/uni_modules/uv-ui-tools/libs/css/color.scss'; | |
| 	$uv-car-keyboard-background-color: rgb(224, 228, 230) !default; | |
| 	$uv-car-keyboard-padding:6px 0 6px !default; | |
| 	$uv-car-keyboard-button-inner-width:64rpx !default; | |
| 	$uv-car-keyboard-button-inner-background-color:#FFFFFF !default; | |
| 	$uv-car-keyboard-button-height:80rpx !default; | |
| 	$uv-car-keyboard-button-inner-box-shadow:0 1px 0px #999992 !default; | |
| 	$uv-car-keyboard-button-border-radius:4px !default; | |
| 	$uv-car-keyboard-button-inner-margin:8rpx 5rpx !default; | |
| 	$uv-car-keyboard-button-text-font-size:16px !default; | |
| 	$uv-car-keyboard-button-text-color:$uv-main-color !default; | |
| 	$uv-car-keyboard-center-inner-margin: 0 4rpx !default; | |
| 	$uv-car-keyboard-special-button-width:134rpx !default; | |
| 	$uv-car-keyboard-lang-font-size:16px !default; | |
| 	$uv-car-keyboard-lang-color:$uv-main-color !default; | |
| 	$uv-car-keyboard-active-color:$uv-primary !default; | |
| 	$uv-car-keyboard-line-font-size:15px !default; | |
| 	$uv-car-keyboard-line-color:$uv-main-color !default; | |
| 	$uv-car-keyboard-line-margin:0 1px !default; | |
| 	$uv-car-keyboard-uv-hover-class-background-color:#BBBCC6 !default; | |
| 
 | |
| 	.uv-keyboard { | |
| 		@include flex(column); | |
| 		justify-content: space-around; | |
| 		background-color: $uv-car-keyboard-background-color; | |
| 		align-items: stretch; | |
| 		padding: $uv-car-keyboard-padding; | |
| 
 | |
| 		&__button { | |
| 			@include flex; | |
| 			justify-content: center; | |
| 			flex: 1; | |
| 			/* #ifndef APP-NVUE */ | |
| 			/* #endif */ | |
| 
 | |
| 			&__inner-wrapper { | |
| 				position: relative; | |
| 				box-shadow: $uv-car-keyboard-button-inner-box-shadow; | |
| 				margin: $uv-car-keyboard-button-inner-margin; | |
| 				border-radius: $uv-car-keyboard-button-border-radius; | |
| 				 | |
| 				&__disabled--mask { | |
| 					position: absolute; | |
| 					left: 0; | |
| 					top: 0; | |
| 					bottom: 0; | |
| 					right: 0; | |
| 					width: $uv-car-keyboard-button-inner-width; | |
| 					height: $uv-car-keyboard-button-height; | |
| 				} | |
| 
 | |
| 				&__inner { | |
| 					@include flex; | |
| 					justify-content: center; | |
| 					align-items: center; | |
| 					width: $uv-car-keyboard-button-inner-width; | |
| 					background-color: $uv-car-keyboard-button-inner-background-color; | |
| 					height: $uv-car-keyboard-button-height; | |
| 					border-radius: $uv-car-keyboard-button-border-radius; | |
| 					 | |
| 					&--disabled { | |
| 						opacity: 0.5; | |
| 					} | |
| 
 | |
| 					&__text { | |
| 						font-size: $uv-car-keyboard-button-text-font-size; | |
| 						color: $uv-car-keyboard-button-text-color; | |
| 					} | |
| 				} | |
| 
 | |
| 				&__left, | |
| 				&__right { | |
| 					border-radius: $uv-car-keyboard-button-border-radius; | |
| 					width: $uv-car-keyboard-special-button-width; | |
| 					height: $uv-car-keyboard-button-height; | |
| 					background-color: $uv-car-keyboard-uv-hover-class-background-color; | |
| 					@include flex; | |
| 					justify-content: center; | |
| 					align-items: center; | |
| 					box-shadow: $uv-car-keyboard-button-inner-box-shadow; | |
| 				} | |
| 
 | |
| 				&__left { | |
| 					&__line { | |
| 						font-size: $uv-car-keyboard-line-font-size; | |
| 						color: $uv-car-keyboard-line-color; | |
| 						margin: $uv-car-keyboard-line-margin; | |
| 					} | |
| 
 | |
| 					&__lang { | |
| 						font-size: $uv-car-keyboard-lang-font-size; | |
| 						color: $uv-car-keyboard-lang-color; | |
| 
 | |
| 						&--active { | |
| 							color: $uv-car-keyboard-active-color; | |
| 						} | |
| 					} | |
| 				} | |
| 			} | |
| 		} | |
| 	} | |
| 
 | |
| 	.uv-hover-class { | |
| 		background-color: $uv-car-keyboard-uv-hover-class-background-color; | |
| 	} | |
| </style>
 |