微信小程序使用车牌号输入法的示例代码

在做小程序时,做了一个关于车的项目,然后需要添加车辆信息、添加车牌号,使用车牌键盘输入,当时我把这个需求给砍了,然后在添加车辆信息时,老大看到数据库里我乱填的车牌号,又让我把他加上了^o^

1.效果图

2.相关代码使用组件形式实现键盘输入

组件代码index.wxml

<view class="carPlate" wx:if="{{show}}">
 <block wx:if="{{type==1}}">
  <view class="wordList">
   <view class="wordItem" wx:for="{{cityKeyword1}}" wx:key="{{item}}" bindtap="handleClick" data-type="1" data-item="{{item}}">{{item}}</view>
  </view>
  <view class="wordList">
   <view class="wordItem" wx:for="{{cityKeyword2}}" wx:key="{{item}}" bindtap="handleClick" data-type="1" data-item="{{item}}">{{item}}</view>
  </view>
  <view class="wordList">
   <view class="wordItem" wx:for="{{cityKeyword3}}" wx:key="{{item}}" bindtap="handleClick" data-type="1" data-item="{{item}}">{{item}}</view>
  </view>
  <view class="wordList">
   <view class="wordItem" wx:for="{{cityKeyword4}}" wx:key="{{item}}" bindtap="handleClick" data-type="1" data-item="{{item}}">{{item}}</view>
  </view>
 </block>
 <block wx:else>
  <view class="wordList">
   <view class="wordItem" wx:for="{{keyNumber}}" wx:key="{{item}}" bindtap="handleClick" data-type="2" data-item="{{item}}">{{item}}</view>
  </view>
  <view class="wordList">
   <view class="wordItem" wx:for="{{wordList1}}" wx:key="{{item}}" bindtap="handleClick" data-type="2" data-item="{{item}}">{{item}}</view>
  </view>
  <view class="wordList">
   <view class="wordItem" wx:for="{{wordList2}}" wx:key="{{item}}" bindtap="handleClick" data-type="2" data-item="{{item}}">{{item}}</view>
   <view class="wordItem wordClear" bindtap="handleClick" data-item="delete">
    <image src="/images/input-clear.png" class="clearImg"></image>
   </view>
  </view>
  <view class="wordList">
   <view class="wordItem" wx:for="{{wordList3}}" wx:key="{{item}}" bindtap="handleClick" data-item="{{item}}">{{item}}</view>
   <view class="wordItem wordConfirm" bindtap="handleClick" data-item="confirm">确定</view>
  </view>
 </block>
</view>

index.css

.carPlate{
 position: fixed;
 padding: 12rpx 12rpx 30rpx;
 left: 0;
 bottom: 0;
 width: 100%;
 /* height: 150px; */
 font-size: 30rpx;
 background: #fff;
 box-sizing: border-box;
 border-top: 1px solid rgb(211, 207, 207);
 z-index: 200;
}
.wordList{
 display: flex;
 width: 100%;
 justify-content: space-between;
 align-items: center;
}
.wordItem{
 margin: 5rpx;
 width: 70rpx;
 height: 70rpx;
 line-height: 70rpx;
 text-align: center;
 border: 1px solid #eee;
 border-radius: 10rpx;
}
.wordConfirm{
 width: 130rpx;
 color: #fff;
 background: #473af0;
}
.wordClear{
 width: 100rpx;
}
.clearImg{
 width: 60rpx;
 height: 60rpx;
 vertical-align: middle;
}

index.js

Component({

 properties: {
  type: {
   type: Number,
   default: 1,
  },
  show: {
   type: Boolean,
   default: false,
  }
 },

 data: {
  cityKeyword1: '京沪浙苏粤鲁晋冀豫',
  cityKeyword2: '川渝辽吉黑皖鄂湘赣',
  cityKeyword3: '闽陕甘宁蒙津贵云',
  cityKeyword4: '桂琼青新藏港澳台',
  keyNumber: '1234567890',
  wordList1: 'QWERTYUIOP',
  wordList2: 'ASDFGHJKL',
  wordList3: 'ZXCVBNM',
 },

 methods: {
  handleClick(e) {
   let value = e.currentTarget.dataset.item;
   let type = e.currentTarget.dataset.type;
   switch(value) {
    case 'confirm':
     this.triggerEvent('confirm');
     break;
    case 'delete':
     this.triggerEvent('delete');
     break;
    default:
     this.triggerEvent('change', { value, type });
   }
  }
 }
})

3.父组件引入

我想实现点击输入后有上拉的效果,开始我想使用offset来实现的,但是下班后洗衣服想了下,不太好实现,我就想到了我以前做购物车时,有用到transform,原理差不多,我就把他用上了

然后就是点击键盘外实现收起键盘,开始我想到的就是在父组件的最外层定义关闭事件,父级里面的盒子都使用catch方法阻止冒泡,但想下阻止冒泡好像又有点不合情理,就又把阻止冒泡给去掉了

父组件index.wxml

