123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 |
- <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>
|