vue中实现纯数字键盘

news2025/2/25 8:17:19

一、完整 代码展示

<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); // 正常请求token
						storage.set("User-Info", JSON.stringify(res.data)); // 正常请求token
						setTimeout(() => {
							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.telShow
					this.show = false
				} else {
					this.show = !this.show
					this.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>

手机号数字键盘效果图

验证码数字键盘效果图

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【每日OJ —— KY11 二叉树遍历】

每日OJ —— KY11 二叉树遍历 1.题目&#xff1a;KY11 二叉树遍历2.解法2.1.算法讲解2.2.代码实现2.3.提交通过展示 1.题目&#xff1a;KY11 二叉树遍历 2.解法 2.1.算法讲解 1.首先需要创建二叉树结构。 2.其次&#xff0c;根据题目根据题目遍历的顺序要求来实现构建二叉树的…

如何查看电脑内存?Windows 和 Mac 方法不同

Windows 系统查看内存方法 在 Windows 操作系统中我们查看电脑内存在哪里查呢&#xff1f;下面总结的 3 种查看电脑内存的方法都可以使用&#xff1a;使用任务管理器&#xff1a;任务管理器是 Windows 中一个强大的工具&#xff0c;可用于监视和管理计算机的性能和资源使用。使…

解读免费化潮流:为何数据可视化软件向免费迈进?

近年来&#xff0c;我们见证了数据可视化软件呈现出明显的免费化趋势。这个趋势的背后隐藏着许多关键原因&#xff0c;影响着整个数据行业的发展和走向。为何数据可视化软件开始朝着免费方向发展&#xff1f;让我们一同深入探讨。 普及数字化需求&#xff1a; 数字化已经深入到…

金融系统中容易踩坑的问题

1、产品类型指的是大类还是小类 有的产品比如员工贷既是指员工贷小类&#xff0c;也是指员工贷系列的产品&#xff0c;这时候需要关注需求描述的员工贷覆盖范围是产品大类还是小类。 2、未带参数时是否有默认处理 前端传输的某个值为空时&#xff0c;后端是否需要设默认值&a…

设计一款可扩展和基于windows系统的一键处理表格小工具思路

原创/朱季谦 设计一款可扩展和基于windows系统的一键处理表格小工具思路 日常开发当中&#xff0c;业务人员经常会遇到一些重复性整理表格的事情&#xff0c;这时候&#xff0c;就可以通过一些方式进行自动化程序处理&#xff0c;提高工作&#xff08;摸鱼&#xff09;效率。 …

TCP七层协议

物理层 中间的物理链接可以是光缆、电缆、双绞线、无线电波。中间传的是电信号&#xff0c;即010101...这些二进制位。 比特(bit)是二进制&#xff08;Binary Digit&#xff09;的简称&#xff0c;电脑所有的信息都是二进制的&#xff0c;就是0和1组成的。 数据链路层 早期…

为何Go爬虫依然远没有Python爬虫流行

编程语言有很多种&#xff0c;哪种编程适合爬虫具体还得因项目而异。就以我常用GO和Python语言交替来写爬虫一样&#xff0c;针对不同项目采用不同语言来写爬虫。至于python为什么相比go更受欢迎&#xff0c;我总结了下面几种原因。 Go语言和Python语言在爬虫开发上的流行度差…

【spring】bean的后处理器

目录 一、作用二、常见的bean后处理器2.1 AutowiredAnnotationBeanPostProcessor2.1.1 说明2.1.2 代码示例2.1.3 截图示例 2.2 CommonAnnotationBeanPostProcessor2.2.1 说明2.2.2 代码示例2.2.3 截图示例 2.3 ConfigurationPropertiesBindingPostProcessor2.3.1 说明2.3.2 代码…

vivado实现分析与收敛技巧3-面向非工程用户的智能设计运行建议

要使用智能设计运行功能特性 &#xff0c; 需要 Vivado 工程。这是因为需要进行运行管理。以下指示信息解释了创建综合后工程的最简单方法。这些信息适用于以下流程的用户&#xff1a; • 非工程实现运行 • 使用较低版本的 Vivado 或第三方综合工具进行综合 访问智能设计…

高压功率放大器的应用领域有哪些

高压功率放大器是一种特殊的电子设备&#xff0c;用于放大低电压信号到较高的功率水平。它在许多应用领域中发挥着重要作用。下面西安安泰将详细介绍高压功率放大器的几个常见应用领域。 声学领域&#xff1a;高压功率放大器在声学领域中广泛应用。例如&#xff0c;在音响系统和…

【SparkSQL】SparkSQL函数定义(重点:定义UDF函数、使用窗口函数)

【大家好&#xff0c;我是爱干饭的猿&#xff0c;本文重点介绍SparkSQL 定义UDF函数、SparkSQL 使用窗口函数。 后续会继续分享其他重要知识点总结&#xff0c;如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下吧】 上一篇文章&#xff1a;《【SparkSQL…

Windows 安装redis,设置开机自启动

Windows 安装redis,设置开机自启动 文章目录 Windows 安装redis,设置开机自启动下载, 解压到指定目录设置redis密码启动redis服务端停止redis服务端设置自启动 下载, 解压到指定目录 官网地址: https://redis.io/ 安装包下载地址: https://github.com/tporadowski/redis/relea…

VScode 插件 CodeGeex 使用教程

VScode 插件 CodeGeex 使用教程 不过在笔者看来&#xff0c;和国外的 Copilot 存在不小的差距&#xff0c;Copilot 是基于国外的大模型&#xff0c;能力比国内 AI 大模型要强&#xff0c;但要付费、还可能因为网络原因影响速度&#xff0c;所以国内的胜在免费&#xff08;不过…

每日一题:LeetCode-1089. 复写零

每日一题系列&#xff08;day 09&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…

文心大模型3.5 VS ChatGPT3.5,谁更会写代码 ?

问题&#xff1a;请帮我写一段代码&#xff0c;SAP物料凭证创建接口的代码 &#xff1f; 文心大模型3.5&#xff1a;写了一段 python ChatGPT3.5 : 写的还可以啊&#xff0c;理解的很到位,而且用的是S/4新语法呀 &#xff01; DATA: lt_header TYPE TABLE OF bapi2017_gm_head_…

观《王牌对王牌:国宝回国》有感 —— AI绘画之古画修复对比图

一、前言 上周《王牌对王牌》节目的主题是《国宝回国》&#xff0c;而今天的AI绘画的灵感&#xff0c;就来源于这期节目。 下面这组图&#xff0c;左侧部分因时间的流逝而显现出褪色和损伤的痕迹&#xff0c;色彩变得暗淡&#xff0c;细节也因年代久远而变得模糊不清。 而右…

SA与NSA网络架构的区别

SA与NSA网络架构的区别 1. 三大运营商网络制式&#xff1a;2. 5G组网方式及业务特性3. NSA-3系列4. NSA—4系列5. NSA-7系列6. 5G SA网络架构7. 运营商策略 1. 三大运营商网络制式&#xff1a; 联通&#xff1a;3G(WCDMA)\4G(FDD-LTE/TD-LTE)\5G(SA/NSA)移动&#xff1a;2G(GS…

专注数据采集分析系统研发 做设备与MES系统中转站

数据采集是实现MES系统与设备对接的核心环节。通过采集设备产生的实时数据&#xff0c;将其传输给MES系统进行处理和分析。数据采集可以通过直接连接设备的传感器或者通过设备上安装的采集设备实现。采集的数据可以包括设备的运行状态、产量数据、测量数据、能耗数据等。通过数…

光伏电站卫星测绘的优缺点有哪些?

由于环境保护和能源安全的重要性日益凸显&#xff0c;光伏发电作为一种清洁、可再生、分布式的能源形式&#xff0c;已经成为全球能源领域的热门话题。 光伏电站&#xff0c;是指一种利用太阳光能、采用特殊材料诸如晶硅板、逆变器等电子元件组成的发电体系&#xff0c;与电网相…

管理Windows资产新方式:SSH协议

配置默认shell&#xff0c;需要管理员权限运行powershell执行下面命令&#xff1a; New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -F…