微信小程序车牌键盘

最近一个项目用到输入车牌号的功能,给网上看了不少,然后自己优化了一下。
在这里插入图片描述在这里插入图片描述
1.在components目录下新建carKeyboard组件
carKeyboard.wxml

<!-- 输入框 -->
<view class="modal-content" wx:if="{{keyType == 'onlyipt' || keyType == 'iptboard'}}">
    <view class="board-input">
        <block wx:for="{{8}}" wx:key="index">
            <view data-index="{{index}}"  class="input {{selectInputIndex===index?'activeInput':''}}"  bindtap='inputCarNum'>
                <text>{{carNumArr[index] || ''}}</text>
            </view>
        </block>
        <view class="line"></view>
    </view>
</view>

<!-- 车牌 -->
<view class='keyboard' wx:if="{{keyType == 'keyborad' || keyType == 'iptboard'}}">
  <!-- 省键盘 -->
  <view class="provinces" hidden='{{hiddenPro}}'>
    <view class="pro-li fl" wx:for="{{provinceArr}}" wx:key="index" catchtap='proTap' data-province="{{item}}">{{item}}</view>
  </view>
  <!-- 号码键盘	 -->
  <view class="keyNums" hidden='{{hiddenStr}}'>
    <view  wx:if="{{selectInputIndex===1}}" class="row numRow">
      <view  class="pro-li  disabled"  wx:for="{{numArr}}"  wx:key="index" data-str="{{item}}">{{item}}</view>
    </view>
    <view wx:else class="row numRow">
        <view  class="pro-li " wx:for="{{numArr}}"  wx:key="index" catchtap='strTap' data-str="{{item}}">{{item}}</view>
    </view>
    <view class="strOne row">
      <view  class="pro-li " wx:for="{{strArrOne}}" wx:key="index" catchtap='strTap' data-str="{{item}}">{{item}}</view>
    </view>
    <view class="strTwo row">
      <view  class="pro-li " wx:for="{{strArrTwo}}"wx:key="index" catchtap='strTap' data-str="{{item}}">{{item}}</view>
    </view>
    <view class="strThree row">
      <view class="pro-li " wx:for="{{strArrThree}}" wx:key="index" catchtap='strTap' data-str="{{item}}">{{item}}</view>
      <view class='kb-icon pro-li' catchtap='backSpace'>
        <image class='delete-icon' src="./delete.png" />
      </view>
    </view>
  </view>
</view>

carKeyboard.js

const INPUT_NUM = 8;//车牌号输入框个数
const EmptyArray = new Array(INPUT_NUM).fill('');//['','','','','','','','']

// 车牌输入框的下标
const INPUT_INDEX = {
  FIRST: 0,
  SECOND: 1
};

