• vant+vue在静态页面实现车牌号软键盘


    一、效果图

    vant+vue软键盘

     

     二、实现

    1.因为是在html静态页面中使用,所以要先引入vant.css、vant.js、vue.js到需要使用的html页面;

    2.将实现好的车牌软键盘功能放到一个js里面,再将该组件使用js方式引入到html界面,同样该组件的css代码也要引入;

     3.这里的车牌号软键盘实现方式是借鉴的该方法:vue.js - vant-number-plate基于vue+vant+less的车牌号输入组件(车牌号虚拟键盘)_个人文章 - SegmentFault 思否

     我这里稍微改进了一下,车牌号小于7位数时不能点击完成。新建一个keyboard.js文件夹,注册一个成对象,直接上代码:

    1. // 车牌号软键盘
    2. var keyboardVm = Vue.component('VanCardBoard', {
    3. template: `
  • :class="{ active: activeIndex === index }" @click="handleClickItem(index)">
  • {{ item }}
  • 'vnp-del-wrapper': val === 'del',
  • 'vnp-type-wrapper': val === 'type',
  • }">
  • 中/
  • /英
  • d="M28.016 0A3.991 3.991 0 0132 3.987v14.026c0 2.2-1.787 3.987-3.98 3.987H10.382c-.509 0-.996-.206-1.374-.585L.89 13.09C.33 12.62 0 11.84 0 11.006c0-.86.325-1.62.887-2.08L9.01.585A1.936 1.936 0 0110.383 0zm0 1.947H10.368L2.24 10.28c-.224.226-.312.432-.312.73 0 .287.094.51.312.729l8.128 8.333h17.648a2.041 2.041 0 002.037-2.04V3.987c0-1.127-.915-2.04-2.037-2.04zM23.028 6a.96.96 0 01.678.292.95.95 0 01-.003 1.377l-3.342 3.348 3.326 3.333c.189.188.292.43.292.679 0 .248-.103.49-.292.679a.96.96 0 01-.678.292.959.959 0 01-.677-.292L18.99 12.36l-3.343 3.345a.96.96 0 01-.677.292.96.96 0 01-.678-.292.962.962 0 01-.292-.68c0-.248.104-.49.292-.679l3.342-3.348-3.342-3.348A.963.963 0 0114 6.971c0-.248.104-.49.292-.679A.96.96 0 0114.97 6a.96.96 0 01.677.292l3.358 3.348 3.345-3.348A.96.96 0 0123.028 6z"
  • fill="currentColor">
  • @click="handleClickKey(val)">
  • {{ val }}
  • `,
  • model: {
  • prop: 'value',
  • },
  • props: {
  • show: {
  • type: Boolean,
  • default: false,
  • },
  • value: {
  • type: String,
  • default: '',
  • },
  • },
  • data() {
  • return {
  • value: '', //当前输入的车牌
  • val: ['', '', '', '', '', '', '', ''], //固定八位
  • activeIndex: 0, //当前活动的软键盘按钮
  • type: 'cn',
  • cn: [
  • ['京', '津', '沪', '渝', '冀', '豫', '云', '辽', '黑', '湘'],
  • ['皖', '鲁', '新', '苏', '浙', '赣', '鄂', '桂', '甘', '晋'],
  • ['蒙', '陕', '吉', '闽', '贵', '粤', '青', '藏', '川', '宁'],
  • ['type', '琼', '使', '领', '学', '警 ', '挂', '', 'del'],
  • ],
  • en: [
  • ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'],
  • ['Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'O', 'P'],
  • ['A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L'],
  • ['type', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', 'del'],
  • ],
  • };
  • },
  • computed: {
  • visible: {
  • set(val) {
  • this.$emit('update:show', val);
  • },
  • get() {
  • return this.show;
  • },
  • },
  • keyboardList() {
  • return this.type === 'en' ? this.en : this.cn;
  • },
  • },
  • watch: {
  • activeIndex() {
  • this.handleActiveChange(this.activeIndex);
  • },
  • value: {
  • immediate: true,
  • handler() {
  • if (this.val.join('') === this.value) {
  • return;
  • }
  • const val = this.value.split('');
  • while (val.length < 8) {
  • val.push('');
  • }
  • this.val = val;
  • },
  • },
  • },
  • methods: {
  • // 点击某个输入框
  • handleClickItem(index) {
  • this.activeIndex = index;
  • },
  • // 中英文切换
  • handleChangeType() {
  • this.type = this.type === 'en' ? 'cn' : 'en';
  • },
  • // 选中某个键盘按钮值
  • handleClickKey(val) {
  • if (val) {
  • this.$set(this.val, this.activeIndex, val);
  • if (this.activeIndex < 7) {
  • this.activeIndex += 1;
  • }
  • }
  • },
  • // 获焦顶部要填入的单元格
  • handleActiveChange(activeIndex) {
  • if (activeIndex === 0) {
  • this.type = 'cn';
  • } else {
  • this.type = 'en';
  • }
  • },
  • handleDel() {
  • this.$set(this.val, this.activeIndex, '');
  • if (this.activeIndex > 0) {
  • this.activeIndex -= 1;
  • }
  • },
  • finish() {
  • const _val = this.val.join('');
  • if (_val.length <= 6) return;
  • this.$emit('input', _val);
  • this.visible = false;
  • },
  • },
  • });
  •  keyboard.css样式:

    1. .vnp-header {
    2. height: 40px;
    3. padding-top: 6px;
    4. position: relative;
    5. }
    6. .vnp-header .vnp-btn-finish {
    7. position: absolute;
    8. right: 0;
    9. height: 100%;
    10. padding: 0 16px;
    11. color: #576b95;
    12. font-size: 14px;
    13. background-color: transparent;
    14. border: none;
    15. cursor: pointer;
    16. }
    17. .vnp-input-box-outer {
    18. width: 82%;
    19. max-width: 600px;
    20. margin: 0 auto;
    21. padding: 10px;
    22. }
    23. .vnp-input-box {
    24. padding: 10px 0;
    25. border: 1px solid #d8d8d8;
    26. border-radius: 2px;
    27. color: #8d8d8d;
    28. font-size: 15px;
    29. text-align: center;
    30. }
    31. .vnp-input-box ul {
    32. display: flex;
    33. }
    34. .vnp-input-box li {
    35. flex: 1;
    36. border-right: 1px solid #eaeaea;
    37. height: 28px;
    38. line-height: 28px;
    39. }
    40. .vnp-input-box li:first-child {
    41. border-right: 0;
    42. }
    43. .vnp-input-box li:last-child {
    44. border: none;
    45. }
    46. .vnp-input-box li.active {
    47. color: #1989fa;
    48. }
    49. .vnp-input-box li.active>span {
    50. height: 100%;
    51. width: 20px;
    52. display: inline-block;
    53. border-bottom: 1px solid #1989fa;
    54. }
    55. .vnp-red {
    56. border: 1px solid red;
    57. }
    58. .vnp-keys {
    59. padding: 3px;
    60. background: #f2f3f5;
    61. padding-bottom: 22px;
    62. }
    63. .vnp-keys .vnp-keys-row {
    64. display: flex;
    65. justify-content: center;
    66. }
    67. .vnp-keys .vnp-btn-key-wrapper {
    68. flex: 0 1 calc((100% - 6px * 10) / 10);
    69. padding: 3px;
    70. box-sizing: content-box;
    71. }
    72. .vnp-keys .vnp-btn-key-wrapper.vnp-del-wrapper,
    73. .vnp-keys .vnp-btn-key-wrapper.vnp-type-wrapper {
    74. flex: 1;
    75. }
    76. .vnp-keys .vnp-btn-key-wrapper.vnp-type-wrapper .vnp-smaller {
    77. color: #999;
    78. font-size: 12px;
    79. }
    80. .vnp-keys .vnp-btn-key-wrapper .vnp-btn-key {
    81. padding: 0;
    82. width: 100%;
    83. border-radius: 4px;
    84. }
    85. .vnp-keys .vnp-btn-key-wrapper .vnp-btn-empty {
    86. background: transparent;
    87. border: none;
    88. }
    89. .vnp-keys .vnp-btn-key-wrapper .vnp-delete-icon {
    90. width: 18px;
    91. vertical-align: middle;
    92. }

    4.在表单中使用:

    1. <van-field label="车牌号" required :value="form.cardNumber" is-link placeholder="请选择" @click="showCardBoard=true">van-field>
    2. <van-card-board v-model="form.cardNumber" :show.sync="showCardBoard">van-card-board>
    3. <script type="text/javascript">
    4. var vm = new Vue({
    5. el: '#vehicleAuditAdd',
    6. data: {
    7. form: {
    8. cardNumber: ''
    9. },
    10. showCardBoard: false, //控制车牌号软键盘显示隐藏
    11. }
    12. })
    13. script>

    三、知识点总结

    1、如何将选中的车牌号回显在需要显示的表单中?

    this.$emit('input',this.val)

    解答:

    因此,值在input中回显时,可以不用写自定义事件。

    2. 当在多个静态页面需要使用该组件时,如何封装成组件?

    解答:

  • 相关阅读:
    Qt的网络连接方式
    clip代码安装实操
    【JavaScript高级进阶】初识类,函数进阶,如何改变this指向
    JavaSE进阶26 - IO流概述、字节流、字符流、转换流、缓冲流
    C++:C++编程语言学习之数据类型&常量&变量的简介、案例应用之详细攻略
    C语言基础知识
    [java]深度剖析自动装箱与拆箱
    计算机组成原理_Cache写策略
    算法题1020
    windows搭建elasticsearch和elasticsearch-head/kibana
  • 原文地址:https://blog.csdn.net/weixin_47978760/article/details/127105444