微信小程序自定义车牌输入组件(结合Weui)

2023-11-01

概要

我们都知道车牌是有一定规律的,本文实现了微信小程序中实现车牌输入功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

描述

近期做了一个和车有关的小程序项目,有车肯定就有车牌,我们都知道车牌是有一定规律的,如果简单的给个输入框的话。就算通过正则取判断,但是用户体验不是很好,从小我的编程老师告诉我不要相信任何用户输入的东西。嗯嗯!还真是,之前作过一些项目,会被注入,还有个老师告诉我永远要把用户当SB,虽然自己也是用户,感觉不好,但是话糙理不糙啊,因为你永远不知道使用你写的东西的是什么。。。。。(甚至是不是人)。在这样的背景下你说要让用户输入一个正确的车牌号,那可真是比登天还难啊,太南了,臣妾做不到啊。

效果

WeChat_20230629110815

组件代码

carinput/wxml

<view class="catinput">
<view class="con-query">
    <mp-form>
    <mp-cells>
        <mp-cell class="form_item" prop="carnum" title="车牌号" >
            <input bindtap="inputClick" data-field="carnum" class="weui-input" data-id="0" placeholder="请填写车牌号" value='{{carNum}}' disabled="{{true}}"/>
        </mp-cell>
    </mp-cells>
    </mp-form>
