uni-app/vue封装车牌选择器

这篇具有很好参考价值的文章主要介绍了uni-app/vue封装车牌选择器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

先看下效果如下:
uniapp 车牌号键盘,其它,uni-app,vue
代码如下:
父组件:

<car-license carvalue="" @input="(e) => {platNo = e}"></car-license>

子组件:(代码较长,css部分没有提供)文章来源地址https://www.toymoban.com/news/detail-802812.html

<template>
  <view class="license-input">
    <view class="t">请填写车牌号码 <text class="fr" @click="clearCode">清空</text></view>
    <view class="text-enter" style="position: relative">
      <view class="input-code code0" :class="setClass(0)" @click.stop="chooseFn(0)">
        {{ carvaluelist[0] }}
        <text class="colgpla" v-if="!carvaluelist[0]"></text>
      </view>
      <view class="input-code code1" :class="setClass(1)" @click.stop="chooseFn(1)">{{ carvaluelist[1] }}</view>
      <span class="dian"></span>
      <view class="input-code code2" :class="setClass(2)" @click.stop="chooseFn(2)">{{ carvaluelist[2] }}</view>
      <view class="input-code code3" :class="setClass(3)" @click.stop="chooseFn(3)">{{ carvaluelist[3] }}</view>
      <view class="input-code code4" :class="setClass(4)" @click.stop="chooseFn(4)">{{ carvaluelist[4] }}</view>
      <view class="input-code code5" :class="setClass(5)" @click.stop="chooseFn(5)">{{ carvaluelist[5] }}</view>
      <view class="input-code code6" :class="setClass(6)" @click.stop="chooseFn(6)">{{ carvaluelist[6] }}</view>
      <view class="input-code code7" :class="setClass(7)" @click.stop="chooseFn(7)">
        {{ carvaluelist[7] }}
        <view class="code7-pla" v-if="carvaluelist[7]===''"><text class="plus">+</text><text class="plus-txt">新能源</text></view>
      </view>
    </view>
    <view class="pai">
      <view class="lan" :class="carvaluelist[7]==='' ? 'active' : ''">
        <image src="@/static/images/etc/Union.png"></image>
        蓝牌
        <fan-icon class="check" name="CircleCheckFilled" color="#FC6C2D" size="28rpx" />
      </view>
      <view class="lv" :class="carvaluelist[7]!=='' ? 'active' : ''">
        <image src="@/static/images/etc/Union.png"></image>
        绿牌
        <fan-icon class="check" name="CircleCheckFilled" color="#FC6C2D" size="28rpx" />
      </view>
    </view>

    <!-- 选择省 -->
    <u-popup v-model="show" mode="bottom" close-icon-pos="top-right" :border-radius="20" :mask="false" :mask-close-able="false" class="prov-popup">
      <template v-if="popShow[chooseIndex]">
        <!-- <view class="prov-title">请选择省份</view> -->
        <view class="prov-pview">
          <view class="enter-tit">
            <view
              class="enter-btn"
              @click="
                show = false;
                chooseIndex = -1;
              "
              >完成</view
            >
          </view>
          <template v-if="chooseIndex == 0">
            <view class="prov-item" :class="carvaluelist[chooseIndex] == f ? 'active' : ''" v-for="(f, fi) of strList[0]" :key="fi" @click="chooseCode(f)">
              {{ f }}
            </view>
          </template>
          <template v-else>
            <view :class="chooseIndex == 1 ? 'disabled' : ''" style="text-align: center">
              <view
                class="prov-item s1"
                :class="carvaluelist[chooseIndex] == f ? 'active' : ''"
                v-for="(f, fi) of 10"
                :key="fi"
                @click="
                  () => {
                    if (chooseIndex > 1) {
                      chooseCode(fi);
                    }
                  }
                "
              >
                {{ fi }}
              </view>
            </view>
            <view style="padding: 0 30rpx">
              <view class="prov-item s2" :class="carvaluelist[chooseIndex] == f ? 'active' : ''" v-for="(f, fi) of strList[1]" :key="fi" @click="chooseCode(f)">
                {{ f }}
              </view>
            </view>
          </template>
          <view class="del-btn" @click="delCode">删除</view>
        </view>
      </template>
    </u-popup>
  </view>
