当前位置: 首页 > news >正文

vue中实现纯数字键盘

一、完整 代码展示

<template><div class="login"><div class="login-content"><img class="img" src="../../assets/image/loginPhone.png" /><el-card class="box-card"><div slot="header" class="clearfix"><span>手机号登录</span></div><div class="text-content"><el-form :model="ruleForm" label-width="80px"><el-form-item label="手机号" class="keyboard-wrapper"><el-input placeholder="请输入手机号" v-model.sync="ruleForm.tel" clearable@focus="viewShow('tel')" onfocus="this.blur()" @input="handleInputTel" maxlength="11" show-word-limit></el-input></el-form-item><el-form-item label="验证码" class="keyboard-wrapper"><el-input placeholder="请输入验证码" v-model.sync="ruleForm.code" @focus="viewShow('code')"onfocus="this.blur()" @input="handleInput" clearable><template slot="append"><el-button style="font-size: 22px;" :disabled="Boolean(timer)" @click="getCode">{{ timer ? time + "S" : "获取" }}</el-button></template></el-input><!-- 手机号键盘 --><div class="keyboard" v-if="telShow"><div class="num"><table><tr><td @click="changeTel(1)" :class="[tel === 1 ? 'tel' : '']">1</td><td @click="changeTel(2)" :class="[tel === 2 ? 'tel' : '']">2</td><td @click="changeTel(3)" :class="[tel === 3 ? 'tel' : '']">3</td><td rowspan="2" class="delTel" @click="delTel">×</td></tr><tr><td @click="changeTel(4)" :class="[tel === 4 ? 'tel' : '']">4</td><td @click="changeTel(5)" :class="[tel === 5 ? 'tel' : '']">5</td><td @click="changeTel(6)" :class="[tel === 6 ? 'tel' : '']">6</td></tr><tr><td @click="changeTel(7)" :class="[tel === 7 ? 'tel' : '']">7</td><td @click="changeTel(8)" :class="[tel === 8 ? 'tel' : '']">8</td><td @click="changeTel(9)" :class="[tel === 9 ? 'tel' : '']">9</td><td rowspan="2" class="comfirmTel" @click="comfirmTel">确定</td></tr><tr><td @click="changeTel(0)" colspan="3" :class="[tel === 0 ? 'tel' : '']">0</td></tr></table></div></div><!-- 验证码鍵盤 --><div class="keyboard" v-if="show"><div class="num"><table><tr><td @click="change(1)" :class="[code === 1 ? 'code' : '']">1</td><td @click="change(2)" :class="[code === 2 ? 'code' : '']">2</td><td @click="change(3)" :class="[code === 3 ? 'code' : '']">3</td><td rowspan="2" class="del" @click="del">×</td></tr><tr><td @click="change(4)" :class="[code === 4 ? 'code' : '']">4</td><td @click="change(5)" :class="[code === 5 ? 'code' : '']">5</td><td @click="change(6)" :class="[code === 6 ? 'code' : '']">6</td></tr><tr><td @click="change(7)" :class="[code === 7 ? 'code' : '']">7</td><td @click="change(8)" :class="[code === 8 ? 'code' : '']">8</td><td @click="change(9)" :class="[code === 9 ? 'code' : '']">9</td><td rowspan="2" class="comfirm" @click="comfirm">确定</td></tr><tr><td @click="change(0)" colspan="3" :class="[code === 0 ? 'code' : '']">0</td></tr></table></div></div></el-form-item></el-form></div></el-card><div style="text-align: center;margin-left: 10px;"><el-button type="primary" :loading="loading" :disabled="!ruleForm.tel || !ruleForm.code"@click="linkToPage">登录</el-button></div></div></div>
</template>
<script>import storage from "store";import { useLogin, getCode } from "@/api/index.js";export default {data() {return {time: 60,ruleForm: {tel: "",code: "",},show: false,telShow: false,NUM: "",NUMTEL: "",result: [],resultTel: [],tel: '',code: '',timer: null,loading: false,};},computed: {// 统计数量num: function() {return this.result.join("");},// 统计数量numtel: function() {return this.resultTel.join("");},},methods: {//登录linkToPage() {this.loading = true;useLogin(this.ruleForm).then((res) => {if (res.code == 200) {storage.set("Access-Token", res.data.token); // 正常请求tokenstorage.set("User-Info", JSON.stringify(res.data)); // 正常请求tokensetTimeout(() => {this.$router.push("/index")}, 2000);} else {this.$message.error(res.msg);}}).finally(() => {this.loading = false;});},//获取验证码getCode() {if (!this.ruleForm.tel) return;// 检查手机号格式是否正确const phoneNumberRegex = /^1[3456789]\d{9}$/;if (!phoneNumberRegex.test(this.ruleForm.tel)) {this.$message.warning('手机号格式不正确,请重新输入!');return;}getCode(this.ruleForm).then((res) => {if (res.code === 200) {this.$message.success(res.msg);this.timer = setInterval(() => {if (this.time == 0) {clearInterval(this.timer);this.timer = null;this.time = 60;} else {this.time--;}}, 1000);} else {this.$message.error(res.msg);}});},//展示数字键盘viewShow(type) {if (type === 'tel') {this.telShow = !this.telShowthis.show = false} else {this.show = !this.showthis.telShow = false}},handleInput() {if (this.ruleForm.code.length >= 6) return;},//获取选中的数字 验证码change(val, $event) {//设置验证码的长度if (this.ruleForm.code.length >= 6) return;this.ruleForm.code += String(val)if (this.result.length === 0) {return false;} else {this.result.push(this.ruleForm.code);this.NUM = this.result.join("");}},//验证码刪除del() {this.ruleForm.code = this.ruleForm.code.slice(0, -1)this.NUM = this.result.join("");this.$emit("del", this.NUM);},//验证码確認按鈕comfirm() {this.$emit("comfirm", this.NUM);this.show = false;},//获取选中的数字 手机号changeTel(val, $event) {//设置验证码的长度if (this.ruleForm.tel.length >= 11) return;this.ruleForm.tel += String(val)if (this.resultTel.length === 0) {return false;} else {this.resultTel.push(this.ruleForm.tel);this.NUMTEL = this.resultTel.join("");}},handleInputTel() {if (this.ruleForm.tel.length >= 11) return;},//刪除 手机号delTel() {this.ruleForm.tel = this.ruleForm.tel.slice(0, -1)this.NUMTEL = this.resultTel.join("");this.$emit("delTel", this.NUMTEL);},//確認按鈕 手机号comfirmTel() {this.$emit("comfirmTel", this.NUMTEL);this.telShow = false;},},};
</script>

二、方法详解

1、数据详解:

  • ruleForm对象包含了手机号和验证码两个属性;
  • showtelShow分别表示验证码键盘和手机号键盘是否显示状态;
  • NUMNUMTEL表示存储选中的验证码和手机号;
  • resultresultTel表示用于存储选中的验证码和手机号的数组;
  • telcode表示当前选中的手机号和验证码的数字;
  • timer用于控制获取验证码按钮的倒计时;
  • loading表示登录按钮的加载状态。

2、计算属性详解:

  • num用于将选中的验证码数字拼接为字符串;
  • numtel用于将选中的手机号数字拼接为字符串。

3、方法详解:

  • viewShow方法用于切换显示手机号键盘或验证码键盘。
  • handleInput方法用于限制验证码输入框的长度不超过6位。
  • change方法用于获取选中的验证码数字,并将其拼接到ruleForm.code中。
  • del方法用于删除最后一个输入的验证码数字。
  • comfirm方法用于确认验证码的输入,同时关闭验证码键盘。
  • 手机号键盘相关方法同验证码键盘类似。

4、方法注释:

 push():用于向数组末尾添加一个或多个元素 

 slice():方法接收两个参数起始位置和结束位置(不含结束位置)

 this.ruleForm.tel.slice(0, -1)表示获取this.ruleForm.tel的子数组,从索引0开始,到倒数第一个元素(不含倒数第一个元素)结束。简单来说,它删除了this.ruleForm.tel的最后一个字符,并将剩余的部分赋值给this.ruleForm.tel


三、Css样式 

<style lang="less" scoped>.login {padding-top: 80px;}.login-title {position: fixed;left: 0;top: 0;display: flex;align-items: center;justify-content: space-between;width: calc(100% - 80px);height: 160px;padding: 0 40px;background-color: @theme-color;color: #fff;font-size: 38px;font-weight: bold;}.login-content {display: flex;justify-content: center;align-items: center;padding: 200px;}.clearfix {text-align: center;color: #00aaff;font-size: 26px;}.box-card {height: 520px;width: 480px;border-radius: 20px;}.keyboard-wrapper {user-select: none;input {width: 100%;height: 50px;font-size: 26px;}.keyboard {position: fixed;margin-top: 10px;width: 60%;.num {table {width: 32%;border: 1px solid #ccc;border-collapse: collapse;background: #fff;td {height: 60px;vertical-align: middle;color: #333;font-size: 20px;border: 1px solid #ccc;text-align: center;}td.active {background: #ccc;}.del {background: #eee;}.comfirm {font-size: 16px;width: 80px;background: #62c7eb;color: #fff;}.delTel {background: #eee;}.comfirmTel {font-size: 16px;width: 80px;background: #118eeb;color: #fff;}}}}}
</style>

手机号数字键盘效果图

验证码数字键盘效果图

相关文章:

vue中实现纯数字键盘

一、完整 代码展示 <template><div class"login"><div class"login-content"><img class"img" src"../../assets/image/loginPhone.png" /><el-card class"box-card"><div slot"hea…...

C#简化工作之实现网页爬虫获取数据

1、需求 想要获取网站上所有的气象信息&#xff0c;网站如下所示&#xff1a; 目前总共有67页&#xff0c;随便点开一个如下所示&#xff1a; 需要获取所有天气数据&#xff0c;如果靠一个个点开再一个个复制粘贴那么也不知道什么时候才能完成&#xff0c;这个时候就可以使用C…...

回顾过去的五年

回顾过去的五年 不知不觉&#xff0c;一晃就5年了。孩子也慢慢的长大了&#xff0c;都快和我一样高了。 2017-2019年依旧服务于原公司。后来公司停业了&#xff0c;得到了相应的赔偿。在家里呆了几个月&#xff0c;变成了无业游民。陪伴家人&#xff0c;也会收到家人的鞭策。…...

企业微信http协议接口调用,根据手机号搜索联系人

产品说明 一、 hook版本&#xff1a;企业微信hook接口是指将企业微信的功能封装成dll&#xff0c;并提供简易的接口给程序调用。通过hook技术&#xff0c;可以在不修改企业微信客户端源代码的情况下&#xff0c;实现对企业微信客户端的功能进行扩展和定制化。企业微信hook接口…...

第三方支付原理

1.什么是第三方支付 所谓第三方支付&#xff0c;就是一些和各大银行签约、并具备一定实力和信誉保障的第三方独立机构提供的交易支持平台。在通过第三方支付平台的交易中&#xff0c;买方选购商品后&#xff0c;使用第三方平台提供的账户进行货款支付&#xff0c;由第三方通知卖…...

logcat日志的使用——Qt For Android

前言 最近一直用qt开发安卓app&#xff0c;一直无法用真机调试&#xff0c;可能是缺什么东西。但是如果通过Qt Creator在真机上运行&#xff0c;可以在电脑控制台看打印&#xff08;安卓本身的日志、qDebug之类的打印&#xff09;&#xff0c;所以我是通过打印猜测问题所在&am…...

软著项目推荐 深度学习的智能中文对话问答机器人

文章目录 0 简介1 项目架构2 项目的主要过程2.1 数据清洗、预处理2.2 分桶2.3 训练 3 项目的整体结构4 重要的API4.1 LSTM cells部分&#xff1a;4.2 损失函数&#xff1a;4.3 搭建seq2seq框架&#xff1a;4.4 测试部分&#xff1a;4.5 评价NLP测试效果&#xff1a;4.6 梯度截断…...

灰度发布专题---3、Nginx+Lua灰度发布

上一章已经讲解了配置文件灰度发布、应用版本灰度发布、API网关灰度发布实现&#xff0c;但如果用户这时候在代理层如何做灰度发布呢&#xff1f; 代理层灰度发布分析 用户无论访问应用服务还是静态页&#xff0c;都要经过Nginx代理层&#xff0c;我们可以在Nginx这里做灰度发…...

冬天来了,波司登的高端化“春天”不远了?

最近&#xff0c;羽绒服频繁“贵”上热搜。 在众多热搜词条中&#xff0c;一条“国产羽绒服卖到7000元”的话题一度将波司登推上了舆论的风口浪尖。 对此&#xff0c;波司登在最新的业绩说明会上进行了回应&#xff0c;公司表示&#xff1a;“波司登旗下主品牌及子品牌将形成差…...

Vue3.0优点详解

相对于Vue2.0 3.0有了比较大的改进&#xff0c;优势主要有以下几点&#xff1a; 一、性能提升 1、Vue3.0的响应式系统使用了Proxy代理对象&#xff0c;取代了Vue2.0中的Object.defineProperty&#xff0c;使得Vue3.0的响应式系统更快、更灵活。 2、Vue3.0对TypeScript的支持更…...

Unity3D URP 自定义范围的特效热扭曲详解

前言 Unity3D URP&#xff08;Universal Render Pipeline&#xff09;是Unity官方推出的一款渲染管线&#xff0c;可以实现高效、高质量的图形渲染。在URP中&#xff0c;我们可以通过自定义特效来增强游戏的视觉效果。本文将详细解释如何使用URP实现一个自定义范围的特效热扭曲…...

Apache Flink(一):Apache Flink是什么?

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录...

Wordpress自动定时发布怎么开通-Wordpress怎么自动发布原创文章

在当今数字化时代&#xff0c;博客已经成为许多人分享观点、经验和知识的重要平台。然而&#xff0c;对于博主们来说&#xff0c;每天按时发布一篇又一篇的文章可能是一项具有挑战性的任务。为了解决这个问题&#xff0c;一些创新的工具应运而生&#xff0c;其中包括WordPress的…...

VUE项目中问题学习总结(一)

文章目录 &#x1f341;自定义组件使用&#x1f341;clearInterval函数的使用&#x1f33f;定时器的作用 &#x1f341;localStorage的使用&#x1f33f;设置数据&#x1f33f;获取数据&#x1f33f;更新数据&#x1f33f;删除数据 &#x1f341;VUE国际化配置&#x1f341;项目…...

使用K-means把人群分类

1.前言 K-mean 是无监督的聚类算法 算法分类&#xff1a; 2.实现步骤 1.数据加工&#xff1a;把数据转为全数字&#xff08;比如性别男女&#xff0c;转换为0 和 1&#xff09; 2.模型训练 fit 3.预测 3.代码 原数据类似这样(source&#xff1a;http:img-blog.csdnimg.cn…...

静态HTTP和动态HTTP有什么区别

静态HTTP是指网页内容在服务器上以静态文件的形式存在&#xff0c;每个页面都是固定的&#xff0c;不能根据用户的操作或输入进行改变。当用户请求一个静态页面时&#xff0c;服务器直接将页面的HTML代码返回给用户的浏览器进行显示。静态HTTP服务器的主要优点是速度快、简单易…...

分享66个在线客服JS特效,总有一款适合您

分享66个在线客服JS特效&#xff0c;总有一款适合您 66个在线客服JS特效下载 链接&#xff1a;https://pan.baidu.com/s/1VqM6ASgKRFdQ8RyzbsX4uA?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0…...

Backend - Django JsonResponse HttpResponse

目录 一、关系 二、使用 &#xff08;一&#xff09;data 字典传值 1. JsonResponse 2. HttpResponse 3. 例子 &#xff08;二&#xff09;JsonResponse 有一个 safe 参数 &#xff08;三&#xff09;前端接收 1. 接收 JsonResponse 回传的值 2. 接收 HttpResponse 回…...

第四阶|自在行草 暄桐教室,林曦书法 从书法之美到生活之美

我这有很多的课程&#xff0c;需要了可以取用 新一期&#xff08;入门课&#xff09;&#xff0c;目前已经更新完毕。 新一期&#xff08;第一阶&#xff09;&#xff0c;目前已经更新完毕。 新一期&#xff08;第二阶&#xff09;&#xff0c;目前已经更新完毕。 新一期&#…...

kubernetes详解——从入门到入土(更新中~)

k8s简介 编排工具&#xff1a;系统层面ansible、saltstackdocker容器docker compose docker swarm docker machinedocker compose&#xff1a;实现单机容器编排docker swarm&#xff1a;实现多主机整合成为一个docker machine&#xff1a;初始化新主机mesos marathonmesos …...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...

Visual Studio Code 扩展

Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后&#xff0c;命令 changeCase.commands 可预览转换效果 EmmyLua…...

Windows 下端口占用排查与释放全攻略

Windows 下端口占用排查与释放全攻略​ 在开发和运维过程中&#xff0c;经常会遇到端口被占用的问题&#xff08;如 8080、3306 等常用端口&#xff09;。本文将详细介绍如何通过命令行和图形化界面快速定位并释放被占用的端口&#xff0c;帮助你高效解决此类问题。​ 一、准…...