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); // 正常请求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>

手机号数字键盘效果图

验证码数字键盘效果图

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【蓝桥杯软件赛 零基础备赛20周】第6周——栈

文章目录 1. 基本数据结构概述1.1 数据结构和算法的关系1.2 线性数据结构概述1.3 二叉树简介 2. 栈2.1 手写栈2.2 CSTL栈2.3 Java 栈2.4 Python栈 3 习题 1. 基本数据结构概述 很多计算机教材提到&#xff1a;程序 数据结构 算法。 “以数据结构为弓&#xff0c;以算法为箭”…

Linux shell中的函数定义、传参和调用

Linux shell中的函数定义、传参和调用&#xff1a; 函数定义语法&#xff1a; [ function ] functionName [()] { } 示例&#xff1a; #!/bin/bash# get limit if [ $# -eq 1 ] && [ $1 -gt 0 ]; thenlimit$1echo -e "\nINFO: input limit is $limit" e…

Python程序员入门指南:就业前景

文章目录 标题Python程序员入门指南&#xff1a;就业前景Python 就业数据Python的就业前景SWOT分析法Python 就业分析 标题 Python程序员入门指南&#xff1a;就业前景 Python是一种流行的编程语言&#xff0c;它具有简洁、易读和灵活的特点。Python可以用于多种领域&#xff…

Zabbix HA高可用集群搭建

Zabbix HA高可用集群搭建 Zabbix HA高可用集群搭建一、Zabbix 高可用集群&#xff08;Zabbix HA&#xff09;二、部署Zabbix高可用集群1、两个服务端配置1.1主节点 Zabbix Server 配置1.2 备节点 Zabbix Server 配置1.3 主备节点添加监控主机1.4 查看高可用集群状态 2、两个客户…

二、ZooKeeper集群搭建

目录 1、概述 2、安装 2.1 第一步&#xff1a;下载zookeeeper压缩包 2.2 第二步&#xff1a;解压 2.3 第三步&#xff1a;修改配置文件 2.4 第四步&#xff1a;添加myid配置 ​​​​​​​2.5 第五步&#xff1a;安装包分发并修改myid的值 ​​​​​​​2.6 第六步&a…

NXP iMX8M Plus Qt5 双屏显示

By Toradex胡珊逢 简介 双屏显示在显示设备中有着广泛的应用&#xff0c;可以面向不同群体展示特定内容。文章接下来将使用 Verdin iMX8M Plus 的 Arm 计算机模块演示如何方便地在 Toradex 的 Linux BSP 上实现在两个屏幕上显示独立的 Qt 应用。 硬件介绍 Verdin iMX8M Plu…

C++11 类的新功能

新的默认成员函数 C11在6个默认成员函数基础上又加了两个:移动构造函数和移动赋值函数 针对移动构造函数和移动赋值运算符重载有一些需要注意的点如下&#xff1a; 小结&#xff1a; &#xff08;1&#xff09; 生成默认移动构造的条件比较严苛&#xff1a;必须是没有实现析…

微软推出免费网站统计分析工具 Clarity

给大家推送一个福利&#xff0c;最近微软正式对外推出免费网站统计分析工具 Clarity&#xff0c;官方网站是&#xff1a;https://clarity.microsoft.com. 任何用户都可以直接使用&#xff0c;主打一个轻松写意——真的是傻瓜式&#xff0c;没有任何多余的步骤&#xff0c;你唯一…

上门服务系统|北京上门服务系统开发功能及特点

上门护理同城服务系统是一种以社区为基础、以提供上门护理服务为核心的服务体系。上门服务软件是一种基于移动互联网技术的服务平台&#xff0c;旨在提供高效、便捷、安全的上门服务体验。 该软件具有以下特点&#xff1a; 1、便捷性&#xff1a;用户只需在手机上安装该软件&a…

快速上手PostMan,了解PostMan的基本使用

快速上手PostMan PostMan是一个可扩展的API开发和测试协同平台工具有网页版和独立客户端,推荐安装独立客户端 创建WorkSpace工作空间 类似于GitHub的个人空间可以起到云备份的作用 发送请求 发送Get请求 发送Post请求,设置请求体的格式是表单数据即namevalue的格式 发送Pos…

