封装车牌号码输入组件

news2024/11/14 20:58:22

 

<!-- 
    @Title:  国内车辆号牌号码输入组件
    @Description: 国内车辆号牌号码输入组件,具体使用方法如下:
    
    <its-hphmInput v-model="form.hphm" :glbm="'京A'" :parentmessage.sync="hphm" @onChange="provinceAbbreviationChange"></its-hphmInput>
    
    params:
    [   
        glbm: 省份地方设置
        parentmessage.sync: 初始车牌号码
        onChange: 固定的事件名称,用于监听子组件回传参数,名称可自定义,其中'provinceAbbreviationChange'为父组件的响应式方法。使用方法,如下:
        provinceAbbreviationChange(result){
            console.log('父组件接收到的回传:' + result);
        }
    ]
 
    @Author: **
    @Create Date: ******
-->
 
 
<!-- 使用less编写样式,生效在组件作用域内 -->
<style lang="less" scoped>
  @import url("./index");
</style>
 
<template>
  <!-- 唯一根节点 -->
  <div class="hphm_box">
    <div class="hphm-wite" @click.stop>
      <a-auto-complete :disabled="disabled" :dataSource="dataSource" maxlength="8" v-model.tirm="hphm" @select="onSelect" @search="handleSearch" @change="changeAutoComplete" />
      <div class="its-province-selBtn" :class="{icon: !glbmTitle}" @click="open">
        <template v-if="glbmTitle">
          {{glbmTitle}}
        </template>
        <template v-else>
          <i class="itsIcons">&#xea1a;</i>
        </template>
      </div>
      <div class="content" v-show="show">
        <!--车牌第一页-->
        <div class="first-word-wrap" v-show="showFirst">
          <div class="first-word">
            <div class="provinceHistoryDiv">
              <div class="provinceHistory" v-for="(item, index) in provinceData.provinceHistory" @click="selectProvince(item)" :key="'0' + index">
                <span>{{item}}</span>
              </div>
            </div>
            <div class="province" v-for="(item, index) in provinceData.province" @click="selectProvince(item)" :key="'1' + index">
              <span>{{item}}</span>
            </div>
            <div class="province" v-for="(item, index) in provinceData.provinceGAT" :key="'2' + index" @click="selectProvinceGAT(item)">
              <span>{{item}}</span>
            </div>
            <div class="provinceArmy" v-for="(item, index) in provinceData.provinceArmy" :key="'3' + index" @click="selectProvinceArmy(item)">
              <span>{{item}}</span>
            </div>
            <div class="provinceSpecial" v-for="(item, index) in provinceData.provinceSpecial" :key="'4' + index" @click="selectProvinceSpecial(item)">
              <span>{{item}}</span>
            </div>
            <div class="numTab" @click="changeTab">AB123…</div>
          </div>
        </div>
        <!--车牌第二页-->
        <div class="first-word-wrap" v-show="!showFirst">
          <div class="first-word">
            <div class="provinceNum">
              <div class="province" v-for="(item, index) in provinceData.provinceNum" @click="selectNum(item)" :key="'5' + index">
                <span>{{item}}</span>
              </div>
            </div>
            <div class="provinceNull"></div>
            <div class="provinceAlphabet">
              <div class="province" v-for="(item, index) in provinceData.provinceAlphabet" :key="'6' + index" @click="selectNum(item)">
                <span>{{item}}</span>
              </div>
            </div>
            <div class="btn">
              <div class="numTabSecond" @click="changeTab">
                <template v-if="glbmTitle">
                  {{glbmTitle}}
                </template>
                <template v-else>
                  <i class="itsIcons">&#xea1a;</i>
                </template>
              </div>
            </div>
          </div>
        </div>
      </div>
      <a-icon class="clearTitle" @click="clearHphm" v-if="glbmTitle.length > 0 || hphm.length > 0" type="close-circle" />
    </div>
  </div>
  
</template>
 