</view>
<view class="keyboard" wx:if="{{isKeyboard}}" style="bottom:{{tabheight}}px">
  <view class="kb_top">
  <view class="plate-input-content plate-content-top">
	  <view class='plate-input-flag-top' bindtap='changeplate'>
		    <label class="radio"  wx:if="{{isNewEnergy}}">
		      <radio value="r2" checked="true" />新能源
		    </label>
			<label class="radio" wx:if="{{!isNewEnergy}}"  >
			  <radio value="r2" />新能源
			</label>
			<text catchtap="tapSpecBtn" data-index="2"
      style="position:absolute;right:0;display:block;height:74rpx;padding:0 34rpx; color:#FFB93F;line-height:74rpx; font-size: 30rpx;">取消</text>
	  </view>
  </view>
   <view class="plate-input-content">
     <view class="{{inputOnFocusIndex=='0'?'plate-nums-foc':'plate-nums-first'}}">
       <text bindtap="inputClick" class="plate-num-text" data-id="0">{{inputPlates.index0}}</text>
     </view>
     <view class="{{inputOnFocusIndex=='1'?'plate-nums-foc':'plate-nums-first'}}">
       <text bindtap="inputClick" class="plate-num-text" data-id="1">{{inputPlates.index1}}</text>
     </view>
     <view style="width:8px;height:38px;border-bottom: 1px solid #707070;"></view>
     <view class="{{inputOnFocusIndex=='2'?'plate-nums-foc':'plate-nums-first'}}">
       <text bindtap="inputClick" class="plate-num-text" data-id="2">{{inputPlates.index2}}</text>
     </view>
   
     <view class="{{inputOnFocusIndex=='3'?'plate-nums-foc':'plate-nums-first'}}">
       <text bindtap="inputClick" class="plate-num-text" data-id="3">{{inputPlates.index3}}</text>
     </view>
     <view class="{{inputOnFocusIndex=='4'?'plate-nums-foc':'plate-nums-first'}}">
       <text bindtap="inputClick" class="plate-num-text" data-id="4">{{inputPlates.index4}}</text>
     </view>
   
     <view class="{{inputOnFocusIndex=='5'?'plate-nums-foc':'plate-nums-first'}}">
       <text bindtap="inputClick" class="plate-num-text" data-id="5">{{inputPlates.index5}}</text>
     </view>
     <view class="{{inputOnFocusIndex=='6'?'plate-nums-foc':'plate-nums-first'}}">
       <text bindtap="inputClick" class="plate-num-text" data-id="6">{{inputPlates.index6}}</text>
     </view>
     <view class="{{inputOnFocusIndex=='7'?'plate-nums-foc':'plate-nums-first'}}" wx:if="{{isNewEnergy}}">
       <text bindtap="inputClick" class="plate-num-text" data-id="7">{{inputPlates.index7}}</text>
     </view>
   </view>
  </view>
  <view style="width:100%; text-align:center;" wx:if="{{isNumberKB}}">
    <view style="width:99%;display:flex;text-align:center;margin:0 auto">
      <view catchtap="tapKeyboard" class="td td_nor" data-index="{{idx}}" data-val="{{itemName}}" hoverClass="board_bg"
        hoverStartTime="0" hoverStayTime="80" wx:if="{{idx<=9}}" wx:for="{{keyboard1}}" wx:for-index="idx"
        wx:for-item="itemName" wx:key="{{itemName}}">
        {{itemName}}
      </view>
    </view>
    <view style="display:flex;text-align:center; width:90%;margin:0 auto">
      <view catchtap="tapKeyboard" class="td td_nor" data-index="{{idx}}" data-val="{{itemName}}" hoverClass="board_bg"
        hoverStartTime="0" hoverStayTime="80" wx:if="{{idx<=18&&idx>9}}" wx:for="{{keyboard1}}" wx:for-index="idx"
        wx:for-item="itemName" wx:key="{{itemName}}">
        {{itemName}}
      </view>
    </view>

    <view style="display:flex;text-align:center; width:70%;margin:0 auto">
      <view catchtap="tapKeyboard" class="td td_nor" data-index="{{idx}}" data-val="{{itemName}}" hoverClass="board_bg"
        hoverStartTime="0" hoverStayTime="80" wx:if="{{idx<=25&&idx>18}}" wx:for="{{keyboard1}}" wx:for-index="idx"
        wx:for-item="itemName" wx:key="{{itemName}}">
        {{itemName}}
      </view>
    </view>

    <view style="display:flex; width:50%;margin:0 auto;text-align:center;">
      <view catchtap="tapKeyboard" class="td td_nor" data-index="{{idx}}" data-val="{{itemName}}" hoverClass="board_bg"
        hoverStartTime="0" hoverStayTime="80" wx:if="{{idx>25}}" wx:for="{{keyboard1}}" wx:for-index="idx"
        wx:for-item="itemName" wx:key="{{itemName}}">
        {{itemName}}
      </view>
    </view>
    <view  bindtap="tapSpecBtn"  class="del-first" data-index="0" hoverClass="del-hover" hoverStartTime="0"
      hoverStayTime="80">
	  删除
    </view>
	<view catchtap="tapSpecBtn" class="del-sed" data-index="1" hoverClass="del-hover" hoverStartTime="0"
	  hoverStayTime="80">
	  完成
	</view>
  </view>

  <view style="width:100%; text-align:center;" wx:if="{{!isNumberKB}}">
    <view style="width:99%;display:flex;text-align:center;margin:0 auto">
      <view class="td td_num board_bg" wx:if="{{!tapNum&&idx<=9}}" wx:for="{{keyboardNumber}}" wx:for-index="idx"
        wx:for-item="itemName" wx:key="{{itemName}}">
        {{itemName}}
      </view>
    </view>
    <view style="width:99%;display:flex;text-align:center;margin:0 auto">
      <view catchtap="tapKeyboard" class="td td_num" data-index="{{idx}}" data-val="{{itemName}}" hoverClass="board_bg"
        hoverStartTime="0" hoverStayTime="80" wx:if="{{tapNum&&idx<=9}}" wx:for="{{keyboardNumber}}" wx:for-index="idx"
        wx:for-item="itemName" wx:key="{{itemName}}">
        {{itemName}}
      </view>

    </view>

    <view style="width:99%;display:flex;text-align:center;margin:0 auto">
      <view catchtap="tapKeyboard" class="td td_num" data-index="{{idx}}" data-val="{{itemName}}" hoverClass="board_bg"
        hoverStartTime="0" hoverStayTime="80" wx:if="{{idx>9&&idx<=17}}" wx:for="{{keyboardNumber}}" wx:for-index="idx"
        wx:for-item="itemName" wx:key="{{itemName}}">
        {{itemName}}
      </view>
      <view catchtap="tapKeyboard" class="td td_num" data-index="{{idx}}" data-val="{{itemName}}" hoverClass="board_bg"
        hoverStartTime="0" hoverStayTime="80" wx:if="{{tapNum&&18<=idx&&idx<=19}}" wx:for="{{keyboardNumber}}" wx:for-index="idx"
        wx:for-item="itemName" wx:key="{{itemName}}">
        {{itemName}}
      </view>
      <view class="td td_num board_bg" wx:if="{{!tapNum&&18<=idx&&idx<=19}}" wx:for="{{keyboardNumber}}" wx:for-index="idx"
        wx:for-item="itemName" wx:key="{{itemName}}">
        {{itemName}}
      </view>
    </view>

    <view style="width:99%;display:flex;text-align:center;margin:0 auto">
      <view catchtap="tapKeyboard" class="td td_num" data-index="{{idx}}" data-val="{{itemName}}" hoverClass="board_bg"
        hoverStartTime="0" hoverStayTime="80" wx:if="{{idx>19&&idx<=28}}" wx:for="{{keyboardNumber}}" wx:for-index="idx"
        wx:for-item="itemName" wx:key="{{itemName}}">
        {{itemName}}
      </view>

      <view catchtap="tapKeyboard" class="td td_num" data-index="{{idx}}" data-val="{{itemName}}" hoverClass="board_bg"
        hoverStartTime="0" hoverStayTime="80" wx:if="{{tapNum&&29==idx}}" wx:for="{{keyboardNumber}}" wx:for-index="idx"
        wx:for-item="itemName" wx:key="{{itemName}}">
        {{itemName}}
      </view>

      <view class="td td_num board_bg" wx:if="{{!tapNum&&29==idx}}" wx:for="{{keyboardNumber}}" wx:for-index="idx"
        wx:for-item="itemName" wx:key="{{itemName}}">
        {{itemName}}
      </view>

    </view>
    <view style="width:69%;display:flex;text-align:left; margin-left:5rpx;">
      <view catchtap="tapKeyboard" class="td td_num" data-index="{{idx}}" data-val="{{itemName}}" hoverClass="board_bg"
        hoverStartTime="0" hoverStayTime="80" wx:if="{{idx>29}}" wx:for="{{keyboardNumber}}" wx:for-index="idx"
        wx:for-item="itemName" wx:key="{{itemName}}">
        {{itemName}}
      </view>

    </view>

    <view bindtap="tapSpecBtn" class="del-first" data-index="0" hoverClass="del-hover" hoverStartTime="0"
      hoverStayTime="80">
      删除
    </view>
    <view catchtap="tapSpecBtn" class="del-sed" data-index="1" hoverClass="del-hover" hoverStartTime="0"
      hoverStayTime="80">
      完成
    </view>

  </view>