【 RTTI 】

RTTI 概念&#xff1a; RTTI(Run Time Type Identification)即通过运行时类型识别&#xff0c;程序能够使用基类的指针或引用来检 查着这些指针或引用所指的对象的实际派生类型。 原因&#xff1a; C是一种静态类 型语言。其数据类型是在编译期就确定的&#xff0c;不能在运…

一文教你使用STM32CubeMX开发工具

刚开始学习 STM32 的时候&#xff0c;不知道大家有没被外设驱动支配过的恐惧&#xff1f; 那么多的外设&#xff0c;那么多的选项&#xff0c;有可能一个选项没配置对&#xff0c;外设就工作不正常了&#xff0c;大大增加我们入行的难度。 针对这个问题&#xff0c;ST 公司很…

递归实例化导致的栈溢出问题【简直蠢得出奇】

问题描述 今天在练习数据库增删改查&#xff0c;体验三层架构思想时&#xff0c;随便写了点DAO层代码&#xff0c;但服务器运行时竟然爆出了栈溢出的问题&#xff0c;说实话&#xff0c;空指针问题我还能放着耐心去代码里找找问题&#xff0c;但这个栈溢出&#xff0c;我之前就…

如何获取唐诗三百首中的名句列表接口

唐诗三百首&#xff0c;是中国文学中最为经典的诗歌选集之一&#xff0c;其中涵盖了大量美丽、深刻的诗句&#xff0c;被广泛传诵。有不少文化爱好者希望能够获取这些名句列表&#xff0c;以便深入理解唐诗的内涵和精华。那么&#xff0c;如何获取唐诗三百首中的名句列表呢&…

YOLOv5算法进阶改进(7)— 将主干网络SPPF更换为SimSPPF / SPP-CSPC / SPPF-CSPC

前言:Hello大家好,我是小哥谈。SimSPPF是YOLOv6中提出的一种改进的空间金字塔池化方法,它是SPPF的升级版。SimSPPF通过在不同尺度上使用不同大小的池化核来提取特征,从而提高了检测器的性能。与SPPF相比,SimSPPF可以在不增加计算成本的情况下提高检测器的性能。本节课就教…

基于51单片机控制恒压供水系统设计

**单片机设计介绍&#xff0c;基于51单片机的篮球计分器设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 设计一个基于51单片机控制的恒压供水系统是一个复杂的工程&#xff0c;涉及到硬件设计和软件编程等多个方面。以下是一…

BUUCTF-WEB-刷题记录(2)

[网鼎杯 2018]Fakebook 注册一个账户&#xff0c;进去之后查看源代码&#xff0c;感觉存在注入点 是数字型注入&#xff0c;payload&#xff1a; 1%20and(false) 1%20and(true)判断列数 1 order by 5改为4的时候则页面正常 判断显示位&#xff0c;可以看见第二列存在数据回…

uniapp前端支付篇(微信、抖音、快手、h5)四个平台支付

前言 微信、快手、h5支付步骤大致相同&#xff0c;只有抖音是有自己的支付组件 项目同时支持多个&#xff08;微信、快手、h5&#xff09;平台支付&#xff0c;后端那边代码可以封装的 各平台支付大致流程都是相同的&#xff0c;总结了一下分为五个步骤 点击支付创建订单生成密…

深搜回溯剪枝优化策略-全排列II

LCR 084. 全排列 II - 力扣&#xff08;LeetCode&#xff09; 这道题的主体思想和之前讲过的全排列是相似的&#xff0c;不同的是思考的角度要侧重于剪枝方向&#xff0c;所以可以通过这道题对剪枝思想的进一步扩展&#xff1b; 通过题意&#xff0c;可以知道&#xff0c;在上一…

非得让你会之MyBatis插件与Java动态代理

引言 咱们今天聊聊Java动态代理&#xff0c;这东西在开发中真的太常见了。比如Spring AOP、RPC&#xff0c;它们都离不开动态代理。然后&#xff0c;咱们再来说说MyBatis插件&#xff0c;这可是MyBatis框架中的一个超实用的功能&#xff0c;它就像是给MyBatis加了个“超能力”…