微信小程序自定义车牌号输入键盘-附源码

键盘已做过处第一位只能是省份简称,第二位只能输入字母,第三位以后可以输入数字加字母的组合,输入完成后有正则方法校验车牌号的合法性。高效率车牌号输入键盘,大大提升用户体验,增强用户输入车牌号的真实性

组件源码

html:
<view wx:if="{{isShow}}" class="vehicle-panel" style="height:430rpx;background-color:{{backgroundColor}}">
<view class='offkey' bindtap='offkr'>关闭键盘</view>
<!--省份简写键盘-->
<block wx:if="{{keyBoardType === 1}}">
  <view class="vehicle-panel-row">
    <view hover-class="vehicle-hover" hover-start-time="10" hover-stay-time="100" class='vehicle-panel-row-button' style="border:{{buttonBorder}}" wx:for="{{keyVehicle1}}" bindtap='vehicleTap' data-value="{{item}}" wx:for-index="idx" wx:key="idx">{{item}}</view>
  </view>
  <view class="vehicle-panel-row">
    <view hover-class="vehicle-hover" hover-start-time="10" hover-stay-time="100" class='vehicle-panel-row-button' style="border:{{buttonBorder}}" wx:for="{{keyVehicle2}}" bindtap='vehicleTap' data-value="{{item}}" wx:for-index="idx" wx:key="idx">{{item}}</view>
  </view>
  <view class="vehicle-panel-row">
    <view hover-class="vehicle-hover" hover-start-time="10" hover-stay-time="100" class='vehicle-panel-row-button' style="border:{{buttonBorder}}" wx:for="{{keyVehicle3}}" bindtap='vehicleTap' data-value="{{item}}" wx:for-index="idx" wx:key="idx">{{item}}</view>
  </view>
  <view class="vehicle-panel-row-last">
    <view hover-class="vehicle-hover" hover-start-time="10" hover-stay-time="100" class='vehicle-panel-row-button vehicle-panel-row-button-last' bindtap='vehicleTap' data-value="{{item}}" wx:for="{{keyVehicle4}}" style="border:{{buttonBorder}}" wx:for-index="idx"
      wx:key="idx">{{item}}</view>
  </view>
</block>
<block wx:else>
  <!--数字键盘  -->
  <block wx:if="{{numBoard==true}}">
    <view class="vehicle-panel-row">
      <view hover-class="vehicle-hover" hover-start-time="10" hover-stay-time="100" class='vehicle-panel-row-button vehicle-panel-row-button-number' bindtap='vehicleTap' data-value="{{item}}" wx:for="{{keyNumber}}" style="border:{{buttonBorder}}" wx:for-index="idx"
        wx:key="item">{{item}}</view>
    </view>
  </block>
  <!--英文键盘  -->
  <view class="vehicle-panel-row">
    <view hover-class="vehicle-hover" hover-start-time="10" hover-stay-time="100" class='vehicle-panel-row-button' style="border:{{buttonBorder}}" wx:for="{{keyEnInput1}}" bindtap='vehicleTap' data-value="{{item}}" wx:for-index="idx" wx:key="idx">{{item}}</view>
  </view>
  <view class="vehicle-panel-row">
    <view hover-class="vehicle-hover" hover-start-time="10" hover-stay-time="100" class='vehicle-panel-row-button' style="border:{{buttonBorder}}" wx:for="{{keyEnInput2}}" bindtap='vehicleTap' data-value="{{item}}" wx:for-index="idx" wx:key="idx">{{item}}</view>
    <view hover-class="vehicle-hover" style="border:{{buttonBorder}}" hover-start-time="10" hover-stay-time="100" class='vehicle-panel-row-button vehicle-panel-row-button-img'>
      <image src='../../images/delete.png' class='vehicle-en-button-delete' bindtap='vehicleTap' data-value="delete" mode='aspectFit'>删除</image>
    </view>
  </view>
  <view class="vehicle-panel-row-last">
    <view hover-class="vehicle-hover" hover-start-time="10" hover-stay-time="100" class='vehicle-panel-row-button vehicle-panel-row-button-last' bindtap='vehicleTap' style="border:{{buttonBorder}}" data-value="{{item}}" wx:for="{{keyEnInput3}}" wx:for-index="idx"
      wx:key="idx">{{item}}</view>
    <view hover-class="vehicle-hover" style="border:{{buttonBorder}}" hover-start-time="10" hover-stay-time="100" class='vehicle-panel-row-button vehicle-panel-ok' bindtap='vehicleTap' data-value="ok">完成</view>
  </view>
</block>
</view>
css:
:host {
  width: 100%;
}

.vehicle-panel {
  width: 100%;
  position: fixed;
  bottom: 0;
  display: flex;
  flex-direction: column;
  justify-content: center;
  z-index: 1000;
}
.offkey{
  text-align: center;
  font-size: 30rpx;
}
.vehicle-panel-row {
  display: flex;
  justify-content: space-between;
  align-items: center;
}

.vehicle-panel-row-last {
  display: flex;
  justify-content: space-between;
  align-items: center;
}