</template>

<script>
/**
 *  车牌照输入
 *
 * ===== 使用场景 ======
 * 下单页面ETC
 *
 */
import { scrollToDistance } from "@/utils/utils";
export default {
  name: "license-input",
  props: {
    carvalue: {
      type: String,
      default: "",
    },
  },
  data() {
    return {
      show: false,
      popShow: {
        "-1": false,
        0: false,
        1: false,
        2: false,
        3: false,
        4: false,
        5: false,
        6: false,
        7: false,
        8: false,
      },
      chooseIndex: -1,
      carvaluelist: this.carvalue && this.carvalue.length > 6 ? this.carvalue.split("") : ["", "", "", "", "", "", "", ""],
      strList: [
        ["京", "津", "渝", "沪", "冀", "晋", "辽", "吉", "黑", "苏", "浙", "皖", "闽", "赣", "鲁", "豫", "鄂", "湘", "粤", "琼", "川", "贵", "云", "陕", "甘", "青", "蒙", "桂", "宁", "新", "藏"],
        ["Q", "W", "E", "R", "T", "Y", "U", "P", "A", "S", "D", "F", "G", "H", "J", "K", "L", "Z", "X", "C", "V", "B", "N", "M"],
      ],
    };
  },
  mounted() {
    this.$nextTick(() => {
      document.querySelector("body").removeEventListener("click", this.addEvent);
      document.querySelector("body").addEventListener("click", this.addEvent);

      document.querySelectorAll("input").forEach((el) => {
        el.removeEventListener("focus", this.addEvent);
        el.addEventListener("focus", this.addEvent);
      });
      document.querySelectorAll("textarea").forEach((el) => {
        el.removeEventListener("focus", this.addEvent);
        el.addEventListener("focus", this.addEvent);
      });
      this.setClass(-1);
    });
  },
  methods: {
    addEvent() {
      this.show = false;
      this.chooseIndex = -1;
    },
    setClass(num) {
      return `${this.chooseIndex == num ? "focus" : ""} ${this.carvaluelist.join("").length == 8 ? "fill-lv" : this.carvaluelist[num] !== "" ? "fill" : ""}`;
      // return this.chooseIndex == num && this.carvaluelist[num] ? "focus fill" : this.chooseIndex == num ? "focus" : this.carvaluelist[num] ? "fill" : "";
    },
    chooseCode(item) {
      this.$set(this.carvaluelist, this.chooseIndex, item);
      this.$set(this.popShow, this.chooseIndex, false);
      this.chooseIndex = this.chooseIndex + 1;
      if (this.chooseIndex >= this.carvaluelist.length - 1) {
        this.chooseIndex = this.carvaluelist.length - 1;
      }
      this.$set(this.popShow, this.chooseIndex, true);
      console.log(this.carvaluelist.join(""));
      this.$emit("input", this.carvaluelist.join(""));
    },
    delCode() {
      this.$set(this.carvaluelist, this.chooseIndex, "");
      this.$set(this.popShow, this.chooseIndex, false);
      this.chooseIndex = this.chooseIndex - 1;
      if (this.chooseIndex <= 0) {
        this.chooseIndex = 0;
      }
      this.$set(this.popShow, this.chooseIndex, true);
    },
    chooseFn(num) {
      this.show = true;
      this.chooseIndex = num;
      for (let key in this.popShow) {
        this.$set(this.popShow, key, false);
      }
      this.$set(this.popShow, this.chooseIndex, true);
      // 将选择车牌模块滚动到顶部,防止被键盘遮住
      const c = document.querySelector(`.license-input`).offsetTop - 50;
      scrollToDistance(0, c);
    },
    clearCode() {
      this.carvaluelist = ["", "", "", "", "", "", "", ""];
      this.$emit("input", this.carvaluelist.join(""));
    },
  },
};
</script>