<view class="container" bindtap="handlePlateConfirm">
 <view class="translateView" style="transform: translateY({{translateSpace}}px)">
  <view class="list">
   <view class="item">
    <view class="label">*车牌号码</view>
    <view class="contentBox" catchtap="handleClick">
     <view class="inputBox" wx:if="{{carNo}}">{{carNo}}</view>
     <view class="promptText" wx:else>请输入车牌号</view>
    </view>
   </view>
  </view>
 </view>
</view>
<car-plate show="{{showPlateInput}}" bindchange="handlePlateChange" type="{{inputType}}" bindconfirm="handlePlateConfirm" binddelete="handlePlateDelete" />

父组件index.js

Page({
 data: {
  carNo: '',
  translateSpace: 0,
  inputType: 1, // 车牌输入类型,1简称,2数字或者字母,
  showPlateInput: false,
 },
 /* 用于点击弹出键盘输入,space为键盘弹出后向上拉取的距离 */
 handleClick(e) {
  /* 150为键盘的高度 */
  let space = -(e.currentTarget.offsetTop - 150);
  /* regExp用于判断当前已输入的车牌号是否是中文,并让键盘显示中文还是英文输入 */
  let regExp = /^[\u4e00-\u9fa5]+/;
  let inputType = 1;
  if(regExp.test(this.data.carNo)) {
   inputType = 2;
  }

  this.setData({
   translateSpace: space,
   showPlateInput: true,
   inputType
  })
 },
 /* 键盘输入操作 */
 handlePlateChange(e) {
  let value = e.detail.value;
  let type = e.detail.type;
  let carNo = this.data.carNo;
  carNo += value;

  if(type == 1) {
   this.setData({
    inputType: 2
   })
  }
  this.setData({
   carNo
  })
 },
 /* 点击键盘上的确定 */
 handlePlateConfirm() {
  /* isCarPlate用于判断输入的车牌号是否符合规范 */
  if (!this.isCarPlate(this.data.carNo)) {
   wx.showToast({
    title: '请输入正确的车牌号',
    icon: 'none',
    duration: 2000
   })
   return false;
  }
  this.setData({
   translateSpace: 0,
   showPlateInput: false,
   inputType: 1
  })
 },
 /* 用于键盘输入删除 */
 handlePlateDelete(e) {
  let carNo = this.data.carNo;
  carNo = carNo.substring(0, carNo.length - 1);
  if(carNo.length == 0) {
   this.setData({
    inputType: 1
   })
  }
  this.setData({
   carNo,
  })
 },
 /* 判断车牌号 */
 isCarPlate(value) {
  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);
 }
})

父组件index.css

