封装车牌号码输入组件

打印 上一主题 下一主题

主题 518|帖子 518|积分 1554

 




  1. <!--
  2.     @Title:  国内车辆号牌号码输入组件
  3.     @Description: 国内车辆号牌号码输入组件,具体使用方法如下:
  4.    
  5.     <its-hphmInput v-model="form.hphm" :glbm="'京A'" :parentmessage.sync="hphm" @onChange="provinceAbbreviationChange"></its-hphmInput>
  6.    
  7.     params:
  8.     [   
  9.         glbm: 省份地方设置
  10.         parentmessage.sync: 初始车牌号码
  11.         onChange: 固定的事件名称,用于监听子组件回传参数,名称可自定义,其中'provinceAbbreviationChange'为父组件的响应式方法。使用方法,如下:
  12.         provinceAbbreviationChange(result){
  13.             console.log('父组件接收到的回传:' + result);
  14.         }
  15.     ]
  16.     @Author: **
  17.     @Create Date: ******
  18. -->
  19. <!-- 使用less编写样式,生效在组件作用域内 -->
  20. <style lang="less" scoped>
  21.   @import url("./index");
  22. </style>
  23. <template>
  24.   <!-- 唯一根节点 -->
  25.   <div class="hphm_box">
  26.     <div class="hphm-wite" @click.stop>
  27.       <a-auto-complete :disabled="disabled" :dataSource="dataSource" maxlength="8" v-model.tirm="hphm" @select="onSelect" @search="handleSearch" @change="changeAutoComplete" />
  28.       <div class="its-province-selBtn" :class="{icon: !glbmTitle}" @click="open">
  29.         <template v-if="glbmTitle">
  30.           {{glbmTitle}}
  31.         </template>
  32.         <template v-else>
  33.           <i class="itsIcons">&#xea1a;</i>
  34.         </template>
  35.       </div>
  36.       <div class="content" v-show="show">
  37.         <!--车牌第一页-->
  38.         <div class="first-word-wrap" v-show="showFirst">
  39.           <div class="first-word">
  40.             <div class="provinceHistoryDiv">
  41.               <div class="provinceHistory" v-for="(item, index) in provinceData.provinceHistory" @click="selectProvince(item)" :key="'0' + index">
  42.                 <span>{{item}}</span>
  43.               </div>
  44.             </div>
  45.             <div class="province" v-for="(item, index) in provinceData.province" @click="selectProvince(item)" :key="'1' + index">
  46.               <span>{{item}}</span>
  47.             </div>
  48.             <div class="province" v-for="(item, index) in provinceData.provinceGAT" :key="'2' + index" @click="selectProvinceGAT(item)">
  49.               <span>{{item}}</span>
  50.             </div>
  51.             <div class="provinceArmy" v-for="(item, index) in provinceData.provinceArmy" :key="'3' + index" @click="selectProvinceArmy(item)">
  52.               <span>{{item}}</span>
  53.             </div>
  54.             <div class="provinceSpecial" v-for="(item, index) in provinceData.provinceSpecial" :key="'4' + index" @click="selectProvinceSpecial(item)">
  55.               <span>{{item}}</span>
  56.             </div>
  57.             <div class="numTab" @click="changeTab">AB123…</div>
  58.           </div>
  59.         </div>
  60.         <!--车牌第二页-->
  61.         <div class="first-word-wrap" v-show="!showFirst">
  62.           <div class="first-word">
  63.             <div class="provinceNum">
  64.               <div class="province" v-for="(item, index) in provinceData.provinceNum" @click="selectNum(item)" :key="'5' + index">
  65.                 <span>{{item}}</span>
  66.               </div>
  67.             </div>
  68.             <div class="provinceNull"></div>
  69.             <div class="provinceAlphabet">
  70.               <div class="province" v-for="(item, index) in provinceData.provinceAlphabet" :key="'6' + index" @click="selectNum(item)">
  71.                 <span>{{item}}</span>
  72.               </div>
  73.             </div>
  74.             <div class="btn">
  75.               <div class="numTabSecond" @click="changeTab">
  76.                 <template v-if="glbmTitle">
  77.                   {{glbmTitle}}
  78.                 </template>
  79.                 <template v-else>
  80.                   <i class="itsIcons">&#xea1a;</i>
  81.                 </template>
  82.               </div>
  83.             </div>
  84.           </div>
  85.         </div>
  86.       </div>
  87.       <a-icon class="clearTitle" @click="clearHphm" v-if="glbmTitle.length > 0 || hphm.length > 0" type="close-circle" />
  88.     </div>
  89.   </div>
  90.   
  91. </template>
  92. <script>
  93.   export default {
  94.     // 页面类型组件必须定义一个唯一组件名称,模块[-目录]-页面连字符格式,否则该组件无法使用keepAlive
  95.     name: "hphmWite",
  96.     props: {
  97.       glbm: { // 省份地方设置
  98.         type: String,
  99.         default: '京A',
  100.       },
  101.       disabled: {
  102.         // 禁用
  103.         type: Boolean,
  104.         default: false
  105.       },
  106.       parentmessage: {
  107.         type: String,
  108.         default: '',
  109.       }
  110.     },
  111.     data() {
  112.       return {
  113.         // 省份 数字  字母  数据
  114.         provinceData: {
  115.           provinceHistory: [],
  116.           province: ['京', '津', '冀', '晋', '蒙', '辽', '吉', '黑', '沪', '苏', '浙', '皖', '闽', '赣', '鲁', '豫', '鄂', '湘', '粤', '桂', '琼', '渝', '川', '贵', '云', '藏', '陕', '甘', '青', '宁', '新'],
  117.           provinceGAT: ['港', '澳', '台'],
  118.           provinceArmy: ['军', '空', '武', '总', '炮', '海'],
  119.           provinceSpecial: ['警', '学', '挂', '使', '领'],
  120.           provinceNum: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
  121.           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']
  122.         },
  123.         // 省份拼音表
  124.         provinceList: {
  125.           '京': 'jing',
  126.           '津': 'jin',
  127.           '冀': 'ji',
  128.           '晋': 'jin',
  129.           '蒙': 'meng',
  130.           '辽': 'liao',
  131.           '吉': 'ji',
  132.           '黑': 'hei',
  133.           '沪': 'hu',
  134.           '苏': 'su',
  135.           '浙': 'zhe',
  136.           '皖': 'wan',
  137.           '闽': 'min',
  138.           '赣': 'gan',
  139.           '鲁': 'lu',
  140.           '豫': 'yu',
  141.           '鄂': 'e',
  142.           '湘': 'xiang',
  143.           '粤': 'yue',
  144.           '桂': 'gui',
  145.           '琼': 'qiong',
  146.           '渝': 'yu',
  147.           '川': 'chuan',
  148.           '贵': 'gui',
  149.           '云': 'yun',
  150.           '藏': 'zang',
  151.           '陕': 'shan',
  152.           '甘': 'gan',
  153.           '青': 'qing',
  154.           '宁': 'ning',
  155.           '新': 'xin',
  156.           '港': 'gang',
  157.           '澳': 'ao',
  158.           '台': 'tai',
  159.           '军': 'jun',
  160.           '空': 'kong',
  161.           '武': 'wu',
  162.           '总': 'zong',
  163.           '炮': 'pao',
  164.           '海': 'hai',
  165.           '警': 'jing',
  166.           '学': 'xue',
  167.           '挂': 'gua',
  168.           '使': 'shi',
  169.           '领': 'ling'
  170.         },
  171.         show: false,
  172.         showFirst: true,
  173.         // 车牌号码
  174.         hphm: '',
  175.         // 自动完成的数据源
  176.         dataSource: [],
  177.         glbmTitle: ''
  178.       };
  179.     },
  180.     watch: {
  181.       hphm: {
  182.         handler(val, oldVal) {
  183.           if (val.length === 0) {
  184.             this.showFirst = true;
  185.           }
  186.           if (val.length === 1) {
  187.             this.showFirst = false;
  188.           }
  189.           if (val.length === 8) {
  190.             this.showFirst = true;
  191.           }
  192.         },
  193.         deep: true,
  194.         immediate: true
  195.       },
  196.       parentmessage: {
  197.         handler(val, oldVal) {
  198.           if(!val) {
  199.             this.glbmTitle = ''
  200.             return
  201.           }
  202.           if(val.length < oldVal.length && val.length <=5) {
  203.             this.hphm = val
  204.           }else if(val.length > oldVal.length && val.length > 6) {
  205.             this.glbmTitle = val.substring(0,2)
  206.             this.hphm = val.substring(2,val.length)
  207.           }
  208.         },
  209.         deep: true,
  210.         immediate: true
  211.       },
  212.     },
  213.     methods: {
  214.       clearHphm() {
  215.         this.hphm = ''
  216.         this.glbmTitle = ''
  217.       },
  218.       changeTab() {
  219.         this.showFirst = !this.showFirst;
  220.       },
  221.       open() {
  222.         if (this.disabled) return false
  223.         this.show = !this.show;
  224.       },
  225.       selectProvince(item) {
  226.         this.glbmTitle = item
  227.         this.showFirst = false;
  228.         // this.hphm = item;
  229.         // 获取选择的值,回传数据给父组件
  230.         // this.$emit("onChange", this.hphm);
  231.         if (this.provinceData.provinceHistory.includes(item)) {
  232.           return false;
  233.         }
  234.         if (this.provinceData.provinceHistory.length > 7) {
  235.           this.provinceData.provinceHistory.shift();
  236.           this.provinceData.provinceHistory.push(item);
  237.           return false;
  238.         } else {
  239.           this.provinceData.provinceHistory.push(item);
  240.         }
  241.         localStorage.setItem('provinceHistory', JSON.stringify(this.provinceData.provinceHistory))
  242.       },
  243.       selectProvinceGAT(item) {
  244.         if (this.hphm.length > 7) {
  245.           return false;
  246.         }
  247.         this.hphm = this.hphm + item;
  248.         // 获取选择的值,回传数据给父组件
  249.         this.$emit("onChange", this.hphm);
  250.         if (this.provinceData.provinceHistory.includes(item)) {
  251.           return false;
  252.         }
  253.         if (this.provinceData.provinceHistory.length > 7) {
  254.           this.provinceData.provinceHistory.shift();
  255.           this.provinceData.provinceHistory.push(item);
  256.           return false;
  257.         } else {
  258.           this.provinceData.provinceHistory.push(item);
  259.         }
  260.         localStorage.setItem('provinceHistory', JSON.stringify(this.provinceData.provinceHistory))
  261.       },
  262.       selectProvinceArmy(item) {
  263.         if (this.hphm.length > 7) {
  264.           return false;
  265.         }
  266.         this.hphm = this.hphm + item;
  267.         // 获取选择的值,回传数据给父组件
  268.         this.$emit("onChange", this.hphm);
  269.         if (this.provinceData.provinceHistory.includes(item)) {
  270.           return false;
  271.         }
  272.         if (this.provinceData.provinceHistory.length > 7) {
  273.           this.provinceData.provinceHistory.shift();
  274.           this.provinceData.provinceHistory.push(item);
  275.           return false;
  276.         } else {
  277.           this.provinceData.provinceHistory.push(item);
  278.         }
  279.         localStorage.setItem('provinceHistory', JSON.stringify(this.provinceData.provinceHistory))
  280.       },
  281.       selectProvinceSpecial(item) {
  282.         if (this.hphm.length > 7) {
  283.           return false;
  284.         }
  285.         this.hphm = this.hphm + item;
  286.         // 获取选择的值,回传数据给父组件
  287.         this.$emit("onChange", this.hphm);
  288.         if (this.provinceData.provinceHistory.includes(item)) {
  289.           return false;
  290.         }
  291.         if (this.provinceData.provinceHistory.length > 7) {
  292.           this.provinceData.provinceHistory.shift();
  293.           this.provinceData.provinceHistory.push(item);
  294.           return false;
  295.         } else {
  296.           this.provinceData.provinceHistory.push(item);
  297.         }
  298.         localStorage.setItem('provinceHistory', JSON.stringify(this.provinceData.provinceHistory))
  299.       },
  300.       selectNum(item) {
  301.         // debugger
  302.         if(this.glbmTitle.length < 2) {
  303.           this.glbmTitle += item
  304.         }else {
  305.           if (this.hphm && this.hphm.length > 5) {
  306.             return false;
  307.           }
  308.           this.hphm = this.hphm + item;
  309.          
  310.           // 获取选择的值,回传数据给父组件
  311.           this.$emit("onChange", this.glbmTitle + this.hphm);
  312.         }
  313.         
  314.       },
  315.       handleSearch(value) {
  316.         // console.log("TCL: handleSearch -> value", value)
  317.         if (!value) {
  318.           this.dataSource = [];
  319.           return false;
  320.         }
  321.         let data = [];
  322.         let valueNew = value.toLowerCase();
  323.         for (let key in this.provinceList) {
  324.           if (this.provinceList[key].startsWith(valueNew)) {
  325.             data.push(key);
  326.           }
  327.         }
  328.         this.dataSource = data;
  329.       },
  330.       onSelect(value) {
  331.       },
  332.       changeAutoComplete(value) {
  333.         // 车牌长度大于8 处理
  334.         if (value.length > 7) {
  335.           let data = value.substring(0, 8);
  336.           value = data;
  337.           this.hphm = data;
  338.           this.$emit("onChange", this.hphm.toUpperCase());
  339.           return false;
  340.         }
  341.         this.hphm = value;
  342.         this.$emit("onChange", this.glbmTitle  + this.hphm.toUpperCase());
  343.       },
  344.     },
  345.     mounted() {
  346.       this.glbmTitle = this.glbm
  347.       // 获取 省份选择历史
  348.       let data = localStorage.getItem('provinceHistory');
  349.       if (data) {
  350.         let provinceHistory = JSON.parse(data);
  351.         this.$set(this.provinceData, 'provinceHistory', provinceHistory);
  352.       } else {
  353.         this.$set(this.provinceData, 'provinceHistory', []);
  354.       }
  355.       document.body.addEventListener('click', () => {
  356.         this.show = false;
  357.       }, false);
  358.     }
  359.   };
  360. </script>
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

八卦阵

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表