</view>
</view>

carinput/json

需要提前引入weui 库
{
 "usingComponents": {
   "mp-form": "weui-miniprogram/form/form",
   "mp-cells": "weui-miniprogram/cells/cells",
   "mp-cell": "weui-miniprogram/cell/cell"
  },
  "component": true
}

carinput/js

Component({
  /**
   * 组件的属性列表
   */
    properties: {
        carNum: {
            type: String,
            value:'',
        },
		isNewEnergy: {
		    type: Boolean,
		    value:false,
		},
		inputPlates: {
		    type: Object,
		    value:{
			  index0: "",
			  index1: "",
			  index2: "",
			  index3: "",
			  index4: "",
			  index5: "",
			  index6: "",
			  index7: ""
			}
		},
    },

  /**
   * 组件的初始数据
   */
  data: {
    isLoading:false,
    appUserId: "",
    escapeOrderList: [],
    carNumList: [],
    hasOrder: false,
    isKeyboard: false,
    isNumberKB: true,
    tapNum: false,
    disableKey: "1234567890港澳学",
    // keyboardNumber: "1234567890ABCDEFGHJKLMNPQRSTUVWXYZ港澳学",
    keyboardNumber: "1234567890QWERTYUP港澳ASDFGHJKL学ZXCVBNM",
    keyboard1: "渝川京沪粤津冀晋蒙辽吉黑苏浙皖闽赣鲁豫鄂湘桂琼贵云藏陕甘青宁新",
    inputPlates: {
      index0: "",
      index1: "",
      index2: "",
      index3: "",
      index4: "",
      index5: "",
      index6: "",
      index7: ""
    },
    inputOnFocusIndex: "",
    isNewEnergy: false,
    carNum: "",
	tabheight:48,
  },
  attached() {
	 let tabheight = wx.getStorageSync('tabheight')
	 this.setData({
	 		tabheight:tabheight,
	 }); 
  },
  methods: {
  changeplate: function () {
    var that = this;
	  that.setData({
		isNewEnergy:!that.data.isNewEnergy,
	  });
	  this.checkCarNum();
  },
  //切换车牌
  changeplate1: function () {
    var that = this;
    that.setData({
      flag: true,
      inputPlates: {
        index0: "",
        index1: "",
        index2: "",
        index3: "",
        index4: "",
        index5: "",
        index6: "",
        index7: ""
      },
    })
  },
  inputClick: function (t) {
    var that = this;
	 let tabheight = wx.getStorageSync('tabheight')
	 that.setData({
	 		tabheight:tabheight,
	 }); 
    console.log('输入框:', t);
    console.log('输入框:', t.target.dataset.id);
    if (t.target.dataset.id == 0) {
      that.setData({
        inputOnFocusIndex: t.target.dataset.id,
        isNumberKB: true,
        isKeyboard: true,
        tapNum: false,
      })
    };
    if (t.target.dataset.id == 1) {
      that.setData({
        inputOnFocusIndex: t.target.dataset.id,
        isNumberKB: false,
        isKeyboard: true,
        tapNum: false,
      })
    }
    if (t.target.dataset.id > 1) {
      that.setData({
        inputOnFocusIndex: t.target.dataset.id,
        isNumberKB: false,
        isKeyboard: true,
        tapNum: true,
      })
    }
  },
  //键盘点击事件
  tapKeyboard: function (t) {
    t.target.dataset.index;
    var a = t.target.dataset.val;
    //console.log("data",this.data);
    //console.log('键盘:',a);
    //console.log("index",t.target.dataset.index);
    //console.log("focus",this.data.inputOnFocusIndex);
    switch (parseInt(this.data.inputOnFocusIndex)) {
      case 0:
        this.setData({
          "inputPlates.index0": a,
          inputOnFocusIndex: "1"
        });
        break;
      case 1:
        this.setData({
          "inputPlates.index1": a,
          inputOnFocusIndex: "2"
        });
        break;
      case 2:
        this.setData({
          "inputPlates.index2": a,
          inputOnFocusIndex: "3"
        });
        break;
      case 3:
        this.setData({
          "inputPlates.index3": a,
          inputOnFocusIndex: "4"
        });
        break;
      case 4:
        this.setData({
          "inputPlates.index4": a,
          inputOnFocusIndex: "5"
        });
        break;
      case 5:
        this.setData({
          "inputPlates.index5": a,
          inputOnFocusIndex: "6"
        });
        break;
      case 6:
        this.setData({
          "inputPlates.index6": a,
          inputOnFocusIndex: "7"
        });
        break;
      case 7:
        this.setData({
          "inputPlates.index7": a,
          inputOnFocusIndex: "7"
        });
    }
    var n = this.data.inputPlates.index0 + this.data.inputPlates.index1 + this.data.inputPlates.index2 + this.data.inputPlates.index3 + this.data.inputPlates.index4 + this.data.inputPlates.index5 +
      this.data.inputPlates.index6 + this.data.inputPlates.index7
    console.log('车牌号:', n);
    this.data.carNum = n;
    this.checkedSubmitButtonEnabled();
    this.checkCarNum();
	
	
  },
  //键盘关闭按钮点击事件
  tapSpecBtn: function (t) {
    var a = this,
      e = t.target.dataset.index;
    if (0 == e) {
      switch (parseInt(this.data.inputOnFocusIndex)) {
        case 0:
          this.setData({
            "inputPlates.index0": "",
            inputOnFocusIndex: "0"
          });
          break;
        case 1:
          this.setData({
            "inputPlates.index1": "",
            inputOnFocusIndex: "0"
          });
          break;
        case 2:
          this.setData({
            "inputPlates.index2": "",
            inputOnFocusIndex: "1"
          });
          break;
        case 3:
          this.setData({
            "inputPlates.index3": "",
            inputOnFocusIndex: "2"
          });
          break;
        case 4:
          this.setData({
            "inputPlates.index4": "",
            inputOnFocusIndex: "3"
          });
          break;
        case 5:
          this.setData({
            "inputPlates.index5": "",
            inputOnFocusIndex: "4"
          });
          break;
        case 6:
          this.setData({
            "inputPlates.index6": "",
            inputOnFocusIndex: "5"
          });
          break;
        case 7:
          this.setData({
            "inputPlates.index7": "",
            inputOnFocusIndex: "6"
          });
      }
      this.checkedSubmitButtonEnabled();
	  var n = this.data.inputPlates.index0 + this.data.inputPlates.index1 + this.data.inputPlates.index2 + this.data.inputPlates.index3 + this.data.inputPlates.index4 + this.data.inputPlates.index5 +
	    this.data.inputPlates.index6 + this.data.inputPlates.index7
	  //console.log('车牌号:', n);
	  this.data.carNum = n;
	  var res = this.checkCarNum();
    } else if (1 == e){
			
		
		this.checkedSubmitButtonEnabled();
		var n = this.data.inputPlates.index0 + this.data.inputPlates.index1 + this.data.inputPlates.index2 + this.data.inputPlates.index3 + this.data.inputPlates.index4 + this.data.inputPlates.index5 +
		  this.data.inputPlates.index6 + this.data.inputPlates.index7
		//console.log('车牌号:', n);
		this.data.carNum = n;
		var res = this.checkCarNum();
		if(res===false){
			wx.showToast({
			  title: '请输入完整的车牌号',
			  icon:'none'
			})
			return false;
		}
		a.setData({
		  isKeyboard: !1,
		  isNumberKB: !1,
		  inputOnFocusIndex: ""
		})
	}else if (2 == e){
		a.setData({
		  isKeyboard: !1,
		  isNumberKB: !1,
		  inputOnFocusIndex: "",
		  inputPlates: {
		    index0: "",
		    index1: "",
		    index2: "",
		    index3: "",
		    index4: "",
		    index5: "",
		    index6: "",
		    index7: ""
		  },
		  inputOnFocusIndex: "",
		  isNewEnergy: false,
		  carNum: ""
		})
	}

  },
  //键盘切换
  checkedKeyboard: function () {
    var t = this;
    //console.log("键盘切换", this.data.inputOnFocusIndex);
    if (this.data.inputOnFocusIndex == 0) {
      t.setData({
        tapNum: false,
        isNumberKB: true
      })
    }
    if (this.data.inputOnFocusIndex == 1) {
      t.setData({
        tapNum: false,
        isNumberKB: false
      })
    }
    if (this.data.inputOnFocusIndex > 1) {
      t.setData({
        tapNum: true,
        isNumberKB: false
      })
    }
  },
  checkedSubmitButtonEnabled: function () {
    this.checkedKeyboard();
    var t = !0;
    for (var a in this.data.inputPlates)
      if ("index7" != a && this.data.inputPlates[a].length < 1) {
        t = !1;
        break;
      }
  },
  //校验车牌号-车牌输入限制了正确格式只判断车牌位数
  checkCarNum: function () {
    if (this.data.isNewEnergy && this.data.carNum.length < 8) {
      let res={
        carNum:this.data.carNum,
        isPlate:false,
		isNewEnergy:this.data.isNewEnergy,
		inputPlates:this.data.inputPlates,
      }
	  this.setData({
	  	carNum:this.data.carNum,
	  })
      this.triggerEvent("setCarNum",res);
      return false
    }
    if (!this.data.isNewEnergy) {
      if (this.data.carNum.length < 7) {
        let res={
          carNum:this.data.carNum,
          isPlate:false,
		  inputPlates:this.data.inputPlates,
		  isNewEnergy:this.data.isNewEnergy,
        }
		this.setData({
			carNum:this.data.carNum,
		})
        this.triggerEvent("setCarNum",res);
        return false
      } else {
        var carNum = this.data.carNum.substr(0, 7);
        let res={
          carNum:carNum,
          isPlate:true,
		  inputPlates:this.data.inputPlates,
		  isNewEnergy:this.data.isNewEnergy,
        }
		this.setData({
			carNum:carNum,
		})
        this.triggerEvent("setCarNum",res);
        return true;
      }
    }
    let res={
      carNum:this.data.carNum,
      isPlate:true,
	  isNewEnergy:this.data.isNewEnergy,
	  inputPlates:this.data.inputPlates,
    }
	this.setData({
		carNum:this.data.carNum
	})
    this.triggerEvent("setCarNum",res);
    return true;
  }

  }

})

