结合Vue实现344分割手机号码

news/2024/11/17 16:53:11/

这一个小需求,断断续续解决了好久,中间一直存在各种bug,现在基本上已经完全解决,因此,打算从头到尾记录一下,方便以后查询。

需求

开始的时候,还是把需求简单的说下:

移动端中,弹出系统的数字键盘,实现344分割手机号

需求明确之后,下面就是分析需求,然后才能确定实现方式:

  1. 明确说明是移动端,那么也就是说,兼容问题不需要考虑太多
  2. 如果要弹出系统的数字键盘,那么符合条件的只有一种,那就是type="phone"的input输入框
  3. 在输入的时候,实现344分割手机号,这个时候就要监视输入框中内容的变化,这个可以结合Vue的watch来实现
  4. 手机号344分割,那么输入框中输入的最大长度应该就是13了

经过分析可以看出,实际需要使用的知识点并不是很多。分析完成之后,下面就要来具体实现这个需求了。

实现

搭建结构

首先,在写真正的程序之前,要把结构搭建完成,后续写代码直接在结构中写就可以了。

  1. 首先来搭建html5的代码结构,然后自定义input的样式(方便后续查看)
  2. 定义input输入框,并设置typemaxlength
  3. 通过v-model实现数据的双向绑定
  4. 引入vue.js并搭建基本的代码结构
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><style type="text/css">/* 自定义input输入框的样式 */#app input { width: 100%; height: 50px; border: 1px solid red; font-size: 30px; outline: none; }</style>
</head>
<body><div id="app"><!-- 设置type和maxlength,并实现数据双向绑定 --><input v-model="phone" type="phone" placeholder="请输入手机号" maxlength="13"></div>
</body>
</html><script type="text/javascript" src="./vue2.4.2.js"></script>
<script type="text/javascript">var vm = new Vue({el: '#app',data() {return {phone: ''}},watch: {phone(newValue, oldValue) {// 具体的代码在这里实现}}})
</script>

分析输入和输出

在具体实现之前,首先要明白,输入和输出的分别触发什么样的操作。
下面,我们把watch中的newValueoldValue的值输出,看一下规律。

      phone(newValue, oldValue) {// 具体的代码在这里实现console.group('< === 是否是输入 === >')console.log("%c%s", "color:red", `${newValue.length > oldValue.length}`)console.groupEnd('< === 是否是输入 === >')}

当在输入框中输入内容的时候:

输入

当在输入框中删除内容的时候:

输出

从分析可以看出,在输入的时候,长度是增加的,删除的时候,长度是减少的。

删除的具体实现

在删除的时候,会出现两个转折点,就是在删除第10个元素或者第5个元素的时候,要自动删除空格。

很明显,这里出现了两个条件,下标为4的时候和下标为9的时候,要去除字符串的空格。

      phone(newValue, oldValue) {// 具体的代码在这里实现if (newValue.length > oldValue.length) {// ...} else {if (newValue.length === 9 || newValue.length === 4) {this.phone = this.phone.trim()}}}

代码写出了之后,看着有些不舒服,有没有优化方案呢?

再次经过分析会发现,既然在下标为4或9的时候,我们做的事是去除空格,那么就可以根据去空格的特性(有空格去除空格,无空格不进行处理),直接只做去除空格的操作,不进行判断了。

      phone(newValue, oldValue) {// 具体的代码在这里实现if (newValue.length > oldValue.length) {// ...} else {this.phone = this.phone.trim()}}

现在,删除的功能实现了,并且代码也进行了优化,下面开始实现输入的操作。

输入的具体实现

下面来分析一下输入的问题:

在输入的时候,当值的长度小于3的时候,肯定是原样返回的;当值的长度大于等于3且小于7的时候,要增加一个空格;当长度大于等于7的时候,要增加两个空格。这个时候就要牵涉到条件判断了。

另外,在判断值的时候,肯定是判断总数字的个数,因此是去除空格的。

      phone(newValue, oldValue) {// 具体的代码在这里实现if (newValue.length > oldValue.length) {if (newValue.replace(/\s/g, '').length < 3) {this.phone = newValue.replace(/\s/g, '')} else if (newValue.replace(/\s/g, '').length >= 3 && newValue.replace(/\s/g, '').length < 7) {this.phone = newValue.replace(/\s/g, '').replace(/(\d{3})/, '$1 ')} else if (newValue.replace(/\s/g, '').length >= 7) {this.phone = newValue.replace(/\s/g, '').replace(/(\d{3})(\d{4})/, '$1 $2 ')}} else {this.phone = this.phone.trim()}}

我的天哪,这个代码怎么看着那么乱,应该可以优化的。由于正则表达式是一个强大的工具,因此,可以结合正则来优化。

首先,我们可以把空格作为分割点,那么空格之前的内容属于一组,所以共分三组。第一组的长度为3个数字,第二组和第三组的长度都是0-4个数字,因此,通过正则可以简化代码:

      phone(newValue, oldValue) {// 具体的代码在这里实现if (newValue.length > oldValue.length) {this.phone = newValue.replace(/\s/g, '').replace(/(\d{3})(\d{0,4})(\d{0,4})/, '$1 $2 $3')} else {this.phone = this.phone.trim()}}

简化代码

上面的代码已经基本算精简了,可是,如果使用三目运算符,还可以更加精简:

      phone(newValue, oldValue) {// 具体的代码在这里实现this.phone = newValue.length > oldValue.length ? newValue.replace(/\s/g, '').replace(/(\d{3})(\d{0,4})(\d{0,4})/, '$1 $2 $3') : this.phone.trim()}

至此,该需求已经完成了,最后实际的代码只有一句。

总结

其实这个需求很简单,需要总结的东西不多,因此,在这里把具体的代码实现贴出来,方便后续使用:

<div id="app"><!-- 设置type和maxlength,并实现数据双向绑定 --><input v-model="phone" type="phone" placeholder="请输入手机号" maxlength="13">
</div><script type="text/javascript" src="./vue2.4.2.js"></script>
<script type="text/javascript">var vm = new Vue({el: '#app',data() {return {phone: '' // 双向绑定的数据}},watch: {phone(newValue, oldValue) { // 监听this.phone = newValue.length > oldValue.length ? newValue.replace(/\s/g, '').replace(/(\d{3})(\d{0,4})(\d{0,4})/, '$1 $2 $3') : this.phone.trim()}}})
</script>

http://www.ppmy.cn/news/539670.html

相关文章

【Java 基础篇】Java常量、变量以及命名规则

文章目录 导言一、常量&#xff08;Constants&#xff09;二、变量&#xff08;Variables&#xff09;三、命名规则和最佳实践1. 变量和常量命名2. 类名和接口名3. 包名4. 避免使用缩写和单个字母作为名称5. 使用有意义的名称6. 注意命名的长度和可读性 四、示例代码总结 导言 …

RadEx Pro处理电火花数据操作步骤(下)

RadEx Pro处理电火花数据操作步骤&#xff08;上&#xff09;主要讲述RadEx Pro读取电火花数据&#xff0c;查看数据的质量&#xff0c;以及简单的滤波和振幅纠正。 6、海底拾取&#xff0c;建立流程060 seafloor pick Trace Input加载stack数据集 Trace Header Math&#x…

排序算法——归并排序(递归与非递归)

归并排序 以升序为例 文章目录 归并排序基本思想核心步骤递归写法实现代码 非递归处理边界情况实现代码 时间复杂度 基本思想 归并排序是建立在归并操作上的一种有效的排序算法&#xff0c;该算法是采用分治法的一个非常典型的应用&#xff1a;将已有序的子序列合并&#xff…

按头安利 好看又实用的毛笔书法字体素材看这里

前方干货满满&#xff0c;建议先收藏再看哦&#xff01;为大家整理毛笔书法字体素材&#xff0c;总有满足你需求的一款&#xff0c;除此之外&#xff0c;免费&#xff0c;资源质量好&#xff0c;一键打包下载&#xff0c;你还不心动吗&#xff1f; 本人曾经也是废大把时间寻找…

毛笔笔刷书法签名手写字体设计 Brightwall – Brush Signature Font

Brightwall刷字体是用天然刷子做成&#xff0c;笔刷字体的纹理将使你的设计更加美丽和强大。 这种字体适合任何设计&#xff0c;如品牌、报价、t恤打印等。 素材特点&#xff1a; 多语言字符17种绑扎PUA编码数字和标点符号(OpenType标准)

Qt 笔锋 毛笔 钢笔 蜡笔 4k流畅画笔 Demo

基于Qt实现 毛笔、钢笔、蜡笔、4k不卡顿画笔 体验Demo下载链接&#xff1a;https://download.csdn.net/download/u012532263/15709871 需要源码 联系方式: QQ&#xff1a;550993637 QQ邮箱&#xff1a;550993637qq.com &#xff08;着急发邮件&#xff0c;qq不常上&#xff0…

html设置日文字体,怎样熟练使用各种日文字体

日文字体大体上可以分为“明朝”和“Gothic”两大类。明朝体的笔画竖比横粗&#xff0c;横的右端带有尖角折。而Gothic体则是横和竖差不多粗&#xff0c;几乎没有尖角折。 长篇的日语文章要选择可读性高的“明朝体” 会议总结或小论文、企划书等长篇文章更注重可读性(容易看)&a…

android 仿手写字体下载,手写毛笔字体在线生成器-手写毛笔字软件下载v1.0 安卓版-西西软件下载...

&#xfeff;手写毛笔字软件是一款可以帮你制作非常好看的毛笔字体的软件&#xff0c;很多人看到一些人的贴吧签名档就是一副非常好看的毛笔字体的图&#xff0c;其实这些字并不是他们自己写的而是通过这款软件合成制作的。你可以通过软件结合相应的素材生成好看的毛笔字体&…