| <template> |
| <view class="u-keyboard" @touchmove.stop.prevent="() => {}"> |
| <view class="u-keyboard-grids"> |
| <block> |
| <view class="u-keyboard-grids-item" v-for="(group, i) in abc ? EngKeyBoardList : areaList" :key="i"> |
| <view :hover-stay-time="100" @tap="carInputClick(i, j)" hover-class="u-carinput-hover" class="u-keyboard-grids-btn" |
| v-for="(item, j) in group" :key="j"> |
| {{ item }} |
| </view> |
| </view> |
| <view @touchstart="backspaceClick" @touchend="clearTimer" :hover-stay-time="100" class="u-keyboard-back" |
| hover-class="u-hover-class"> |
| <u-icon :size="38" name="backspace" :bold="true"></u-icon> |
| </view> |
| <view :hover-stay-time="100" class="u-keyboard-change" hover-class="u-carinput-hover" @tap="changeCarInputMode"> |
| <text class="zh" :class="[!abc ? 'active' : 'inactive']">中</text> |
| / |
| <text class="en" :class="[abc ? 'active' : 'inactive']">英</text> |
| </view> |
| </block> |
| </view> |
| </view> |
| </template> |
| |
| <script> |
| export default { |
| name: "u-keyboard", |
| props: { |
| // 是否打乱键盘按键的顺序 |
| random: { |
| type: Boolean, |
| default: false |
| } |
| }, |
| data() { |
| return { |
| // 车牌输入时,abc=true为输入车牌号码,bac=false为输入省份中文简称 |
| abc: false |
| }; |
| }, |
| computed: { |
| areaList() { |
| let data = [ |
| '京', |
| '沪', |
| '粤', |
| '津', |
| '冀', |
| '豫', |
| '云', |
| '辽', |
| '黑', |
| '湘', |
| '皖', |
| '鲁', |
| '苏', |
| '浙', |
| '赣', |
| '鄂', |
| '桂', |
| '甘', |
| '晋', |
| '陕', |
| '蒙', |
| '吉', |
| '闽', |
| '贵', |
| '渝', |
| '川', |
| '青', |
| '琼', |
| '宁', |
| '挂', |
| '藏', |
| '港', |
| '澳', |
| '新', |
| '使', |
| '学' |
| ]; |
| let tmp = []; |
| // 打乱顺序 |
| if (this.random) data = this.$u.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.$u.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; |
| } |
| }, |
| methods: { |
| // 点击键盘按钮 |
| carInputClick(i, j) { |
| let value = ''; |
| // 不同模式,获取不同数组的值 |
| if (this.abc) value = this.EngKeyBoardList[i][j]; |
| else value = this.areaList[i][j]; |
| this.$emit('change', value); |
| }, |
| // 修改汽车牌键盘的输入模式,中文|英文 |
| changeCarInputMode() { |
| this.abc = !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> |
| @import "../../libs/css/style.components.scss"; |
| |
| .u-keyboard-grids { |
| background: rgb(215, 215, 217); |
| padding: 24rpx 0; |
| position: relative; |
| } |
| |
| .u-keyboard-grids-item { |
| @include vue-flex; |
| align-items: center; |
| justify-content: center; |
| } |
| |
| .u-keyboard-grids-btn { |
| text-decoration: none; |
| width: 62rpx; |
| flex: 0 0 64rpx; |
| height: 80rpx; |
| /* #ifndef APP-NVUE */ |
| display: inline-flex; |
| /* #endif */ |
| font-size: 36rpx; |
| text-align: center; |
| line-height: 80rpx; |
| background-color: #fff; |
| margin: 8rpx 5rpx; |
| border-radius: 8rpx; |
| box-shadow: 0 2rpx 0rpx #888992; |
| font-weight: 500; |
| justify-content: center; |
| } |
| |
| .u-carinput-hover { |
| background-color: rgb(185, 188, 195) !important; |
| } |
| |
| .u-keyboard-back { |
| position: absolute; |
| width: 96rpx; |
| right: 22rpx; |
| bottom: 32rpx; |
| height: 80rpx; |
| background-color: rgb(185, 188, 195); |
| @include vue-flex; |
| align-items: center; |
| border-radius: 8rpx; |
| justify-content: center; |
| box-shadow: 0 2rpx 0rpx #888992; |
| } |
| |
| .u-keyboard-change { |
| font-size: 24rpx; |
| box-shadow: 0 2rpx 0rpx #888992; |
| position: absolute; |
| width: 96rpx; |
| left: 22rpx; |
| line-height: 1; |
| bottom: 32rpx; |
| height: 80rpx; |
| background-color: #ffffff; |
| @include vue-flex; |
| align-items: center; |
| border-radius: 8rpx; |
| justify-content: center; |
| } |
| |
| .u-keyboard-change .inactive.zh { |
| transform: scale(0.85) translateY(-10rpx); |
| } |
| |
| .u-keyboard-change .inactive.en { |
| transform: scale(0.85) translateY(10rpx); |
| } |
| |
| .u-keyboard-change .active { |
| color: rgb(237, 112, 64); |
| font-size: 30rpx; |
| } |
| |
| .u-keyboard-change .zh { |
| transform: translateY(-10rpx); |
| } |
| |
| .u-keyboard-change .en { |
| transform: translateY(10rpx); |
| } |
| </style> |