到了这里,关于uni-app/vue封装车牌选择器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于uniapp+vite4+vue3搭建跨端项目|uni-app+uview-plus模板

    最近得空学习了下uniapp结合vue3搭建跨端项目。之前也有使用uniapp开发过几款聊天/仿抖音/后台管理等项目,但都是基于vue2开发。随着vite.js破局出圈,越来越多的项目偏向于vue3开发,就想着uniapp搭配vite4.x构建项目效果会如何?经过一番尝试果然真香~ uniapp官网提供了  HBuild

    2024年02月09日
    浏览(49)
  • vue写车牌号 自定义键盘

    2024年02月16日
    浏览(31)
  • uni-app组件封装基本知识

            小写字母,单词用“ - ”链接例如(bj-item ) , 目录名称和文件名保持一致,官方默认把“ uni- ”开头的 组件全局挂载,不是这种格式的组件需要局部挂载。 1 、“ uni- ”开头的组件官方默认全局挂载  2、组件使用 随着Hbuilder的升级,现在组件统一放到uni_module

    2023年04月08日
    浏览(33)
  • uni-app封装的request请求

    config.js    main.js 页面使用:

    2024年02月12日
    浏览(29)
  • uni-app项目封装http请求和不封装请求

    在页面文件中 该请求的封装方式适用于_gt、_mt类型的请求,应该也可以做到其他类型; 注意看代码中的注释 在uilt/api.js中 在uilt/http.js中 在页面文件中 注意看代码中的注释;不封装需要使用 uni.request这个API来进行请求

    2024年02月13日
    浏览(44)
  • (小程序)基于uniapp+vite4+vue3搭建跨端项目|uni-app+uview-plus模板

    版本信息: 点击编辑器的文件 新建 项目(快捷键Ctrl+N) 2.选择uni-app项目,输入项目名/路径,选择项目模板,勾选vue3版本,点击创建,即可成功创建。 3.点击编辑器的运行 运行到浏览器 选择浏览器 当然也可以运行到手机或模拟器、运行到小程序工具。 到这里一个简单的

    2024年02月16日
    浏览(54)
  • uni-app日期选择器

    写个简单的日期选择器,还没搞样式,所以有点丑 大概长这样吧 首先是这个picker选择器,mode选择日期,end是写一个范围前日期,:end就是这个日期是动态变化的,还有change函数 然后是脚本,就默认显示当前日期,设计最后范围日期为今日日期,再有一个事件函数

    2024年02月12日
    浏览(29)
  • uni-app 封装 websocket 并且监听心跳机制

    新建 socket.js , 将以下代码复制进去 ,向外暴露。 在入口文件中 将 socketIO 挂载在 Vue 原型上 , 也可以按需引入置顶页面 。 在需要用到webSocket的页面中使用如下方法(可根据自身业务需求进行整改) 离开页面,记得断开连接。

    2024年02月11日
    浏览(35)
  • 『UniApp』uni-app-打包成App

    大家好,我是 BNTang, 在上一节文章中,我给大家详细的介绍了如何将我开发好的项目打包为微信小程序并且发布到微信小程序商店 趁热打铁,在来一篇文章,给大家详细的介绍如何将项目打包成APP。 打包 App 也是一样的,首先需要配置关于 App 应用的基础信息,打开 manifest

    2024年02月04日
    浏览(53)
  • uni-app封装省市区下拉组件(后台获取数据)

    一.后台数据格式  PROCINCE:[{itemName:\\\'\\\',itemValue:\\\'\\\'}] CITY:[{itemName:\\\'\\\',itemValue}] AREA:[{itemName:\\\'\\\',itemValue}] 前端将地址数据缓存在了pinia中 前端主要使用picker进行勾选 二.代码

    2024年02月12日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包