小程序车牌输入组件

参考链接:

https://www.jianshu.com/p/f7843b647c20

https://www.jb51.net/article/167972.htm

 

使用自定义组件输入车牌号。

自定义组件:carplate

 

 组件代码:

index.js

 1 Component({
 2 
 3   properties: {
 4    type: {
 5     type: Number,
 6     default: 1,
 7    },
 8    show: {
 9     type: Boolean,
10     default: true,
11    }
12   },
13  
14   data: {
15    cityKeyword1: '京津晋冀蒙辽吉黑沪',
16    cityKeyword2: '苏浙皖闽赣鲁豫鄂湘',
17    cityKeyword3: '粤桂琼渝川贵云藏',
18    cityKeyword4: '陕甘青宁新',
19    keyNumber: '1234567890',
20    wordList1: 'QWERTYUOP军',
21    wordList2: 'ASDFGHJKL警',
22    wordList3: 'ZXCVBNM港澳',
23  
24   },
25  
26   methods: {
27    handleClick(e) {
28     let value = e.currentTarget.dataset.item;
29     let type = e.currentTarget.dataset.type;
30     switch(value) {
31      case 'confirm':
32       this.triggerEvent('confirm');
33       break;
34      case 'delete':
35       this.triggerEvent('delete');
36       break;
37      default: 
38       this.triggerEvent('change', { value, type });
39     }
40    }
41   }
42  })

index.json

1 {
2   "component": true,
3   "usingComponents": {}
4 }

index.wxml

 1 <view class="carPlate" wx:if="{{show}}">
 2 <slot  />
 3 
 4  <block wx:if="{{type==1}}">
 5   <view class="wordList">
 6    <view class="wordItem" wx:for="{{cityKeyword1}}" wx:key="{{item}}" bindtap="handleClick" data-type="1" data-item="{{item}}">{{item}}</view>
 7   </view>
 8   <view class="wordList">
 9    <view class="wordItem" wx:for="{{cityKeyword2}}" wx:key="{{item}}" bindtap="handleClick" data-type="1" data-item="{{item}}">{{item}}</view>
10   </view>
11   <view class="wordList">
12    <view class="wordItem" wx:for="{{cityKeyword3}}" wx:key="{{item}}" bindtap="handleClick" data-type="1" data-item="{{item}}">{{item}}</view>
13   </view>
14   <view class="wordList">
15    <view class="wordItem" wx:for="{{cityKeyword4}}" wx:key="{{item}}" bindtap="handleClick" data-type="1" data-item="{{item}}">{{item}}</view>
16    <view class="wordItem wordConfirm" bindtap="handleClick" data-item="confirm">确定</view>
17   </view>
18  </block>
19  <block wx:else>
20   <view class="wordList">
21    <view class="wordItem" wx:for="{{keyNumber}}" wx:key="{{item}}" bindtap="handleClick" data-type="2" data-item="{{item}}">{{item}}</view>
22   </view>
23   <view class="wordList">
24    <view class="wordItem" wx:for="{{wordList1}}" wx:key="{{item}}" bindtap="handleClick" data-type="2" data-item="{{item}}">{{item}}</view>
25   </view>
26   <view class="wordList">
27    <view class="wordItem" wx:for="{{wordList2}}" wx:key="{{item}}" bindtap="handleClick" data-type="2" data-item="{{item}}">{{item}}</view>
28    <view class="wordItem wordClear" bindtap="handleClick" data-item="delete">
29     <image src="/source/images/input-clear.png" class="clearImg"></image>
30    </view>
31   </view>
32   <view class="wordList">
33    <view class="wordItem" wx:for="{{wordList3}}" wx:key="{{item}}" bindtap="handleClick" data-item="{{item}}">{{item}}</view>
34    <view class="wordItem wordConfirm" bindtap="handleClick" data-item="confirm">确定</view>
35   </view>
36  </block>
37 </view>

