<template>  
 | 
    <view  
 | 
        class="u-keyboard"  
 | 
        @touchmove.stop.prevent="noop"  
 | 
    >  
 | 
        <view  
 | 
            v-for="(group, i) in abc ? engKeyBoardList : areaList"  
 | 
            :key="i"  
 | 
            class="u-keyboard__button"  
 | 
            :index="i"  
 | 
            :class="[i + 1 === 4 && 'u-keyboard__button--center']"  
 | 
        >  
 | 
            <view  
 | 
                v-if="i === 3"  
 | 
                class="u-keyboard__button__inner-wrapper"  
 | 
            >  
 | 
                <view  
 | 
                    class="u-keyboard__button__inner-wrapper__left"  
 | 
                    hover-class="u-hover-class"  
 | 
                    :hover-stay-time="200"  
 | 
                    @tap="changeCarInputMode"  
 | 
                >  
 | 
                    <text  
 | 
                        class="u-keyboard__button__inner-wrapper__left__lang"  
 | 
                        :class="[!abc && 'u-keyboard__button__inner-wrapper__left__lang--active']"  
 | 
                    >中</text>  
 | 
                    <text class="u-keyboard__button__inner-wrapper__left__line">/</text>  
 | 
                    <text  
 | 
                        class="u-keyboard__button__inner-wrapper__left__lang"  
 | 
                        :class="[abc && 'u-keyboard__button__inner-wrapper__left__lang--active']"  
 | 
                    >英</text>  
 | 
                </view>  
 | 
            </view>  
 | 
            <view  
 | 
                class="u-keyboard__button__inner-wrapper"  
 | 
                v-for="(item, j) in group"  
 | 
                :key="j"  
 | 
            >  
 | 
                <view  
 | 
                    class="u-keyboard__button__inner-wrapper__inner"  
 | 
                    :hover-stay-time="200"  
 | 
                    @tap="carInputClick(i, j)"  
 | 
                    hover-class="u-hover-class"  
 | 
                >  
 | 
                    <text class="u-keyboard__button__inner-wrapper__inner__text">{{ item }}</text>  
 | 
                </view>  
 | 
            </view>  
 | 
            <view  
 | 
                v-if="i === 3"  
 | 
                @touchstart="backspaceClick"  
 | 
                @touchend="clearTimer"  
 | 
                class="u-keyboard__button__inner-wrapper"  
 | 
            >  
 | 
                <view  
 | 
                    class="u-keyboard__button__inner-wrapper__right"  
 | 
                    hover-class="u-hover-class"  
 | 
                    :hover-stay-time="200"  
 | 
                >  
 | 
                    <u-icon  
 | 
                        size="28"  
 | 
                        name="backspace"  
 | 
                        color="#303133"  
 | 
                    ></u-icon>  
 | 
                </view>  
 | 
            </view>  
 | 
        </view>  
 | 
    </view>  
 | 
</template>  
 | 
  
 | 
