微信小程序车牌键盘输入组件(支持单个删除更改,支持赋值,支持新能源)

news/2024/11/15 21:07:42/文章来源:https://www.cnblogs.com/Scholars/p/18298456

网上一搜一大堆类似但大多都相对简单,适用的场景并不多。多数也不支持赋值 不支持单个删除更改
我就借鉴了以下文章的思路,为了达到自己想要的效果做了相对应的更改。

借鉴文章链接:> https://blog.csdn.net/qq706352062/article/details/105554453?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159652341219195188354739%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=159652341219195188354739&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v3~pc_rank_v3-12-105554453.pc_ecpm_v3_pc_rank_v3&utm_term=%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E8%BD%A6%E7%89%8C%E8%BE%93%E5%85%A5%E9%94%AE%E7%9B%98&spm=1018.2118.3001.4187

效果图如下:

直接上代码!

WXML代码:

点击查看代码
<!-- 车牌号码输入框 -->
<view wx:for="{{carNum}}" wx:key="index" class="text-center inline-block" bind:tap='openKeyboard'><!-- 点 --><text wx:if="{{ index === 2 }}" class="inline-block ml-5 mr-5 fs-40">.</text><!-- 普通车牌 --><input wx:if="{{ index !== 7 }}" model:value="{{ item.value }}" data-index="{{index}}" class="com-carNumber-item {{ item.focus ? 'com-focus' : ''}}" /><!-- 新能源车牌 --><input wx:else model:value="{{!showNewPower ? '+' : item.value }}" data-index="{{index}}" class="com-carNumber-item {{showNewPower ? item.focus ? 'com-focus' : '': 'com-carNumber-item-newpower'}}" />
</view><!-- 虚拟键盘 -->
<view class="com-keyboard" hidden='{{!KeyboardState}}'><view class="com-keyboardConfirm flex-center"><text class="com-vehicleTip bold flex-center">请输入车牌号</text><view class="com-separator"></view><view class="com-keyboardConfirm_btn bold" bindtap='confirmKeyboard'>完成</view></view><!-- 省份简写键盘 --><view class="com-keyboard-item" hidden="{{ focusIndex !== 0 }}"><view wx:for="{{provinces}}" wx:key="index" class="com-keyboard-line"><view wx:for="{{item}}" wx:key="index" wx:for-item="char" data-val="{{char}}" class="com-keyboard-btn" bindtap='bindChoose'>{{char}}</view></view></view><!-- 车牌号码选择键盘 --><view class="com-keyboard-item com-carNumber" hidden="{{focusIndex === 0}}"><!-- 数字键盘 --><view wx:for="{{numbers}}" wx:key="index" class="com-keyboard-line"><view wx:for="{{item}}" wx:key="index" wx:for-item="char" data-val="{{char}}" class="{{ focusIndex !== 1 ? 'com-keyboard-btn' : 'com-keyboard-disabled-btn' }}" bindtap="{{ focusIndex !== 1 ? 'bindChoose' : '' }}">{{char}}</view></view><!-- 字母键盘 --><view wx:for="{{letters}}" wx:key="index" class="com-keyboard-line"><view wx:for="{{item}}" wx:key="index" wx:for-item="char" data-val="{{char}}" class="{{ focusIndex !== 6 && (char === '挂' || char === '港' || char === '澳' || char === '学') ? 'com-keyboard-disabled-btn' : 'com-keyboard-btn'}}" bindtap="bindChoose">{{char}}</view></view><view class="com-keyboard-del" bindtap='bindDelChoose'><text class="fs-40">删除</text></view></view>
</view>

JS代码:

点击查看代码
import { isEmpty, validate } from '../../utils/util';
const icon = 'none', duration = 3000const component = {properties: {vehicleNo: { type: String, value: undefined } // 车牌号},data: {provinces: [ // 省份键盘['京', '沪', '粤', '津', '冀', '晋', '蒙', '辽', '吉', '黑'],['苏', '浙', '皖', '闽', '赣', '鲁', '豫', '鄂', '湘'],['桂', '琼', '渝', '川', '贵', '云', '藏'],['陕', '甘', '青', '宁', '新']],numbers: [ // 数字键盘['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']],letters: [ // 字母键盘['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K'],['L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V'],['W', 'X', 'Y', 'Z', '挂', '港', '澳', '学']],specialChar: ['挂', '港', '澳', '学'], // 特殊字符carNum: Array(8).fill({ value: undefined, focus: false }),focusIndex: 0, // 输入库焦点索引showNewPower: false, // 是否新能源车牌KeyboardState: false // 是否弹出虚拟键盘},attached() {const v = thisconst vehcles = v.data.vehicleNo.split('')const carNum = v.data.carNumvehcles.forEach((m, i) => { carNum[i].value = m })v.setData({ carNum })},/*** 组件的方法列表*/methods: {// 车牌输入框点击展开车牌键盘openKeyboard(e) {const v = thisconst focusIndex = e.target.dataset.indexlet carNum = v.data.carNumlet showNewPower = v.data.showNewPower// 添加新能源尾数if (focusIndex === 7) {if (isEmpty(v.data.carNum[6].value)) return wx.showToast({ title: '为新能源车牌时,前几位车牌号不能为空', icon, duration })if (v.data.specialChar.includes(v.data.carNum[6].value)) return wx.showToast({ title: `为新能源车牌时,第6位车牌号不能为'${v.data.carNum[6].value}'`, icon, duration })showNewPower = truev.setData({ showNewPower, KeyboardState: true })}// 当前点击获得焦点,其余失去焦点carNum[focusIndex].focus = truecarNum = carNum.map((item, index) => {return { ...item, focus: index === focusIndex ? item.focus : false }})// 点击索引不为新能源时if (focusIndex !== 7) showNewPower = falsev.setData({ KeyboardState: true, focusIndex, carNum, showNewPower })},// 键盘选中点击设置bindChoose(e) {const v = thisconst val = e.target.dataset.valconst carNum = v.data.carNumlet focusIndex = v.data.focusIndexif (focusIndex !== 6 && v.data.specialChar.includes(val)) return// 当前选中车牌无值时更新为输入值if (isEmpty(carNum[focusIndex].value)) {carNum[focusIndex].value = valcarNum[focusIndex].focus = falseconst validate = v.data.showNewPower ? 7 : 6// 上一位车牌取消聚焦if (focusIndex < validate) focusIndex++carNum[focusIndex].focus = truev.setData({ carNum, focusIndex })}},// 删除bindDelChoose() {const v = thisconst carNum = v.data.carNumlet focusIndex = v.data.focusIndexlet showNewPower = v.data.showNewPower// 如果删除第6位后继续删除 则focusIndex后退一位并删除第5位车牌 依此类推 // 当删除至省份位车牌时,界面会控制取消删除按钮if (isEmpty(carNum[focusIndex].value)) {// 如果当前索引是新能源车牌 if (focusIndex == 7) showNewPower = falsefocusIndex--carNum[focusIndex].value = undefinedcarNum[focusIndex].focus = true// 后一位车牌取消聚焦carNum[focusIndex + 1].focus = false}else {carNum[v.data.focusIndex].value = undefinedcarNum[v.data.focusIndex].focus = true}v.setData({ carNum, focusIndex, showNewPower })},// 关闭虚拟键盘confirmKeyboard() {const v = thisconst vheicleNo = v.data.carNum.map(m => m.value).join('');if (!validate.vehicle(vheicleNo)) return wx.showToast({ title: '请输入正确的车牌', icon, duration })v.setData({ KeyboardState: false })v.triggerEvent('confirm', { vheicleNo })}}
}Component(component);

WXSS代码:

点击查看代码
/* 车牌号码 */
.com-carNumber-item {width: 55rpx;height: 60rpx;font-size: 18px;border: 2rpx solid #CCCCCC;border-radius: 8rpx;display: inline-block;line-height: 30px;margin: 0 2rpx;vertical-align: middle;caret-color: transparent;
}.com-focus {border: 4rpx solid #A8BFF3;
}/* 新能源 */
.com-carNumber-item-newpower {border: 2rpx dashed #19e622;background-color: #e1fde2;color: #19e622;font-size: 25px;line-height: 45rpx;
}/* 虚拟键盘 */
.com-keyboard {height: auto;background: #d1d5d9;position: fixed;bottom: 0;width: 100%;left: 0;padding-bottom: 30rpx;
}.com-keyboard-item {padding: 10rpx 0 5rpx 0;position: relative;display: block;
}.com-vehicleTip {flex: 1;color: rgba(150, 179, 253, 1);
}.com-separator {width: 1px;height: 50%;background-color: #ccc;margin: 0 10px;
}.com-keyboardConfirm {height: 70rpx;background-color: #f7f7f7;
}.com-keyboardConfirm_btn {float: right;line-height: 70rpx;font-size: 15px;margin-right: 30rpx;color: #FFA500;
}.com-keyboard-line {margin: 0 auto;text-align: center;
}.com-carNumber .com-keyboard-line {text-align: left;margin-left: 5rpx;
}.com-keyboard-btn {font-size: 18px;color: #333333;background: #fff;display: inline-block;padding: 18rpx 0;width: 63rpx;text-align: center;box-shadow: 0 2rpx 0 0 #999999;border-radius: 10rpx;margin: 5rpx 6rpx;
}.com-keyboard-disabled-btn {font-size: 18px;color: #333333;background: #cacaca;display: inline-block;padding: 18rpx 0;width: 63rpx;text-align: center;box-shadow: 0 2rpx 0 0 #999999;border-radius: 10rpx;margin: 5rpx 6rpx;
}.com-keyboard-del {color: black;background: #A7B0BC;display: inline-block;padding: 10rpx 25rpx;box-shadow: 0 2rpx 0 0 #999999;border-radius: 10rpx;margin: 5rpx;position: absolute;bottom: 10rpx;right: 12rpx;
}

公用样式代码(app.wxss):

点击查看代码
.text-center {text-align: center;
}.inline-block {display: inline-block;
}.ml-5 {margin-left: 5rpx;
}.mr-5 {margin-right: 5;
}.fs-40 {font-size: 40rpx;
}.bold {font-weight: bold;
}.flex-center {display: flex;align-items: center;justify-content: center;
}

公用JS代码:

点击查看代码
/*** 是否都是空数据(类型:字符串,数值,对象,数组,布尔)*/
const isEmpty = (...values) => {const isEmptyFunc = (val) => {switch (typeof val) {case 'string':case 'number': return !val // 数值0为空case 'object':// 数组if (Array.isArray(val)) return val.length === 0// null/对象return val === null || Object.keys(val).length === 0case 'boolean': return false // 布尔类型即非空// undefined / functiondefault: return true}}let result = truevalues.forEach(m => { result = result && isEmptyFunc(m) })return result
}/*** 验证*/
const validate = {/** 是车牌号 */vehicle(value) {let result = falseif (value && [7, 8].includes(value.length)) {const express = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4,5}[A-Z0-9挂学警港澳]{1}$/result = express.test(value)}return result}
}

上面gif生成是用 Windows 系统 Win+Shift+S 将操作截图成视频,再去这个网站 https://www.aconvert.com/cn/video/mp4-to-gif/ 将视频转成GIF

预览的时候把图片下载下来

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/742510.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ARC算法实现

1. 概述 Adaptive Replacement Cache(ARC)是一种缓存替换算法,用于提高缓存的命中率。ARC 动态调整缓存策略,以适应实际的访问模式,从而在不确定的工作负载下表现良好。它通过同时维护两个缓存列表来追踪最近使用和频繁使用的数据块,并根据访问模式在这两个列表之间动态分…

西瓜种类与挑选方法

感觉十分有用,留存一下 转载自微信公众号:科技da表哥 西瓜种类如何挑选西瓜

阿里云oss配置:

一,创建bucket bucket是,存储空间是OSS的全局命名空间,相当于数据的容器,可以存储若干文件。点 完成创建 按钮 二,创建账号供访问oss资源创建用户成功后,把accesskey id和accesskey secret复制保存下来三,创建对bucket的访问策略最后点击 确定 按钮创建

Lua调用C的函数

#include <iostream> #include <string> using namespace std;extern "C" {#include "lua.h"#include "lualib.h"#include "lauxlib.h" }int myTest(lua_State* L) {// 获得Lua函数的参数的数量int nArgs = lua_gettop(L)…

如何强制删除文件夹

前几天下载了ZeroTier,不知道是哪里出问题了,手动删除文件夹一直不成功,一直提示“你需要xxx权限才能删除改文件夹”,就算我修改了文件夹所有者有无济于事,在网上找了很多方法都没用,比如说“shift+del”,还是会提示我权限不够 后面找到一个方法终于解决了 每次删文件都提…

pdf.js源码分析-字体加载流程

pdf.js中的字体加载流程,下面演示一种Type1的字体的加载流程,会把一些兼容性的内容省去,只记录字体数据的加载过程中涉及到的方法和作用:evaluator.js -> handleSetFont:操作符列表中加载字体 evaluator.js -> loadFont:加载字体的方法 evaluator.js -> preEval…

vmware个人版免费

官方个人免费版本的VMware产品 2024年5月15日,PC虚拟巨头VMware宣布旗下的两款产品VMware Workstation Pro和VMware Fusion Pro即日起对个人用户免费开放。博通官网注册账号 打开地址:https://www.broadcom.com/ 登录 https://support.broadcom.com/web/ecx/home#.下载安装免…

企业微信对接

基本概念corpid 每个企业都拥有唯一的corpid,获取此信息可在管理后台“我的企业”-“企业信息”下查看“企业ID”(需要有管理员权限) userid 每个成员都有唯一的userid,即所谓“账号”。在管理后台->“通讯录”->点进某个成员的详情页,可以看到。 部门id 每个部门都…

【unity开发】怎么下载国际版的unity编辑器版本

有一天从公司那接手了一个项目,然后发现那个项目的版本我没有,我就去unity官网下载。 下载完了发现还是版本不对。 仔细一看发现,他们用的版本号末尾少了个"c1"。c1的意思是中国特供版,好像是说有微信api的支持。那么我应该怎么做呢? 下面随便一个版本为例子1.点…

html+js实现选中左边的数据到右边

效果后台要开发个功能,给游戏内的用户赠送道具,先把道具列表展示,然后选择要增送的道具,可以加上道具图片之类的,美化 index.html 页面没有美化,只是实现了效果。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&qu…

《代理选择与反爬虫策略探究:如何优化网络爬虫效率与稳定性》

本文全面介绍了在选择合适的代理时应考虑的因素,涵盖了各种代理类型(如高匿代理、隧道代理等)的特点及其适用场景。文章深入探讨了常见的反爬虫策略,以及如何通过调整爬虫策略来应对这些策略,从而提升爬虫的效率和稳定性。适合对网络爬虫开发和代理技术感兴趣的读者阅读。…

Redis部署与使用

一、关系型数据库与非关系型数据库 1.关系型数据库 关系型数据库是一个结构化的数据库,创建在关系模型(二维表格模型)基础上,一般面向于记录。 SQL语句(标准数据查询语言)就是一种基于关系型数据库的语言,用于执行对关系型数据库中数据的检索和操作。 主流的关系型数据库…