carinput/wxss


.con-query {
  width:100%;
  border-radius: 8px;
  background-color: #FFF;
}

.pages_header {
  width: 100%;
  display: flex;
  flex-direction: column;
  align-items: center;
}

.pages_header_top {
  width: 33.3%;
  height: 60rpx;
  border-left: 5px solid green;
  border-right: 5px solid green;
}

.pages_header_btm {
  width: 70%;
  background: green;
  height: 120rpx;
  line-height: 120rpx;
  text-align: center;
  color: white;
  border-radius: 10rpx;
  font-weight: normal;
  font-size: 16pt;
}

.tips {
  text-align: center;
  margin: 60rpx 0;
  font-size: 12pt;
  color: #888888;
  
}
.plate-input-text{
  text-align: center;
  line-height: 90rpx;
  color: #f39900;
}
.plate-input-flag {
  float: right;
  margin-right: 8%;
  font-size: 14PX;
}
.plate-input-flag .new-energy{
  color: #14c414;
}
.plate-input-body {
  /*border: 1px solid red;*/
  height: 80rpx;
  width: 100%;
}
.plate-input-content {
  display: flex;
  flex-direction: row;
  height: 80rpx;
}

.plate-nums-foc {
  flex: 1;
  border: 2rpx solid #FFB93F;
  margin: 0 5rpx 0 5rpx;
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  height: 100%;
  box-sizing: border-box;
  border-radius: 4rpx;
}
.plate-input-flag-top{
	float: right;
	margin-right:18%;
	font-size: 14PX;
	display: flex;
	align-items: center;
	justify-content: center;
}