<script>  
 | 
    import props from './props.js';  
 | 
    /**  
 | 
     * keyboard 键盘组件  
 | 
     * @description 此为uView自定义的键盘面板,内含了数字键盘,车牌号键,身份证号键盘3种模式,都有可以打乱按键顺序的选项。  
 | 
     * @tutorial https://uviewui.com/components/keyboard.html  
 | 
     * @property {Boolean} random 是否打乱键盘的顺序  
 | 
     * @event {Function} change 点击键盘触发  
 | 
     * @event {Function} backspace 点击退格键触发  
 | 
     * @example <u-keyboard ref="uKeyboard" mode="car" v-model="show"></u-keyboard>  
 | 
     */  
 | 
    export default {  
 | 
        name: "u-keyboard",  
 | 
        mixins: [uni.$u.mpMixin, uni.$u.mixin, props],  
 | 
        data() {  
 | 
            return {  
 | 
                // 车牌输入时,abc=true为输入车牌号码,bac=false为输入省份中文简称  
 | 
                abc: false  
 | 
            };  
 | 
        },  
 | 
        computed: {  
 | 
            areaList() {  
 | 
                let data = [  
 | 
                    '京',  
 | 
                    '沪',  
 | 
                    '粤',  
 | 
                    '津',  
 | 
                    '冀',  
 | 
                    '豫',  
 | 
                    '云',  
 | 
                    '辽',  
 | 
                    '黑',  
 | 
                    '湘',  
 | 
                    '皖',  
 | 
                    '鲁',  
 | 
                    '苏',  
 | 
                    '浙',  
 | 
                    '赣',  
 | 
                    '鄂',  
 | 
                    '桂',  
 | 
                    '甘',  
 | 
                    '晋',  
 | 
                    '陕',  
 | 
                    '蒙',  
 | 
                    '吉',  
 | 
                    '闽',  
 | 
                    '贵',  
 | 
                    '渝',  
 | 
                    '川',  
 | 
                    '青',  
 | 
                    '琼',  
 | 
                    '宁',  
 | 
                    '挂',  
 | 
                    '藏',  
 | 
                    '港',  
 | 
                    '澳',  
 | 
                    '新',  
 | 
                    '使',  
 | 
                    '学'  
 | 
                ];  
 | 
                let tmp = [];  
 | 
                // 打乱顺序  
 | 
                if (this.random) data = uni.$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 = uni.$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];  
 | 
                // 如果允许自动切换,则将中文状态切换为英文  
 | 
                if (!this.abc && this.autoChange) uni.$u.sleep(200).then(() => this.abc = true)  
 | 
                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/components.scss";  
 | 
    $u-car-keyboard-background-color: rgb(224, 228, 230) !default;  
 | 
    $u-car-keyboard-padding:6px 0 6px !default;  
 | 
    $u-car-keyboard-button-inner-width:64rpx !default;  
 | 
    $u-car-keyboard-button-inner-background-color:#FFFFFF !default;  
 | 
    $u-car-keyboard-button-height:80rpx !default;  
 | 
    $u-car-keyboard-button-inner-box-shadow:0 1px 0px #999992 !default;  
 | 
    $u-car-keyboard-button-border-radius:4px !default;  
 | 
    $u-car-keyboard-button-inner-margin:8rpx 5rpx !default;  
 | 
    $u-car-keyboard-button-text-font-size:16px !default;  
 | 
    $u-car-keyboard-button-text-color:$u-main-color !default;  
 | 
    $u-car-keyboard-center-inner-margin: 0 4rpx !default;  
 | 
    $u-car-keyboard-special-button-width:134rpx !default;  
 | 
    $u-car-keyboard-lang-font-size:16px !default;  
 | 
    $u-car-keyboard-lang-color:$u-main-color !default;  
 | 
    $u-car-keyboard-active-color:$u-primary !default;  
 | 
    $u-car-keyboard-line-font-size:15px !default;  
 | 
    $u-car-keyboard-line-color:$u-main-color !default;  
 | 
    $u-car-keyboard-line-margin:0 1px !default;  
 | 
    $u-car-keyboard-u-hover-class-background-color:#BBBCC6 !default;  
 | 
  
 | 
    .u-keyboard {  
 | 
        @include flex(column);  
 | 
        justify-content: space-around;  
 | 
        background-color: $u-car-keyboard-background-color;  
 | 
        align-items: stretch;  
 | 
        padding: $u-car-keyboard-padding;  
 | 
  
 | 
        &__button {  
 | 
            @include flex;  
 | 
            justify-content: center;  
 | 
            flex: 1;  
 | 
            /* #ifndef APP-NVUE */  
 | 
            /* #endif */  
 | 
  
 | 
            &__inner-wrapper {  
 | 
                box-shadow: $u-car-keyboard-button-inner-box-shadow;  
 | 
                margin: $u-car-keyboard-button-inner-margin;  
 | 
                border-radius: $u-car-keyboard-button-border-radius;  
 | 
  
 | 
                &__inner {  
 | 
                    @include flex;  
 | 
                    justify-content: center;  
 | 
                    align-items: center;  
 | 
                    width: $u-car-keyboard-button-inner-width;  
 | 
                    background-color: $u-car-keyboard-button-inner-background-color;  
 | 
                    height: $u-car-keyboard-button-height;  
 | 
                    border-radius: $u-car-keyboard-button-border-radius;  
 | 
  
 | 
                    &__text {  
 | 
                        font-size: $u-car-keyboard-button-text-font-size;  
 | 
                        color: $u-car-keyboard-button-text-color;  
 | 
                    }  
 | 
                }  
 | 
  
 | 
                &__left,  
 | 
                &__right {  
 | 
                    border-radius: $u-car-keyboard-button-border-radius;  
 | 
                    width: $u-car-keyboard-special-button-width;  
 | 
                    height: $u-car-keyboard-button-height;  
 | 
                    background-color: $u-car-keyboard-u-hover-class-background-color;  
 | 
                    @include flex;  
 | 
                    justify-content: center;  
 | 
                    align-items: center;  
 | 
                    box-shadow: $u-car-keyboard-button-inner-box-shadow;  
 | 
                }  
 | 
  
 | 
                &__left {  
 | 
                    &__line {  
 | 
                        font-size: $u-car-keyboard-line-font-size;  
 | 
                        color: $u-car-keyboard-line-color;  
 | 
                        margin: $u-car-keyboard-line-margin;  
 | 
                    }  
 | 
  
 | 
                    &__lang {  
 | 
                        font-size: $u-car-keyboard-lang-font-size;  
 | 
                        color: $u-car-keyboard-lang-color;  
 | 
  
 | 
                        &--active {  
 | 
                            color: $u-car-keyboard-active-color;  
 | 
                        }  
 | 
                    }  
 | 
                }  
 | 
            }  
 | 
        }  
 | 
    }  
 | 
  
 | 
    .u-hover-class {  
 | 
        background-color: $u-car-keyboard-u-hover-class-background-color;  
 | 
    }  
 | 
</style>  
 |