Component({
  properties: {
    keyType: {
      type: String,
      value: 'onlyipt', //onlyipt-输入框,  keyborad-键盘, iptboard-输入框加键盘
    }
  },
  data: {
    // 键
   	provinceArr: ['京', '沪', '津', '冀', '粤', '晋', '蒙', '辽', '吉', '黑', '苏', '浙', '皖', '闽', '赣', ' 鲁', '豫', '鄂', '湘', '桂', '琼', '渝', '川', '贵', '云', '藏', '陕', '甘', '青', '宁', '新'],
    numArr: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'],
    strArrOne: ['Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'P','港','澳'],
    strArrTwo: ['A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L','学'],
    strArrThree: ['Z', 'X', 'C', 'V', 'B', 'N', 'M','警'],
    hiddenPro: false, // 隐藏省份键盘
    hiddenStr: true, // 隐藏数字字母键盘
    carNumArr: EmptyArray,
    selectInputIndex: 0,
  },
  methods: {
    proTap(e) { //点击省份
      let province = e.currentTarget.dataset.province;
      const { carNumArr, selectInputIndex } = this.data;
      this.setData({
        hiddenPro: true,
        hiddenStr: false
      });
      carNumArr[selectInputIndex] = province;
      // 选择车牌号时触发
      this.setData({
        carNumArr,
        // 选中一个后,下一个输入框聚焦
        selectInputIndex: selectInputIndex !== carNumArr.length - 1 ? selectInputIndex + 1 : selectInputIndex,
      });
    },
    strTap(e) { //点击字母数字
      const str = e.currentTarget.dataset.str;
      const { carNumArr, selectInputIndex } = this.data;
      carNumArr[selectInputIndex] = str;
      this.setData({
        carNumArr,
        // 选中一个后,下一个输入框聚焦
        selectInputIndex: selectInputIndex !== carNumArr.length - 1 ? selectInputIndex + 1 : selectInputIndex,
      });
    },
    inputCarNum(e) {
      const { index } = e.currentTarget.dataset;
      this.setData({
        showCarKeyboard: true,
        selectInputIndex: index
      });
      if (index === INPUT_INDEX.FIRST) {
        // 第一个输入框展示省份键盘,第二个展示字母数字输入框(数字不可点),以后就是数字字母输入框(都可点)
        this.setData({
          hiddenPro: false,
          hiddenStr: true
        });
      } else if (index === INPUT_INDEX.SECOND) {
        this.setData({
          hiddenPro: true,
          hiddenStr: false
        });
      } else {
        this.setData({
          hiddenPro: true,
          hiddenStr: false
        });
      }
    },
    backSpace() { //删除
      const { carNumArr, selectInputIndex } = this.data;
      carNumArr[selectInputIndex] = '';
      this.setData({
        carNumArr,
        selectInputIndex: selectInputIndex !== INPUT_INDEX.FIRST ? selectInputIndex - 1 : selectInputIndex,
      }, () => {
        if (this.data.selectInputIndex === INPUT_INDEX.FIRST) { //这里必须要用this.data.selectInputIndex,用最新的
          this.setData({
            hiddenPro: false,
            hiddenStr: true
          });
        }
      });
    },
    onOk() {
      const carNum = this.data.carNumArr.join('');
      this.setData({
        selectInputIndex: -1
      })
      this.triggerEvent('onOk', carNum);
    }
  },
  //监听
  observers: {
    keyType: function(value) {
      console.log(value)
      if(value == 'onlyipt') {
        this.onOk()
      }
    }
  }
});

carKeyboard.wxss

/* 键盘 */
.keyboard {
	width: 100%;
	position: fixed;
	bottom: 0;
	left:0;
	z-index: 1000;
	background-color: rgba(210, 213, 219, 90);
}

.fl {
	float: left
}

.carnum {
	text-align: center;
	height: 88rpx
}

.tel {
	border-bottom: 2rpx solid #ddd;
	height: 100rpx;
	line-height: 100rpx;
}

.provinces {
	overflow: hidden;
	padding-top: 20rpx;
}

.pro-li {
	font-size: 32rpx;
	color: #353535;
	height: 76rpx;
	width: 62rpx;
	line-height: 76rpx;
	text-align: center;
	margin-left: 12rpx;
	margin-bottom: 20rpx;
	background-color: #fff;
	box-shadow: 0px 1rpx 2rpx 0 #9A9A9A;
	border-radius: 5px;
	flex: 1
}

.keyNums .disabled {
	background-color: #F7F7F7;
	color: #CCC
}

.keyNums {
	overflow: hidden;
	padding-top: 20rpx;
	display: flex;
	flex-direction: column;
}

.keyNums .row {
	display: flex;
}

.keyNums .numRow {
	padding: 0 10rpx;
}

.keyNums .strOne {
	padding: 0 10rpx;
}

.keyNums .strOne .strOneItem {
	flex: 1
}

.keyNums .strTwo {
	padding: 0 40rpx;
}

.keyNums .strOne .strTwoItem {
	flex: 1
}

.keyNums .strThree {
	padding-left: 116rpx;
	padding-right: 10rpx;
}

.keyNums .strOne .strThreeItem {
	flex: 1
}

.keyNums .strOne .strThreeItem:nth-child(7) {
	margin-left: 100px
}

.keyNums .pro-li:nth-child(16) {
	color: red
}

.keyNums .strThree .kb-del {
	margin-left: 12rpx
}

.keyNums .strThree .kb-icon {
	flex: 1.5;
	background: #ABB3BD;
	margin-left: 40rpx;
}

/* ipt样式 */
.board-input {
	display: flex;
}

.board-input .input {
	border: 1px solid rgba(151, 151, 151, 0.3);
	margin-right: 6rpx;
	border-radius: 10rpx;
	flex: 1;
	text-align: center;
	height: 80rpx;
	line-height: 80rpx;
	padding: 0 8rpx;
	background: rgba(0, 0, 0, 0.04);
	color: #9A9A9A;
	font-family: PingFangSC-Medium, PingFang SC;
}

.board-input .input:nth-child(1) {
	border-right-width: 0;
	margin-right: 0;
	position: relative;
	border-bottom-right-radius: 0;
	border-top-right-radius: 0;
	z-index: 1;
}

.board-input .input:nth-child(1)::after {
	content: "";
	position: absolute;
	right: -1px;
	width: 1px;
	height: 60rpx;
	top: 10rpx;
	background-color: rgba(151, 151, 151, 0.3);
	/* z-index: -10; */
}
.board-input .input:nth-child(1).activeInput::after {
	display: none;
}


.board-input .input:nth-child(2) {
	position: relative;
	border-left-width: 0;
	margin-right:20rpx;
	border-bottom-left-radius: 0;
	border-top-left-radius: 0;
}

.board-input .input:nth-child(2)::after {
	content: "";
	position: absolute;
	right:-18rpx;
	top: 45%;
	width: 4px;
	height: 4px;
	border-radius: 50%;
	background-color: rgba(151, 151, 151, 0.4);
}

.board-input .input:nth-child(8) {
	border: 1px dashed #5dda62;
}

.board-input .activeInput {
	border-radius: 10rpx !important;
	border: 1px solid #FE785E !important;
	z-index: 10;
}

.board-input .text {
	text-align: right;
	color: #c5c5c5;
	font-size: 28rpx;
}

.delete-icon {
	width: 50rpx;
	height: 45rpx;
	margin-top: 18rpx;
}

carKeyboard.json

{
  "component": true
}

删除的图片 记得下载加上
在这里插入图片描述
2.使用方法
在需要使用的wxml中引入

给当前页面的父级添加事件 bindtap="handleClick",为了点击键盘以外的地方,键盘回收

<carKeyboard
    keyType="{{keyType}}"
    carNum="{{plateNumber}}"
    bind:onOk="onOk"
    catchtap="toShowBoard" 
/>

js

data: {
  plateNumber: '',
  keyType: 'onlyipt'
},

//显示车牌键盘
toShowBoard(){
  this.setData({
    keyType: 'iptboard'
  })
},

//确认车牌号
onOk(e){
  console.log(e.detail, '------输入的车牌号-----')
  this.setData({
    plateNumber: e.detail
  })
},

//点击输入车牌号以外的地方键盘消失
handleClick(e) {
  if(this.data.keyType == 'iptboard') {
    this.setData({
      keyType: 'onlyipt'
    })
  }
}

这就OK了。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值