.plate-nums-first{
  flex: 1;
 border: 1rpx solid #CCCCCC;
 margin: 0 5rpx 0 5rpx;
 display: flex;
 align-items: center;
 justify-content: center;
 text-align: center;
 height: 100%;
 box-sizing: border-box;
}

.plate-num-text {
 flex: 1;
 line-height: 80rpx;
 height: 100%;
 box-sizing: border-box;
 font-size: 40rpx;
 font-weight: 300;
}

.new-plate-input-content{
display: flex;
flex-direction: row;
height: 100rpx;
}
.plate-content-top{
	    justify-content: flex-end;
}

.kb_bot {
 align-content: relative;
 width: 100%;
 height: 74rpx;
 background: #fff;
 border-top: solid #ebebeb 2rpx;
 border-bottom: 15rpx solid #F4F4F4;
}
.kb_top
 {
 align-content: relative;
 width: 100%;
 height: 162rpx;
 background: #fff;
 border-top: solid #ebebeb 2rpx;
 border-bottom: 15rpx solid #F4F4F4;
}

.keyboard {
 z-index: 9999;
 position: fixed;
 bottom:0;
 left: 0;
 width: 100%;
 height: auto;
 background: #F4F4F4;
 display: flex;
 flex-wrap: wrap;
 border-bottom: 15rpx solid #F4F4F4;
}