<script>
  export default {
    // 页面类型组件必须定义一个唯一组件名称,模块[-目录]-页面连字符格式,否则该组件无法使用keepAlive
    name: "hphmWite",
    props: {
      glbm: { // 省份地方设置
        type: String,
        default: '京A',
      },
      disabled: {
        // 禁用
        type: Boolean,
        default: false
      },
      parentmessage: {
        type: String,
        default: '',
      }
    },
    data() {
      return {
        // 省份 数字  字母  数据
        provinceData: {
          provinceHistory: [],
          province: ['京', '津', '冀', '晋', '蒙', '辽', '吉', '黑', '沪', '苏', '浙', '皖', '闽', '赣', '鲁', '豫', '鄂', '湘', '粤', '桂', '琼', '渝', '川', '贵', '云', '藏', '陕', '甘', '青', '宁', '新'],
          provinceGAT: ['港', '澳', '台'],
          provinceArmy: ['军', '空', '武', '总', '炮', '海'],
          provinceSpecial: ['警', '学', '挂', '使', '领'],
          provinceNum: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
          provinceAlphabet: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
        },
        // 省份拼音表
        provinceList: {
          '京': 'jing',
          '津': 'jin',
          '冀': 'ji',
          '晋': 'jin',
          '蒙': 'meng',
          '辽': 'liao',
          '吉': 'ji',
          '黑': 'hei',
          '沪': 'hu',
          '苏': 'su',
          '浙': 'zhe',
          '皖': 'wan',
          '闽': 'min',
          '赣': 'gan',
          '鲁': 'lu',
          '豫': 'yu',
          '鄂': 'e',
          '湘': 'xiang',
          '粤': 'yue',
          '桂': 'gui',
          '琼': 'qiong',
          '渝': 'yu',
          '川': 'chuan',
          '贵': 'gui',
          '云': 'yun',
          '藏': 'zang',
          '陕': 'shan',
          '甘': 'gan',
          '青': 'qing',
          '宁': 'ning',
          '新': 'xin',
          '港': 'gang',
          '澳': 'ao',
          '台': 'tai',
 
          '军': 'jun',
          '空': 'kong',
          '武': 'wu',
          '总': 'zong',
          '炮': 'pao',
          '海': 'hai',
 
          '警': 'jing',
          '学': 'xue',
          '挂': 'gua',
          '使': 'shi',
          '领': 'ling'
        },
        show: false,
        showFirst: true,
        // 车牌号码
        hphm: '',
        // 自动完成的数据源
        dataSource: [],
        glbmTitle: ''
      };
    },
    watch: {
      hphm: {
        handler(val, oldVal) {
 
          if (val.length === 0) {
            this.showFirst = true;
          }
          if (val.length === 1) {
            this.showFirst = false;
          }
          if (val.length === 8) {
            this.showFirst = true;
          }
        },
        deep: true,
        immediate: true
      },
      parentmessage: {
        handler(val, oldVal) {
          if(!val) {
            this.glbmTitle = ''
            return
          }
          if(val.length < oldVal.length && val.length <=5) {
            this.hphm = val
          }else if(val.length > oldVal.length && val.length > 6) {
            this.glbmTitle = val.substring(0,2)
            this.hphm = val.substring(2,val.length)
          }
        },
        deep: true,
        immediate: true
      },
    },
    methods: {
      clearHphm() {
        this.hphm = ''
        this.glbmTitle = ''
      },
      changeTab() {
        this.showFirst = !this.showFirst;
      },
      open() {
        if (this.disabled) return false
        this.show = !this.show;
      },
      selectProvince(item) {
        this.glbmTitle = item
        this.showFirst = false;
        // this.hphm = item;
        // 获取选择的值,回传数据给父组件
        // this.$emit("onChange", this.hphm);
 
        if (this.provinceData.provinceHistory.includes(item)) {
          return false;
        }
        if (this.provinceData.provinceHistory.length > 7) {
          this.provinceData.provinceHistory.shift();
          this.provinceData.provinceHistory.push(item);
          return false;
        } else {
          this.provinceData.provinceHistory.push(item);
        }
        localStorage.setItem('provinceHistory', JSON.stringify(this.provinceData.provinceHistory))
      },
      selectProvinceGAT(item) {
        if (this.hphm.length > 7) {
          return false;
        }
        this.hphm = this.hphm + item;
        // 获取选择的值,回传数据给父组件
        this.$emit("onChange", this.hphm);
        if (this.provinceData.provinceHistory.includes(item)) {
          return false;
        }
        if (this.provinceData.provinceHistory.length > 7) {
          this.provinceData.provinceHistory.shift();
          this.provinceData.provinceHistory.push(item);
          return false;
        } else {
          this.provinceData.provinceHistory.push(item);
        }
        localStorage.setItem('provinceHistory', JSON.stringify(this.provinceData.provinceHistory))
      },
      selectProvinceArmy(item) {
        if (this.hphm.length > 7) {
          return false;
        }
        this.hphm = this.hphm + item;
        // 获取选择的值,回传数据给父组件
        this.$emit("onChange", this.hphm);
        if (this.provinceData.provinceHistory.includes(item)) {
          return false;
        }
        if (this.provinceData.provinceHistory.length > 7) {
          this.provinceData.provinceHistory.shift();
          this.provinceData.provinceHistory.push(item);
          return false;
        } else {
          this.provinceData.provinceHistory.push(item);
        }
        localStorage.setItem('provinceHistory', JSON.stringify(this.provinceData.provinceHistory))
      },
      selectProvinceSpecial(item) {
        if (this.hphm.length > 7) {
          return false;
        }
        this.hphm = this.hphm + item;
        // 获取选择的值,回传数据给父组件
        this.$emit("onChange", this.hphm);
        if (this.provinceData.provinceHistory.includes(item)) {
          return false;
        }
        if (this.provinceData.provinceHistory.length > 7) {
          this.provinceData.provinceHistory.shift();
          this.provinceData.provinceHistory.push(item);
          return false;
        } else {
          this.provinceData.provinceHistory.push(item);
        }
        localStorage.setItem('provinceHistory', JSON.stringify(this.provinceData.provinceHistory))
      },
      selectNum(item) {
        // debugger
        if(this.glbmTitle.length < 2) {
          this.glbmTitle += item
        }else {
          if (this.hphm && this.hphm.length > 5) {
            return false;
          }
          this.hphm = this.hphm + item;
          
          // 获取选择的值,回传数据给父组件
          this.$emit("onChange", this.glbmTitle + this.hphm);
        }
        
      },
      handleSearch(value) {
        // console.log("TCL: handleSearch -> value", value)
        if (!value) {
          this.dataSource = [];
          return false;
        }
        let data = [];
        let valueNew = value.toLowerCase();
        for (let key in this.provinceList) {
          if (this.provinceList[key].startsWith(valueNew)) {
            data.push(key);
          }
        }
        this.dataSource = data;
      },
      onSelect(value) {
      },
      changeAutoComplete(value) {
        // 车牌长度大于8 处理
        if (value.length > 7) {
          let data = value.substring(0, 8);
          value = data;
          this.hphm = data;
          this.$emit("onChange", this.hphm.toUpperCase());
          return false;
        }
        this.hphm = value;
        this.$emit("onChange", this.glbmTitle  + this.hphm.toUpperCase());
      },
    },
    mounted() {
      this.glbmTitle = this.glbm
      // 获取 省份选择历史
      let data = localStorage.getItem('provinceHistory');
      if (data) {
        let provinceHistory = JSON.parse(data);
        this.$set(this.provinceData, 'provinceHistory', provinceHistory);
      } else {
        this.$set(this.provinceData, 'provinceHistory', []);
      }
      document.body.addEventListener('click', () => {
        this.show = false;
      }, false);
    }
  };
