| <template> | 
|   <view class="tn-number-keyboard-class tn-number-keyboard" @touchmove.stop.prevent="() => {}"> | 
|     <view class="tn-number-keyboard__grids"> | 
|       <view | 
|         v-for="(item, index) in dataList" | 
|         :key="index" | 
|         class="tn-number-keyboard__grids__item" | 
|         :class="{ | 
|           'tn-bg-gray--light': showGaryBg(index), | 
|           'tn-border-solid-top': index <= 2, | 
|           'tn-border-solid-bottom': index < 9, | 
|           'tn-border-solid-right': (index + 1) % 3 != 0 | 
|         }" | 
|         :hover-class="hoverClass(index)" | 
|         :hover-stay-time="150" | 
|         @tap="keyboardClick(item)" | 
|       > | 
|         <view class="tn-number-keyboard__grids__btn">{{ item }}</view> | 
|       </view> | 
|        | 
|       <view | 
|         class="tn-number-keyboard__grids__item tn-bg-gray--light" | 
|         hover-class="tn-hover" | 
|         :hover-stay-time="150" | 
|         @touchstart.stop="backspaceClick" | 
|         @touchend="clearTimer" | 
|       > | 
|         <view class="tn-number-keyboard__grids__btn tn-number-keyboard__back"> | 
|           <view class="tn-icon-left-arrow tn-number-keyboard__back__icon"></view> | 
|         </view> | 
|       </view> | 
|     </view> | 
|   </view> | 
| </template> | 
|   | 
| <script> | 
|   export default { | 
|     name: 'tn-number-keyboard', | 
|     props: { | 
|       // 键盘类型 | 
|       // number -> 数字键盘 card -> 身份证键盘 | 
|       mode: { | 
|         type: String, | 
|         default: 'number' | 
|       }, | 
|       // 是否显示键盘的'.'符号 | 
|       dotEnabled: { | 
|         type: Boolean, | 
|         default: true | 
|       }, | 
|       // 是否为乱序键盘 | 
|       randomEnabled: { | 
|         type: Boolean, | 
|         default: false | 
|       } | 
|     }, | 
|     computed: { | 
|       // 键盘显示的内容 | 
|       dataList() { | 
|         let tmp = [] | 
|         if (!this.dotEnabled && this.mode === 'number') { | 
|           if (!this.randomEnabled) { | 
|             return [1, 2, 3, 4, 5, 6, 7, 8, 9, '', 0] | 
|           } else { | 
|             let data = this.$t.array.random([1, 2, 3, 4, 5, 6, 7, 8, 9, 0]) | 
|             data.splice(-1, 0, '') | 
|             return data | 
|           } | 
|         } else if (this.dotEnabled && this.mode === 'number') { | 
|           if (!this.randomEnabled) { | 
|             return [1, 2, 3, 4, 5, 6, 7, 8, 9, this.dot, 0] | 
|           } else { | 
|             let data = this.$t.array.random([1, 2, 3, 4, 5, 6, 7, 8, 9, 0]) | 
|             data.splice(-1, 0, this.dot) | 
|             return data | 
|           } | 
|         } else if (this.mode === 'card') { | 
|           if (!this.randomEnabled) { | 
|             return [1, 2, 3, 4, 5, 6, 7, 8, 9, this.cardX, 0] | 
|           } else { | 
|             let data = this.$t.array.random([1, 2, 3, 4, 5, 6, 7, 8, 9, 0]) | 
|             data.splice(-1, 0, this.cardX) | 
|             return data | 
|           } | 
|         } | 
|       }, | 
|       // 按键的样式 | 
|       keyStyle() { | 
|         return index => { | 
|           let style = {} | 
|           if (this.mode === 'number' && !this.dotEnabled && index === 9) style.flex = '0 0 66.6666666666%' | 
|           return style | 
|         } | 
|       }, | 
|       // 是否让按键显示灰色,只在数字键盘和非乱序且在点击时 | 
|       showGaryBg() { | 
|         return index => { | 
|           if (!this.randomEnabled && index === 9 && (this.mode !== 'number' || (this.mode === 'number' && this.dotEnabled))) return true | 
|           else return false | 
|         } | 
|       }, | 
|       // 手指停留的class | 
|       hoverClass() { | 
|         return index => { | 
|           if (this.mode === 'number' && !this.dotEnabled && index === 9) return '' | 
|           if (!this.randomEnabled && index === 9 && (this.mode === 'number' && this.dotEnabled || this.mode === 'card')) return 'tn-hover' | 
|           else return 'tn-number-keyboard--hover' | 
|         } | 
|       } | 
|     }, | 
|     data() { | 
|       return { | 
|         // 退格键内容 | 
|         backspace: 'backspace', | 
|         // 点内容 | 
|         dot: '.', | 
|         // 长按多次删除事件监听 | 
|         longPressDeleteTimer: null, | 
|         // 身份证的X符号 | 
|         cardX: 'X' | 
|       } | 
|     }, | 
|     methods: { | 
|       // 点击退格键 | 
|       backspaceClick() { | 
|         this.$emit('backspace') | 
|         this.clearTimer() | 
|         this.longPressDeleteTimer = setInterval(() => { | 
|           this.$emit('backspace') | 
|         }, 250) | 
|       }, | 
|       // 获取键盘显示的内容 | 
|       keyboardClick(value) { | 
|         if (this.mode === 'number' && !this.dotEnabled && value === '') return | 
|         // 允许键盘显示点模式和触发非点按键时,将内容转换为数字类型 | 
|         if (this.dotEnabled && value != this.dot && value != this.cardX) value = Number(value) | 
|         this.$emit('change', value) | 
|       }, | 
|       // 清除定时器 | 
|       clearTimer() { | 
|         if (this.longPressDeleteTimer) { | 
|           clearInterval(this.longPressDeleteTimer) | 
|           this.longPressDeleteTimer = null | 
|         } | 
|       } | 
|     } | 
|   } | 
| </script> | 
|   | 
| <style lang="scss" scoped> | 
|   .tn-number-keyboard { | 
|     position: relative; | 
|      | 
|     &__grids { | 
|       display: flex; | 
|       flex-direction: row; | 
|       flex-wrap: wrap; | 
|       justify-content: flex-end; | 
|        | 
|       &__item { | 
|         display: flex; | 
|         flex-direction: row; | 
|         flex: 0 0 33.3333333333%; | 
|         align-items: center; | 
|         justify-content: center; | 
|         height: 110rpx; | 
|         text-align: center; | 
|         font-size: 50rpx; | 
|         color: $tn-font-color; | 
|         font-weight: 500; | 
|       } | 
|     } | 
|      | 
|     &__back { | 
|       font-size: 38rpx; | 
|     } | 
|      | 
|     &--hover { | 
|       background-color: $tn-font-holder-color; | 
|     } | 
|   } | 
| </style> |