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