.td {
 font-family: "微软雅黑";
 flex-grow: 1;
 text-align: center;
 font-size: 34rpx;
 height: 86rpx;
 line-height: 80rpx;
 background: #fff;
 margin: 10rpx 5rpx;
 color: #333;
 border-radius: 2rpx;
 box-shadow: 0rpx 2rpx 0rpx #a9a9a9;
}



.td_nor {
 flex: 1 1 6%;
}

.td_num {
 flex: 1 1 8%;
}

.td_spec {
 flex: 1 1 12%;
}

.board_bg {
 box-shadow: 0 0 0 #e5e5e5;
 background: #e5e5e5;
}
.del-first {
 position: absolute;
 bottom: 10rpx;
 right: 100rpx;
 width: 80rpx;
 height: 86rpx;
 background-color: #fff;
 box-shadow: 0rpx 2rpx 0rpx #a9a9a9;
 display: flex;
 align-items: center;
 justify-content: center;
 border-radius: 10rpx;
}
.del-sed{
 position: absolute;
 bottom: 10rpx;
 right: 10rpx;
 width: 80rpx;
 height: 86rpx;
 background-color: #fff;
 box-shadow: 0rpx 2rpx 0rpx #a9a9a9;
 display: flex;
 align-items: center;
 justify-content: center;
 border-radius: 10rpx;
}
.del-hover {
 position: absolute;
 bottom: 10rpx;
 right: 10rpx;
 width: 137rpx;
 height: 86rpx;
 background-color: #e5e5e5;
 display: flex;
 align-items: center;
 justify-content: center;
 border-radius: 10rpx;
 box-shadow: 0 0 0 #e5e5e5;
}
.del-img {
 display: block;
 width: 46rpx;
 height: 38rpx;
}
.color-white{
  color: #FFFFFF;
}

.color-red{
  color: #ff0000;
}
.bule{
  color: #0000ff;
}

引入

在需要调用的页面 usingComponents 中引入 “car-input”: “/components/car-input/index”

{
  "usingComponents": {
    "mp-form-page": "weui-miniprogram/form-page/form-page",
    "mp-form": "weui-miniprogram/form/form",
    "carinput": "/components/car-input/index"
  }
}
在页面中调用
<car-input bind:setCarNum="getCarNum" car-num="{{carinfo.carNum}}" is-new-energy="{{carinfo.isNewEnergy}}" input-plates="{{carinfo.inputPlates}}"></car-input>
设置事件
getCarNum(e){
     let carinfo = {}
     carinfo.carNum =e.detail.carNum
     carinfo.inputPlates =e.detail.inputPlates
     carinfo.isPlate = e.detail.isPlate
     carinfo.isNewEnergy = e.detail.isNewEnergy
     this.setData({
     carinfo
     })
 }      
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

