221 lines
5.2 KiB
Vue
221 lines
5.2 KiB
Vue
|
<template>
|
|||
|
<view v-if="value" class="tn-keyboard-class tn-keyboard">
|
|||
|
<tn-popup
|
|||
|
v-model="value"
|
|||
|
mode="bottom"
|
|||
|
:popup="false"
|
|||
|
length="auto"
|
|||
|
:mask="mask"
|
|||
|
:maskCloseable="maskCloseable"
|
|||
|
:safeAreaInsetBottom="safeAreaInsetBottom"
|
|||
|
:zIndex="elZIndex"
|
|||
|
@close="popupClose"
|
|||
|
>
|
|||
|
<view>
|
|||
|
<slot></slot>
|
|||
|
</view>
|
|||
|
|
|||
|
<!-- 提示信息 -->
|
|||
|
<view v-if="tooltip" class="tn-keyboard__tooltip">
|
|||
|
<view
|
|||
|
v-if="cancelBtn"
|
|||
|
class="tn-keyboard__tooltip__item tn-keyboard__tooltip__cancel"
|
|||
|
hover-class="tn-keyboard__tooltip__cancel--hover"
|
|||
|
:hover-stay-time="150"
|
|||
|
@tap="onCancel"
|
|||
|
>
|
|||
|
{{ cancelBtn ? cancelText : ''}}
|
|||
|
</view>
|
|||
|
<view v-if="showTips" class="tn-keyboard__tooltip__item tn-keyboard__tooltip__tips">
|
|||
|
{{ tips ? tips : mode === 'number' ? '数字键盘' : mode === 'card' ? '身份证键盘' : '车牌号码键盘'}}
|
|||
|
</view>
|
|||
|
<view
|
|||
|
v-if="confirmBtn"
|
|||
|
class="tn-keyboard__tooltip__item tn-keyboard__tooltip__confirm"
|
|||
|
hover-class="tn-keybord__tooltip__confirm--hover"
|
|||
|
:hover-stay-time="150"
|
|||
|
@tap="onConfirm"
|
|||
|
>
|
|||
|
{{ confirmBtn ? confirmText : ''}}
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
|
|||
|
<!-- 键盘内容 -->
|
|||
|
<block v-if="mode === 'number' || mode === 'card'">
|
|||
|
<tn-number-keyboard :mode="mode" :dotEnabled="dotEnabled" :randomEnabled="randomEnabled" @change="change" @backspace="backspaceClick"></tn-number-keyboard>
|
|||
|
</block>
|
|||
|
<block v-if="mode === 'car'">
|
|||
|
<tn-car-keyboard :randomEnabled="randomEnabled" :switchEnMode="switchEnMode" @change="change" @backspace="backspaceClick"></tn-car-keyboard>
|
|||
|
</block>
|
|||
|
</tn-popup>
|
|||
|
</view>
|
|||
|
</template>
|
|||
|
|
|||
|
<script>
|
|||
|
export default {
|
|||
|
name: 'tn-keyboard',
|
|||
|
props: {
|
|||
|
// 控制键盘弹出收回
|
|||
|
value: {
|
|||
|
type: Boolean,
|
|||
|
default: false
|
|||
|
},
|
|||
|
// 键盘类型
|
|||
|
// number - 数字键盘 card - 身份证键盘 car - 车牌号码
|
|||
|
mode: {
|
|||
|
type: String,
|
|||
|
default: 'number'
|
|||
|
},
|
|||
|
// 当mode = number时,是否显示'.'符号
|
|||
|
dotEnabled: {
|
|||
|
type: Boolean,
|
|||
|
default: true
|
|||
|
},
|
|||
|
// 是否打乱顺序
|
|||
|
randomEnabled: {
|
|||
|
type: Boolean,
|
|||
|
default: false
|
|||
|
},
|
|||
|
// 当mode = car,设置键盘中英文状态
|
|||
|
switchEnMode: {
|
|||
|
type: Boolean,
|
|||
|
default: false
|
|||
|
},
|
|||
|
// 显示顶部工具条
|
|||
|
tooltip: {
|
|||
|
type: Boolean,
|
|||
|
default: true
|
|||
|
},
|
|||
|
// 是否显示提示信息
|
|||
|
showTips: {
|
|||
|
type: Boolean,
|
|||
|
default: true
|
|||
|
},
|
|||
|
// 提示文字
|
|||
|
tips: {
|
|||
|
type: String,
|
|||
|
default: ''
|
|||
|
},
|
|||
|
// 是否显示取消按钮
|
|||
|
cancelBtn: {
|
|||
|
type: Boolean,
|
|||
|
default: true
|
|||
|
},
|
|||
|
// 是否显示确认按钮
|
|||
|
confirmBtn: {
|
|||
|
type: Boolean,
|
|||
|
default: true
|
|||
|
},
|
|||
|
// 取消按钮文字
|
|||
|
cancelText: {
|
|||
|
type: String,
|
|||
|
default: '取消'
|
|||
|
},
|
|||
|
// 确认按钮文字
|
|||
|
confirmText: {
|
|||
|
type: String,
|
|||
|
default: '确认'
|
|||
|
},
|
|||
|
// 是否开启底部安全区适配,开启的话,会在iPhoneX机型底部添加一定的内边距
|
|||
|
safeAreaInsetBottom: {
|
|||
|
type: Boolean,
|
|||
|
default: false
|
|||
|
},
|
|||
|
// 是否可以通过点击遮罩进行关闭
|
|||
|
maskCloseable: {
|
|||
|
type: Boolean,
|
|||
|
default: true
|
|||
|
},
|
|||
|
// 是否显示遮罩
|
|||
|
mask: {
|
|||
|
type: Boolean,
|
|||
|
default: true
|
|||
|
},
|
|||
|
// z-index
|
|||
|
zIndex: {
|
|||
|
type: Number,
|
|||
|
default: 0
|
|||
|
}
|
|||
|
},
|
|||
|
computed: {
|
|||
|
elZIndex() {
|
|||
|
return this.zIndex ? this.zIndex : this.$tn.zIndex.popup
|
|||
|
}
|
|||
|
},
|
|||
|
data() {
|
|||
|
return {
|
|||
|
|
|||
|
}
|
|||
|
},
|
|||
|
methods: {
|
|||
|
change(e) {
|
|||
|
this.$emit('change', e)
|
|||
|
},
|
|||
|
// 关闭键盘
|
|||
|
popupClose() {
|
|||
|
// 修改value的值
|
|||
|
this.$emit('input', false)
|
|||
|
},
|
|||
|
// 输入完成
|
|||
|
onConfirm() {
|
|||
|
this.popupClose()
|
|||
|
this.$emit('confirm')
|
|||
|
},
|
|||
|
// 输入取消
|
|||
|
onCancel() {
|
|||
|
this.popupClose()
|
|||
|
this.$emit('cancel')
|
|||
|
},
|
|||
|
// 点击退格
|
|||
|
backspaceClick() {
|
|||
|
this.$emit('backspace')
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
</script>
|
|||
|
|
|||
|
<style lang="scss" scoped>
|
|||
|
|
|||
|
.tn-keyboard {
|
|||
|
position: relative;
|
|||
|
|
|||
|
&__tooltip {
|
|||
|
display: flex;
|
|||
|
flex-direction: row;
|
|||
|
justify-content: space-between;
|
|||
|
|
|||
|
&__item {
|
|||
|
color: $tn-font-color;
|
|||
|
flex: 0 0 33.3333333333%;
|
|||
|
text-align: center;
|
|||
|
font-size: 28rpx;
|
|||
|
padding: 20rpx 10rpx;
|
|||
|
}
|
|||
|
|
|||
|
&__cancel {
|
|||
|
text-align: left;
|
|||
|
flex-grow: 1;
|
|||
|
flex-wrap: 0;
|
|||
|
padding-left: 40rpx;
|
|||
|
color: $tn-content-color;
|
|||
|
|
|||
|
&--hover {
|
|||
|
color: $tn-font-color;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
&__confirm {
|
|||
|
text-align: right;
|
|||
|
flex-grow: 1;
|
|||
|
flex-wrap: 0;
|
|||
|
padding-right: 40rpx;
|
|||
|
color: $tn-main-color;
|
|||
|
|
|||
|
&--hover {
|
|||
|
color: $tn-color-blue;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
</style>
|