</script>

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

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

相关文章

基于R语言进行AMMI分析3

参考资料&#xff1a;https://cran.r-project.org/web/packages/agricolae/agricolae.pdf 1、plot()函数 本次介绍的是Agricolae包中的plot.AMMI()函数。此函数可以绘制AMMI双标图&#xff0c;也可以绘制三标图&#xff08;三个坐标轴&#xff0c;IPCA1&#xff0c;IPCA2&…

「C++系列」类/对象

文章目录 一、类1. 基本类的定义2. 类的访问控制3. 类的实例化4. 构造函数和析构函数5. 继承6. 类的使用 二、对象1. 创建对象2. 对象的生命周期3. 对象的内存4. 对象的操作5. 对象的复制6. 总结 三、应用案例1. 定义BankAccount类2. 分析 四、相关链接 一、类 C 类&#xff0…

【初阶数据结构】顺序表和链表算法题(下)

链表 2.链表2.4合并两个有序链表2.5链表分割2.6链表的回⽂结构2.7相交链表2.8环形链表I2.9 环形链表II2.10随机链表的复制 2.链表 2.4合并两个有序链表 思路 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ …

一键转换语言,探索四大在线翻译工具的魅力!

各种翻译工具不仅为个人用户提供了极大的便利&#xff0c;也为跨国企业、学术研究和文化交流提供了强有力的支持&#xff0c;接下来为大家推荐几款好用的翻译在线工具&#xff01; 福昕在线翻译 直达链接&#xff1a; https://fanyi.pdf365.cn/ 福昕在线翻译是一款功能强大…