index.wxss

 1 .carPlate{
 2   position: fixed;
 3   padding: 0 12rpx 30rpx 12rpx;
 4   left: 0;
 5   bottom: 0;
 6   width: 100%;
 7   height: 450rpx;
 8   font-size: 30rpx;
 9   background: #fff;
10   box-sizing: border-box;
11   border-top: 1px solid rgb(211, 207, 207);
12   z-index: 200;
13  }
14  .wordList{
15   display: flex;
16   width: 100%;
17   justify-content: center;
18   align-items: center;
19  }
20  .wordItem{
21   margin: 5rpx;
22   width: 70rpx;
23   height: 75rpx;
24   line-height: 75rpx;
25   text-align: center;
26   border: 1px solid #eee;
27   border-radius: 10rpx;
28  }
29  .wordConfirm{
30   width: 130rpx;
31   color: #fff;
32   background: #07C160;
33  }
34  .wordClear{
35   width: 100rpx;
36  }
37  .clearImg{
38   width: 60rpx;
39   height: 60rpx;
40   vertical-align: middle;
41  }

在页面中调用:

 

 页面代码:在文本框中输入车牌号,可根据自己的需求使用正则校验结果。

 1 // pages/test/index.js
 2 Page({
 3 
 4   /**
 5    * 页面的初始数据
 6    */
 7   data: {
 8     inputType: 1,
 9     showPlateInput: false,
10     plateNo: '',
11   },
12  
13  
14   /* 点击输入车牌号 */
15   plateClick: function () {
16     let regExp = /^[\u4e00-\u9fa5]+/;
17     let inputType = 1; 
18     // 如果车牌号的第一个是汉字,则显示字母键盘
19     if (regExp.test(this.data.plateNo.substring(0,1))) {
20       inputType = 2;
21     }
22     this.setData({
23       showPlateInput: !this.data.showPlateInput,
24       inputType,
25     })
26   },
27   /* 点击输入车牌 */
28   handlePlateChange(e) {
29     let value = e.detail.value;
30     let type = e.detail.type;
31     let plateNo = this.data.plateNo;
32     plateNo += value;
33  
34     if (type == 1) {
35       this.setData({
36         inputType: 2
37       })
38     }
39     this.setData({
40       plateNo
41     })
42   },
43   /* 键盘输入删除 */
44   handlePlateDelete(e) {
45     let plateNo = this.data.plateNo;
46     plateNo = plateNo.substring(0, plateNo.length - 1);
47     if (plateNo.length == 0) {
48       this.setData({
49         inputType: 1
50       })
51     }
52     this.setData({
53       plateNo,
54     })
55   },
56   /* 点击键盘上的确定 或者车牌号 */
57   handlePlateConfirm() {
58      
59     this.setData({
60       showPlateInput: false,
61       inputType: 1, 
62     })
63   },
64   /* 判断车牌号 */
65   isCarPlate(value) {
66     return /^(([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z](([0-9]{5}[DF])|([DF]([A-HJ-NP-Z0-9])[0-9]{4})))|([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳使领]))$/.test(value);
67      
68   },
69 
70   /* 关闭车牌号 */
71   closePlate() {
72     this.setData({
73       showPlateInput: false,  
74     })
75   },
76 })
1 {
2   "navigationBarTitleText": "输入车牌",
3   "usingComponents": {
4     "car-plate" : "../../components/carplate/index"
5   }
6 }
 1 <view style="text-align: center; margin: 20px;"> 
 2    <input bindtap="plateClick" data-field="carId" value="{{plateNo}}" disabled="true" placeholder="点击输入车牌号" />
 3 </view>
 4 
 5 <car-plate show="{{showPlateInput}}" bindchange="handlePlateChange" type="{{inputType}}" bindconfirm="handlePlateConfirm" binddelete="handlePlateDelete">
 6   <view class="bar-panel">
 7     <view class="plate-number-text" bindtap="handlePlateConfirm">{{plateNo}}</view>
 8     <view class="finish-btn" bindtap="closePlate">关闭</view>
 9   </view>
10 </car-plate>
 1 .bar-panel {
 2     display: flex;
 3     position: relative;
 4     height: 70rpx;
 5 }
 6 
 7 .bar-panel .plate-number-text {
 8     flex: 1;
 9     display: flex;
10     justify-content: center;
11     align-items: center;
12 }
13 
14 .bar-panel .finish-btn {
15     position: absolute;
16     right: 25rpx;
17     top: 0;
18     color: var(--theme-color);
19     font-size: 35rpx;
20     line-height: 70rpx;
21     float: right;
22 }

 

 

posted @ 2022-05-23 14:34  prettyling  阅读(772)  评论(0)    收藏  举报