| <template> |
| <u-popup class="" :mask="mask" :maskCloseAble="maskCloseAble" mode="bottom" :popup="false" v-model="value" length="auto" |
| :safeAreaInsetBottom="safeAreaInsetBottom" @close="popupClose" :zIndex="uZIndex"> |
| <slot /> |
| <view class="u-tooltip" v-if="tooltip"> |
| <view class="u-tooltip-item u-tooltip-cancel" hover-class="u-tooltip-cancel-hover" @tap="onCancel"> |
| {{cancelBtn ? cancelText : ''}} |
| </view> |
| <view v-if="showTips" class="u-tooltip-item u-tooltip-tips"> |
| {{tips ? tips : mode == 'number' ? '数字键盘' : mode == 'card' ? '身份证键盘' : '车牌号键盘'}} |
| </view> |
| <view v-if="confirmBtn" @tap="onConfirm" class="u-tooltip-item u-tooltips-submit" hover-class="u-tooltips-submit-hover"> |
| {{confirmBtn ? confirmText : ''}} |
| </view> |
| </view> |
| <block v-if="mode == 'number' || mode == 'card'"> |
| <u-number-keyboard :random="random" @backspace="backspace" @change="change" :mode="mode" :dotEnabled="dotEnabled"></u-number-keyboard> |
| </block> |
| <block v-else> |
| <u-car-keyboard :random="random" @backspace="backspace" @change="change"></u-car-keyboard> |
| </block> |
| </u-popup> |
| </template> |
| |
| <script> |
| /** |
| * keyboard 键盘 |
| * @description 此为uViw自定义的键盘面板,内含了数字键盘,车牌号键,身份证号键盘3中模式,都有可以打乱按键顺序的选项。 |
| * @tutorial https://www.uviewui.com/components/keyboard.html |
| * @property {String} mode 键盘类型,见官网基本使用的说明(默认number) |
| * @property {Boolean} dot-enabled 是否显示"."按键,只在mode=number时有效(默认true) |
| * @property {Boolean} tooltip 是否显示键盘顶部工具条(默认true) |
| * @property {String} tips 工具条中间的提示文字,见上方基本使用的说明,如不需要,请传""空字符 |
| * @property {Boolean} cancel-btn 是否显示工具条左边的"取消"按钮(默认true) |
| * @property {Boolean} confirm-btn 是否显示工具条右边的"完成"按钮(默认true) |
| * @property {Boolean} mask 是否显示遮罩(默认true) |
| * @property {String} confirm-text 确认按钮的文字 |
| * @property {String} cancel-text 取消按钮的文字 |
| * @property {Number String} z-index 弹出键盘的z-index值(默认1075) |
| * @property {Boolean} random 是否打乱键盘按键的顺序(默认false) |
| * @property {Boolean} safe-area-inset-bottom 是否开启底部安全区适配(默认false) |
| * @property {Boolean} mask-close-able 是否允许点击遮罩收起键盘(默认true) |
| * @event {Function} change 按键被点击(不包含退格键被点击) |
| * @event {Function} cancel 键盘顶部工具条左边的"取消"按钮被点击 |
| * @event {Function} confirm 键盘顶部工具条右边的"完成"按钮被点击 |
| * @event {Function} backspace 键盘退格键被点击 |
| * @example <u-keyboard mode="number" v-model="show"></u-keyboard> |
| */ |
| export default { |
| name: "u-keyboard", |
| props: { |
| // 键盘的类型,number-数字键盘,card-身份证键盘,car-车牌号键盘 |
| mode: { |
| type: String, |
| default: 'number' |
| }, |
| // 是否显示键盘的"."符号 |
| dotEnabled: { |
| type: Boolean, |
| default: true |
| }, |
| // 是否显示顶部工具条 |
| tooltip: { |
| type: Boolean, |
| default: true |
| }, |
| // 是否显示工具条中间的提示 |
| showTips: { |
| type: Boolean, |
| default: true |
| }, |
| // 工具条中间的提示文字 |
| tips: { |
| type: String, |
| default: '' |
| }, |
| // 是否显示工具条左边的"取消"按钮 |
| cancelBtn: { |
| type: Boolean, |
| default: true |
| }, |
| // 是否显示工具条右边的"完成"按钮 |
| confirmBtn: { |
| type: Boolean, |
| default: true |
| }, |
| // 是否打乱键盘按键的顺序 |
| random: { |
| type: Boolean, |
| default: false |
| }, |
| // 是否开启底部安全区适配,开启的话,会在iPhoneX机型底部添加一定的内边距 |
| safeAreaInsetBottom: { |
| type: Boolean, |
| default: false |
| }, |
| // 是否允许通过点击遮罩关闭键盘 |
| maskCloseAble: { |
| type: Boolean, |
| default: true |
| }, |
| // 通过双向绑定控制键盘的弹出与收起 |
| value: { |
| type: Boolean, |
| default: false |
| }, |
| // 是否显示遮罩,某些时候数字键盘时,用户希望看到自己的数值,所以可能不想要遮罩 |
| mask: { |
| type: Boolean, |
| default: true |
| }, |
| // z-index值 |
| zIndex: { |
| type: [Number, String], |
| default: '' |
| }, |
| // 取消按钮的文字 |
| cancelText: { |
| type: String, |
| default: '取消' |
| }, |
| // 确认按钮的文字 |
| confirmText: { |
| type: String, |
| default: '确认' |
| } |
| }, |
| data() { |
| return { |
| //show: false |
| } |
| }, |
| computed: { |
| uZIndex() { |
| return this.zIndex ? this.zIndex : this.$u.zIndex.popup; |
| } |
| }, |
| methods: { |
| change(e) { |
| this.$emit('change', e); |
| }, |
| // 键盘关闭 |
| popupClose() { |
| // 通过发送input这个特殊的事件名,可以修改父组件传给props的value的变量,也即双向绑定 |
| this.$emit('input', false); |
| }, |
| // 输入完成 |
| onConfirm() { |
| this.popupClose(); |
| this.$emit('confirm'); |
| }, |
| // 取消输入 |
| onCancel() { |
| this.popupClose(); |
| this.$emit('cancel'); |
| }, |
| // 退格键 |
| backspace() { |
| this.$emit('backspace'); |
| }, |
| // 关闭键盘 |
| // close() { |
| // this.show = false; |
| // }, |
| // // 打开键盘 |
| // open() { |
| // this.show = true; |
| // } |
| } |
| } |
| </script> |
| |
| <style lang="scss" scoped> |
| @import "../../libs/css/style.components.scss"; |
| |
| .u-keyboard { |
| position: relative; |
| z-index: 1003; |
| } |
| |
| .u-tooltip { |
| @include vue-flex; |
| justify-content: space-between; |
| } |
| |
| .u-tooltip-item { |
| color: #333333; |
| flex: 0 0 33.333333%; |
| text-align: center; |
| padding: 20rpx 10rpx; |
| font-size: 28rpx; |
| } |
| |
| .u-tooltips-submit { |
| text-align: right; |
| flex-grow: 1; |
| flex-wrap: 0; |
| padding-right: 40rpx; |
| color: $u-type-primary; |
| } |
| |
| .u-tooltip-cancel { |
| text-align: left; |
| flex-grow: 1; |
| flex-wrap: 0; |
| padding-left: 40rpx; |
| color: #888888; |
| } |
| |
| .u-tooltips-submit-hover { |
| color: $u-type-success; |
| } |
| |
| .u-tooltip-cancel-hover { |
| color: #333333; |
| } |
| </style> |