分布式锁 redis与zookeeper

redis实现分布式锁 原理 基于redis命令setnx key value来实现分布式锁的功能&#xff0c;只有当key不存在时&#xff0c;setnx才可以设置成功并返回1&#xff0c;否则设置失败返回0。 方案1&#xff1a; 方案1存在的问题 假如在加锁成功&#xff0c;释放锁之前&#xff0c;…

面向对象08:什么是多态

本节内容视频链接&#xff1a;面向对象12&#xff1a;什么是多态_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV12J41137hu?p71&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 Java中的多态是面向对象编程的一个重要概念&#xff0c;‌它允许不同类型的对象对…

jenkins安装及介绍

Cl:持续集成 CD:持续部署 插件:丰富的插件&#xff0c;可以满足99%的需求&#xff0c;还可以二次开发插件来满足需求 Jenkins能干嘛 1.集成第三方工具的使用&#xff0c;jenkins是一个集大成者&#xff0c;它集成了1000多个插件&#xff0c;几乎把所有知名的工具都集成到ienkin…

职场达人必备:2024年PDF转PPT工具精选指南

PDF文件有卓越的兼容性和安全性&#xff0c;&#xff1b;而PPT则以其强大的演示能力。然而&#xff0c;在日常的工作与学习场景中&#xff0c;我们时常面临将PDF内容转化为PPT格式的需求&#xff0c;以便更好地进行展示与编辑。那么&#xff0c;究竟该如何高效地将PDF转换成PPT…

多维系统下单点登录之整理解决方案

从淘宝天猫的单点登录说起 1.1 SSO单点登录 概述 随着互联网大数据不断发展&#xff0c;应用服务的不断增多&#xff0c;单点登录越来越能够凸显其作用。单点 登录SSO(Single Sign On)&#xff0c;顾名思义就是单个节点登录&#xff0c;全局使用。是目前最为流行的统一登录 解…

36 使用LDT(2)

首先是 定义 两个任务的LDT表 这是再GDT表中的选择子 首先是宏定义&#xff1a;这里的 0x4 , 3 先不用管 这里 一个task 一个LDT表 然后是在GDT表中 增加关于LDT的描述。 这里需要加上一个图。 还是这个图 然后是在 TSS表中&#xff0c;设置LDT的表的地址。 然后是更改 TSS表中…