.container{
 height: 100vh;
 background: #fff;
}
.translateView{
 background: #eee;
}
.list{
 margin-bottom: 20rpx;
 background: #fff;
}
.list:last-child{
 margin: 0;
}
.item{
 display: flex;
 padding: 0 26rpx;
 width: 100%;
 height: 116rpx;
 box-sizing: border-box;
 align-items: center;
 border-bottom: 1px solid #eee;
}
.item:last-child{
 border: none;
}
.label{
 margin-right: 10rpx;
 width: 140rpx;
}
.contentBox{
 display: flex;
 width: calc(100% - 150rpx);
 height: 90rpx;
 align-items: center;
 justify-content: space-between;
}
.promptText{
 color: #c7c7c7;
}
.inputBox{
 width: 100%;
 height: 80rpx;
 line-height: 80rpx;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 微信小程序车牌号码模拟键盘输入功能的实现代码

    先来一波预览图. 预览图片一: 预览图二: 预览图三: 预览图四: 预览图五: 大概的效果就和原来图差不多. 思路解析:车牌号码由31位汉字,26位字母,10位数字组成的,开头第一位由省份简称的汉字,第二位字母根据省份下的城市或地区区分,最后的五位或者六位,是有字母和数字组成的,共有七位的车牌号码和八位的车牌号码,(注:其中的八位数的车牌号码为能源车的车牌号码.) 大概的逻辑思维,不包含代码获取值什么的或者验证其他的说明,详细看代码片段. 第一,原型的设计思路:先设计好模拟键盘的大概架构,样式.

  • 微信小程序使用车牌号输入法的示例代码

    在做小程序时,做了一个关于车的项目,然后需要添加车辆信息.添加车牌号,使用车牌键盘输入,当时我把这个需求给砍了,然后在添加车辆信息时,老大看到数据库里我乱填的车牌号,又让我把他加上了^o^ 1.效果图 2.相关代码使用组件形式实现键盘输入 组件代码index.wxml <view class="carPlate" wx:if="{{show}}"> <block wx:if="{{type==1}}"> <view

  • 微信小程序实现拨打电话功能的示例代码

    1.在对应需要拨打电话的标签那里绑定事件(使用的标签不固定,可以是text.view等) 例子: <text class="phone" bindtap="callPhone">400-9121-211</text> 2.在对应的事件方法里面写入 wx.makePhoneCall方法 例子: callPhone() { wx.makePhoneCall({ phoneNumber: '400-9121-211' //仅为示例,并非真实的电话号

  • 微信小程序实现搜索关键词高亮的示例代码

    1,前言 项目中碰到一个需求,搜索数据并且关键词要高亮显示,接到需求,马上开干.先上效果图.源码已经做成了小程序代码片段,放入了GitHub了,文章底部有源码链接. 2,思路 博主第一时间想到的就是使用split,根据搜索的关键词,处理后台返回的数据,然后indexOf找到关键字,给每个字添加deep字段,deep为true,则高亮,为false,则正常.由于是小程序,所以楼主直接做成了一个高亮组件,代码很简单,实现步骤如下. 3,代码逻辑 模拟数据如下 list:[ '武汉大学', '华中科技

  • 微信小程序拖拽排序列表的示例代码

    拖拽排序列表 思路 界面分为两层: 底层,正常列表展示,拖拽的时候不做处理(大牛直接加了动画,原谅我技艺不精,还没实现) 顶层,movable-view组件,不长按不展示,之后长按才展示,且没有点击事件. 事件 主要监听:longpress , touchmove , touchend 三个事件 longpress 保障长按才有效,并设定许多其他值. touchmove 滑动的时候触发 判断是否需要滑动页面,因为 movable-area组件 滑动事件被catch掉,无法滑动: 记录滑动经过的项

  • 微信小程序实现手写签名的示例代码

    目录 1.效果图 2.相关代码 canvas代码 js相关 在微信小程序上实现手写签名,获取canvascontext新版本和旧版本有点坑,新版本在获取canvas后如果页面有滑动,则签名坐标出现异常(在微信开发者工具上会出现2022-2-17),但是在真机上即使滑动也不会出现异常,为了防止出现问题,暂时使用旧版本获取canvascontext 1.效果图 2.相关代码 canvas代码 新版2d canvas <canvas id="canvas" class="ca

  • 微信小程序实现自定义弹窗组件的示例代码

    目录 编写组件代码 Dialog.wxml Dialog.js Dialog.wxss 调用自定义组件 上一篇中说的是小程序自带的弹窗组件,今天,我们来试试小程序的自定义组件,我们自定义一个带确定取消的弹窗组件. 首先,放一下,最终的效果图: 这是我们最后要实现的效果 那么,首先,我们创建一个组件 新建component文件夹存放我们的组件,里边存放的就是我们所用的组件,我们今天要做的事弹出框,新建文件夹popup存放我们的组件模板,点击右键选择新建component,就会自动生成组件的模板wx

  • 微信小程序之页面拦截器的示例代码

    场景 小程序有52个页面,其中13个页面无需任何身份,另外39个页面需要系统角色.对于这39个页面,如果微信用户没有系统角色,则跳转到登录页. 是否有系统角色信息需要通过异步请求来获取. 需求分析&实现 对需求进行抽象,其实要的就是一个过滤器,对小程序页面的访问进行过滤,符合条件的通过,不符合条件进行其他处理. 使用过php的laravel框架的童鞋,肯定一下子就联想到了laravel框架的http中间件: HTTP 中间件提供一个方便的机制来过滤进入应用程序的 HTTP 请求,例如,Larav

  • 微信小程序实现人脸识别登陆的示例代码

    前言 这是一篇关于一个原创微信小程序开发过程的原创文章.涉及到的核心技术是微信小程序开发方法和百度云人脸识别接口.小程序的主体是一个用于个人密码存储的密码管理器,在登陆注册阶段,需要调用百度云人脸识别接口以及百度云在线人脸库的管理接口.本文主要涉及登陆注册模块的实现,而且不需要PHP后台代码,完全在线调用接口实现,希望后来的你能有所收获! 步骤 步骤 涉及接口(百度云) 拍摄或者相册选择 并 上传比对样本照片到 人脸库 人脸库管理接口(main:人脸注册) 拍摄照片并上传,云服务器在线比对 人脸

  • 微信小程序websocket聊天室的实现示例代码

    背景 最近做了一个微信小程序的即时通讯功能,之前我也做过node.js的websocket服务,不过是在web端应用的socket.io服务.小程序本身对http.websocket等连接均有诸多限制,所以这次项目选择了node.js自带的ws模块. 服务端 初始化一个node.js项目,引入ws模块 const webSocket = require('ws'); 创建websocket实例,并设置监听端口 const wss = new webSocket.Server({ port: 30

  • Laravel 微信小程序后端实现用户登录的示例代码

    接上篇微信小程序后端搭建:分享:Laravel 微信小程序后端搭建 后端搭建好后第一件事就是用户登录认证,简单实现微信小程序登录认证 1.user 模型 use Laravel\Passport\HasApiTokens; 新增 use HasApiTokens, Notifiable; protected $fillable = [ 'id', 'name', 'email', 'email_verified_at', 'username', 'phone', 'avatar',//我用来把微

随机推荐