微信小程序自定义车牌输入组件(结合Weui) 的相关文章

  • filezilla中文目录乱码怎么解决

    FileZilla是一款常用的文件传输工具 但在使用过程中可能会遇到乱码的问题 以下是一些可能的解决方案 设置字符集 在连接上站点后 点击菜单栏的 文件 选项 下拉选择 添加当前连接到站点管理器 在弹出的 站点管理器 窗口中 左侧选择 新站
  • vue中的防抖和节流

    在Vue中 防抖和节流是两种常用的优化技术 用于限制事件的触发频率 以提高页面性能 防抖 Debounce 是指在事件被触发后 等待一段时间后再执行回调函数 如果在这段等待时间内 事件又被触发 则重新计时 防抖通常用于限制重复触发频率较高的
  • 事件委托Tab栏切换

  • CTF之逆向入门

    逆向工程 Reverse Engineering 又称反向工程 是一种技术过程 即对一项目标产品进行逆向分析及研究 从而演绎并得出该产品的处理流程 组织结构 功能性能规格等设计要素 以制作出功能相近 但又不完全一样的产品 逆向工程源于商业及
  • Element-Puls中el-upload组件结合vue-draggable-plus实现上传支持拖拽排序(并保留el-upload原有样式、预览、删除)等功能

    展示效果 需求 需求想要一个可拖拽排序的图片列表 但是发现el upload虽然可以实现照片墙 但是没办法拖拽 实现思路 使用 vue draggable plus 拖拽插件 隐藏Upload原有的已上传文件列表 自定义上传后文件列表的样式
  • JS特效第74弹:旅游城市图片百叶窗切换React特效

    全屏的旅游城市景点图片滑动百叶窗轮播切换效果 先来看看效果 一部分关键的代码如下 div div
  • 如何给 unplugin-vue-components/vite 写一个简单的 resolver

    大部分工作 unplugin vue components 都已经处理好了 我们只需要接收组件名来判断是否是自己的组件 然后处理对应的导入逻辑 一共 3 个字段 as 重命名类似 import componentNameReName fro
  • 每天10个前端小知识 <Day 1>

    前端面试基础知识题 1 将数组的length设置为0 取第一个元素会返回什么 设置 length 0 会清空数组 所以会返回 undefined 2 e target 和 e currentTarget 有什么区别 e target 触发事
  • Web 安全漏洞之 OS 命令注入

    什么是 OS 命令注入 上周我们分享了一篇 Web 安全漏洞之 SQL 注入 其原理简单来说就是因为 SQL 是一种结构化字符串语言 攻击者利用可以随意构造语句的漏洞构造了开发者意料之外的语句 而今天要讲的 OS 命令注入其实原理和 SQL
  • 38条Web测试经验分享

    1 页面链接检查 每一个链接是否都有对应的页面 并且页面之间切换正确 可以使用一些工具 如LinkBotPro File AIDCS HTML Link Validater Xenu等工具 LinkBotPro不支持中文 中文字符显示为乱码
  • WEB前端常见受攻击方式及解决办法总结

    一个网址建立后 如果不注意安全问题 就很容易被人攻击 下面讨论一下集中漏洞情况和放置攻击的方法 一 SQL注入 所谓的SQL注入 就是通过把SQL命令插入到web表单提交或输入域名或页面请求的查询字符串 最终达到欺骗服务器执行恶意的SQL命
  • 每天10个前端小知识 <Day 8>

    1 Javascript中如何实现函数缓存 函数缓存有哪些应用场景 函数缓存 就是将函数运算过的结果进行缓存 本质上就是用空间 缓存存储 换时间 计算过程 常用于缓存数据计算结果和缓存对象 缓存只是一个临时的数据存储 它保存数据 以便将来对
  • 基于java的饮食分享平台系统设计与实现

    基于java的饮食分享平台系统设计与实现 I 引言 A 研究背景和动机 近年来 随着人们生活水平的提高和健康意识的增强 饮食健康已经成为越来越多人的关注焦点 因此 一个方便快捷的饮食分享平台就显得尤为重要 基于Java的饮食分享平台系统设计
  • 思政课程如何提升学习效率?这个方法分享给你

    在当今社会 思政学习具有重要的意义 思政通学习小程序为我们提供了一个优质的学习平台 通过不断深入思考和学习 我们能够更好地认识社会 提升自我素质 客户案例 陈同学 思政通学习小程序提供了涵盖政治 经济 文化 科技等多个领域的学习内容 使我能
  • 低代码-添加按钮组件设计

    效果图 可拆分为以下细节 按钮列表 删除 两个操作需同步删除 点击外侧删除 点击复选框删除 添加 点击复选框添加 示例代码 技术栈 vue3 arco design ts less tailwindcss
  • 新手也能看懂的【前端自动化测试入门】!

    前言 最近在网上搜索前端自动化测试相关的文档 但是发现网上的文章都是偏使用 没有把一些基础概念说清楚 导致后续一口气遇到一些 karma Jasmine jest Mocha Chai BDD 等词汇的时候很容易一头雾水 这次一方面整理一下
  • vue实现 marquee(走马灯)

    样式 代码 div class marquee prompt div class list prompt span class prompt item span div div data return listPrompt xxx xxxx
  • 计算机Java项目|springboot校园台球厅人员与设备管理系统

    作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智能与大数据 简历模板
  • APP开发毕业设计|ssm爱心小屋公益机构智慧管理APP

    作者主页 编程指南针 作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智
  • Web自动化测试 —— cookie复用

    一 cookie简介 cookie是一些数据 存储于用户电脑的文本文件中 当web服务器想浏览器发送web页面时 在链接关闭后 服务端不会记录用户信息 二 为什么要使用Cookie自动化登录 复用浏览器仍然在每次用例开始都需要人为介入 若用