AI的未来已来:GPT-4商业应用带来的无限可能

随着人工智能技术的快速发展&#xff0c;OpenAI于2023年3月15日发布了多模态预训练大模型GPT-4&#xff0c;这一里程碑式的进步不仅提升了AI的语言处理能力&#xff0c;还拓展了其应用范围。本文将深入探讨GPT-4的技术进步、商业化进程、用户体验改善、伦理和社会影响&#xff…

UR机械臂的ROS驱动安装官方教程详解——机器人抓取系统基础系列(一)

UR机械臂的ROS驱动安装配置官方教程详解——机器人抓取系统基础系列&#xff08;一&#xff09; 前言1 准备工作2 电脑安装驱动3 机器人端设置4 电脑和机器人的通讯IP设置5 启动机械臂的ROS驱动6 MoveIt控制机械臂总结 前言 本文在官方Github教程的基础上&#xff0c;详细阐述…

详细说明:向量数据库Faiss的搭建与使用

当然&#xff0c;Faiss&#xff08;Facebook AI Similarity Search&#xff09;是一个用来高效地进行相似性搜索和密集向量聚类的库。它能够处理大型数据集&#xff0c;并且在GPU上的性能表现尤为出色。下面详细介绍Faiss的搭建与使用。 1. 搭建Faiss 1.1 安装依赖包 首先&a…

Hadoop集群运维管理

Hadoop集群运维管理 一、Hadoop 集群进程管理1.1 NameNode 守护进程管理1.2 DataNode 守护进程管理1.3 ResourceManager 守护进程管理1.4 NodeManager 守护进程管理 二、Hadoop 集群运维技巧2.1 查看日志2.2 清理临时文件2.3 定期执行负载均衡2.4 文件系统检查2.5 元数据备份 三…

Redis的持久化介绍及其Linux配置介绍

1. Redis的持久化 Redis的数据都是存储在内存中,为了数据的永久保存,需要把数据同步到硬盘上,这个过程就叫做持久化. Redis的持久化存在有两种方式: rdb方式,aof方式,这两种方式可以单独使用,也可以综合使用. rdb持久化方式: 是在指定的时间间隔写入硬盘aof持久化方式:是以日…

【Python使用】嘿马python基础入门全体系教程第5篇:容器:字符串、列表、元组、字典,<1>添加元素(“增“append

本教程的知识点为&#xff1a;计算机组成 计算机是由什么组成的&#xff1f; 1. 硬件系统&#xff1a; 2. 软件系统&#xff1a; 目标 运算符的分类 1. 算数运算符 2. 赋值运算符 3. 复合赋值运算符 判断语句和循环语句 if嵌套 1. if嵌套的格式 2. if嵌套的应用 if嵌套执行流程…

链家web安全面试经验分享

吉祥知识星球http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247485367&idx1&sn837891059c360ad60db7e9ac980a3321&chksmc0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330#rd 《网安面试指南》http://mp.weixin.qq.com/s…

MyBatis使用:动态SQL

1、目标 本文的主要目标是使用MyBatis的动态SQL 2、最好使用Param注解 Data public class BaseEntity {protected String id;protected Integer createUserId;protected String createDateTime;}Data public class News extends BaseEntity {private String title;}RestCont…

【C++ Primer Plus习题】5.8

问题: 解答: #include <iostream> #include <cstring> using namespace std;#define SIZE 20int main() {char words[20];char done[] "done";int count 0;while (true){cout << "请输入单词:" << endl;cin >> words;if …

Open3D 最近点约束的体素滤波(35)

Open3D 最近点约束的体素滤波(35) 一、算法介绍二、算法步骤三、具体代码四、实现效果一、算法介绍 最近点约束的体素滤波,是指在每个体素中,选择距离体素中心最近的原始点作为滤波结果,这样保留的是原始点位置。相比于体素滤波的重心点重新计算,或者八叉树体素中心,更加…