.vehicle-panel-row-button {
  background-color: #fff;
  margin: 5rpx;
  padding: 5rpx;
  width: 80rpx;
  height: 80rpx;
  text-align: center;
  line-height: 80rpx;
  border-radius: 10rpx;
}

.vehicle-panel-row-button-number {
  background-color: #eee;
}

.vehicle-panel-row-button-last {
  width: 90rpx;
  height: 90rpx;
  line-height: 90rpx;
}

.vehicle-hover {
  background-color: #ccc;
}

.vehicle-panel-row-button-img {
  display: flex;
  justify-content: center;
  align-items: center;
}

.vehicle-en-button-delete {
  width: 55rpx;
  height: 85rpx;
}

.vehicle-panel-ok {
  background-image: linear-gradient(0deg, #00a878 0%, #00cddc 100%),
                      linear-gradient(#413f3f, #413f3f);
  color: #fff;
  width: 150rpx;
  height: 80rpx;
  font-size: 30rpx;
}
js:
Component({
  externalClasses: ['v-panel'],
  properties: {
    isShow: {
      type: Boolean,
      value: false,
    },
    buttonBorder: {
      type: String,
      value: "1px solid #ccc"
    },
    backgroundColor: {
      type: String,
      value: "#fff"
    },
    //1为省份键盘,其它为英文键盘
    keyBoardType: {
      type: Number,
      value: 1,
    },
    //true 显示键盘数字部分  
    numBoard: {
      type: Boolean,
      value: false,
    }
  },
  data: {
    keyVehicle1: '陕京津沪冀豫云辽',
    keyVehicle2: '黑湘皖鲁新苏浙赣',
    keyVehicle3: '鄂桂甘晋蒙吉闽贵',
    keyVehicle4: '粤川青藏琼宁渝',
    keyNumber: '1234567890',
    keyEnInput1: 'QWERTYUIOP',
    keyEnInput2: 'ASDFGHJKL',
    keyEnInput3: 'ZXCVBNM',
  },
  methods: {
    offkr:function(){
      let that = this;
      that.setData({
        isShow: false,
      })
    },
    vehicleTap: function(event) {
      let val = event.target.dataset.value;
      switch (val) {
        case 'delete':
          this.triggerEvent('delete');
          // this.triggerEvent('inputchange');
          break;
        case 'ok':
          this.triggerEvent('ok');
          break;
        default:
          this.triggerEvent('inputchange', val);
      }
    },
  }
});
json:
{
  "component": true
}

组件使用方法

<v-panel is-show="{{isShow}}" bindok="inputOk" binddelete="inputdelete" numBoard="{{numBoard}}" bindinputchange="inputChange" key-board-type="{{keyBoardType}}" backgroundColor="white" />

<view class="text_con_focus" bindtap="bindFocus">
  车牌号:{{textValue}}
  <text class='focus_move'>|</text>
</view>
.focus_move {
  color: green;
  font-size: 30rpx;
  animation: focus 0.7s infinite;
}

/* 光标动画 */

@keyframes focus {
  from {
    opacity: 1;
  }

  to {
    opacity: 0;
  }
}
.text_con_focus{
   font-size: 30rpx;
}
var car_num = ""
Page({
  data: {
    textValue: "", //最终的输入内容
    keyBoardType: 1, //控制键盘显示类型,1为省份简写,2为英文简写
    numBoard: false, //控制  是否显示 英文简写中的数字部分键盘  true 为显示
    isShow: false, //控制键盘是否显示,true显示,false不显示
  },
  onShow: function () {

  },
  
  //控制键盘显示
  bindFocus: function(e) {
    let that = this;
    that.setData({
      isShow: true,
    })
  },
 
  //键盘输入事件
  inputChange: function(e) {
    let car_val = e.detail;
    let that = this;
    //超过8位后截取前8位
    if (that.data.textValue.length >= 8) {
      car_num = that.data.textValue.substr(0, 8)
    }else{
      car_num += car_val;
    }
  
    is_show(that, car_num)
  },
  //键盘删除事件
  inputdelete: function(e) {
    let that = this;
    car_num = car_num.substring(0, car_num.length - 1)
    console.log(car_num)
    is_show(that, car_num)
  },
  //确定事件
  inputOk:function(e) {
    let that = this;
    that.setData({
      isShow: false,
    })
    console.log(that.data.textValue)
  },
})

//控制键盘的方法包装
function is_show(that,val) {
  //1为省份简写,2为英文简写
  if (val.length >= 1) {
    that.setData({
      keyBoardType: 2,
    })
  } else {
    that.setData({
      keyBoardType: 1,
    })
  }
  //控制  是否显示数字部分键盘
  if (val.length >= 2) {
    that.setData({
      numBoard: true,
    })
  } else {
    that.setData({
      numBoard: false,
    })
  }
  that.setData({
    textValue: car_num
  })
}
{
  "component": true,
  "usingComponents": {
    "v-panel": "../../componet/select_car_number/select_car_number"
  }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JackieDYH

谢谢您嘞!我会继续加油地

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值