随机推荐

  • 入门级题解143. 重排链表

    写在前面 链表的题 1 取独立节点 保存接口 接口即 gt next 2 会用哑节点 return dummy gt next 3 最重要的是 gt next 理解 理解再理解 并随时能够掌握它的最新变化 给定一个单链表 L 的头节点 he
  • 毕业论文尾注和参考文献

    毕业论文在正文中引用参考文献的方式主要有两种 交叉引用和尾注 交叉引用比较简单 这里不介绍 添加尾注出现的问题 插入尾注 尾注直接出现在文档的最后边 将致谢 作者简介等都引用到尾注中 导致致谢 作者简介等在标题栏中消失 添加尾注的原理 首先
  • 计算机图形学实验错误及解决方法,计算机图形学实验课实验总解决方案.doc

    西南交通大学信息科学与技术学院 计算机图形学实验课 2015 2016 学年 第II学期 实 验 报 告 学号 姓名 朱彦荣 专业 软件工程 班级 软件工程2 课程名称 计算机图形学 班级 软件工程2 学号 姓名 朱彦荣 实验日期 2016
  • MATLAB关掉ColorBar的刻度线

    MATLAB使用colorbar显示时默认会带有刻度线 文章里的图一般是没有刻度线的 可以用下面命令关掉刻度线 colorbar Ticks
  • HAL读写FLASH笔记

    HAL读写FLASH笔记 目录 HAL读写FLASH笔记 1 整理数据 2 解锁 3 擦除扇区 4 写入数据 5 上锁 代码整理 写函数 读函数 注意 效果截图 1 整理数据 FLASH写入函数HAL FLASH Program可以写入16
  • Python——输入一个三位数,求每一位相加的和

    题目 输入一个三位整数 求每一位相加的和 例 输入123 输出 1 2 3 6 代码 x eval input 输入一个三位数 hundred x 100 decade x 10 10 digit x 10 sum hundred deca
  • K8s YAML文件中command 执行多条命令

    且在describe和kubelet日志中没有明确记录原因 基本都是因为command命令不合法导致 如需要运行多条命令 使用 不要使用 如下示例 command bin sh args c usr local bin redis star
  • RISC-V IDE MRS使用笔记(八):实现局域网下的远程调试功能

    RISC V IDE MRS使用笔记 八 实现局域网下的远程调试功能 1 原理介绍 MRS调试时上位机与硬件的通信基于gdb客户端与服务端的连接 调试时 首先启动openocd以挂载gdbserver的服务到指定端口上 通信建立后 监听到界
  • wireshark提取视频数据之RTP包中提取H264和H265

    wireshark提取视频数据之RTP包中提取H264和H265 文章目录 wireshark提取视频数据之RTP包中提取H264和H265 1 背景 2 提取前工作 3 H264视频从RTP包中提取步骤 4 H265视频从RTP包中提取步
  • java基础——随笔01

    数组实例 package org example common public class ZongJie 数组作为函数参数 public static void printArray int array System out println
  • 测试大佬评定的7个等级,只有1%的人达到第7层,看看你再几层?

    有人说 软件测试就是最low的点点点工作 有人说 测试工作职位薪水到一定程度只能原地踏步无法提升 也有人说 测试行业相对于开发来说技术性很低 容易被取代 这其实是对测试行业最大的误解 测试可深可浅 可窄可广 牛叉的测试很少 很多对测试侃侃而
  • AD之PCB快速选中所有元器件并锁定

    用AD设计PCB时 想锁定所有元器件 以免调整位号时 不小心移动元件 方法 1 选中所有元器件 任选中一个元件 点 右键 选 查找相似对象 2 Object Kind 一定时 Component 元件 若不是 说明没选好 重选 然后点 确定
  • Day23-Model操作,Form操作和序列化操作

    1 搭建环境请参考 http www cnblogs com momo8238 p 7508677 html 二 Form操作 一般会创建forms py文件 单独存放form模块 Form 专门做数据验证 而且非常强大 有以下两个插件 1
  • nodejs通过request请求远程url的文件并下载到本地

    需要循环去下载远程文件 然后自己写了一个demo 可以直接运行 如下 文件下载var fs require fs var path require path var request require request 创建文件夹目录var di
  • cuda 9.1 linux 安装教程,Ubuntu 16.04安装NVIDIA的显卡驱动396和CUDA9.1

    Ubuntu安装NVIDIA的显卡驱动和CUDA Toolkit Ubuntu 这里是用16 04LTS桌面版 如果是17 04及以后版本 因为使用的显示服务器不同 可能又会有所不同 安装NVIDIA的显卡驱动经常出现启动后死循环进不去系统
  • linux——open函数

    1 使用open 函数调用 需要注意头文件
  • pbft为什么需要2f+1

    将阵营分为两拨 好节点阵营 坏节点阵营 现在坏节点阵营想要误导好节点 让其误以为已经有足够人数发出了投票 并且发生分歧 如何做 假设最极端情况 好节点被等分为两拨A B 坏节点加上任意一个阵营的人数都能达到足够人数达成投票 那坏节点就可以发
  • 法律逻辑学

    法律与逻辑的关系 1 法学离不开逻辑 逻辑是法学的基础 无论立法 司法 法治的实现 还是法学研究 法律教学都离不开逻辑 理性思维与非理性思维的最根本区别是思维是否具有逻辑性 思维逻辑性 就是思维活动遵循逻辑规律 正确地运用概念 恰当地做出判
  • linux echo

    linux echo功能说明 显示文字 语 法 echo ne 字符串 或 echo help version 补充说明 echo会将输入的字符串送往标准输出 输出的字符串间以空白字符隔开 并在最后加上换行号 参 数 n 不要在最后自动换行
  • 微信小程序自定义车牌输入组件(结合Weui)

    文章目录 概要 描述 效果 组件代码 引入 概要 我们都知道车牌是有一定规律的 本文实现了微信小程序中实现车牌输入功能 具有一定的参考价值 感兴趣的小伙伴们可以参考一下 描述 近期做了一个和车有关的小程序项目 有车肯定就有车牌 我们都知道车