vue封装独立组件:实现分格密码输入框/验证码输入框

目录

第一章 实现效果

第二章 核心实现思路

第三章 封装组件代码实现

第一章 实现效果

  •  为了方便小编的父组件随便找了个页面演示的
  • 通过点击按钮,展示子组件密码输入的输入框
  • 通过点击子组件输入框获取焦点,然后输入验证码数字即可
  • 子组件的确定按钮是验证输入的验证码是否正确
  • 用到的工具:element-ui组件 + 原生Html + Css(当然用别的组件/原生input也可,实现思路大同小异)

第二章 核心实现思路

  • 看图了解需求:我们需要6个单元格,但是单元格没有输入功能,想到input元素,但是我们如果每一个单元格代表一个input,又比较繁琐,而且还需要修改input的样式
  • 小编的实现思路:

        -- 制作6个小的正方形div,当做每一个input输入的单元格

        -- 使用一个input元素即可,将其覆盖在6个div上,这样就不需要6个input框了

        -- 然后给input设置透明(隐藏掉input),就相当于在input框输入数字,只是看不到

        -- 最后将输入的每一个值对应到6个div的格子上即可

第三章 封装组件代码实现

  • 父组件
<template>
  <div>
    // 使用自定义子组件
    <inputComponent ref="inputPsdComponent"></inputComponent>
  </div>
</template>

<script>
// 引入自定义封装的子组件
import inputComponent from './component/inputComponent.vue'
export default {
  data () {
    return {
    }
  },
  components: {
    inputComponent // 祖册自定义子组件
  },
  methods: {
    showInput () {
      this.$refs.inputPsdComponent.init() // 调用子组件的init方法
    }
  },
}
</script>
  • 子组件:详细说明在代码中
<template>
  <el-dialog :title="title" :visible.sync="visible">
    <div class="input_box flexbox">
      <!-- 单元格页面 -->
      <div class="codes">
        <!-- 通过长度与获取焦点标签控制单元格是否高亮 -->
        <div
          class="code_item"
          :class="codeValue.length == 0 && inputFocus ? 'code_item_active' : ''"
        >
          {{ codeValue[0] }}
        </div>
        <div
          class="code_item"
          :class="codeValue.length == 1 && inputFocus ? 'code_item_active' : ''"
        >
          {{ codeValue[1] }}
        </div>
        <div
          class="code_item"
          :class="codeValue.length == 2 && inputFocus ? 'code_item_active' : ''"
        >
          {{ codeValue[2] }}
        </div>
        <div
          class="code_item"
          :class="codeValue.length == 3 && inputFocus ? 'code_item_active' : ''"
        >
          {{ codeValue[3] }}
        </div>
        <div
          class="code_item"
          :class="codeValue.length == 4 && inputFocus ? 'code_item_active' : ''"
        >
          {{ codeValue[4] }}
        </div>
        <div
          class="code_item"
          :class="codeValue.length == 5 && inputFocus ? 'code_item_active' : ''"
        >
          {{ codeValue[5] }}
        </div>
      </div>
      <!-- input框:控制长度 -->
      <el-input
        class="input_code"
        :value="codeValue"
        :maxlength="6"
        @blur="codeInputBlur"
        @focus="codeInputFocus"
        @input="codeInputChange"
      >
      </el-input>
      <div class="btn">
        <el-button type="primary" @click="confirm">确定</el-button>
      </div>
    </div>
  </el-dialog>
</template>

<script>
export default {
  data() {
    return {
      visible: false,
      inputFocus: false,
      codeValue: '',
      title: '密码输入'
    }
  },
  props:{
  },
  methods: {
    init () {
      this.visible = true
    },
    // 校验输入的验证码/密码
    confirm () {
      if (this.codeValue.length === 6) {
        this.$message({
          showClose: true,
          message: '验证成功!',
          type: 'success'
        })
        this.codeValue = ''
        this.visible = false
      } else {
        this.$message({
          showClose: true,
          message: '验证码不正确!',
          type: 'error'
        })
      }
    },
    // 验证码输入框
    codeInputChange (e) {
      // 判断是否输入值
      if (e) {
        // 正则判断是否都是数字,如果都是数字则赋值,否则
        if ((/^\+?[0-9][0-9]*$/).test(e)) {
          this.codeValue = e
        }
      } else {
        this.codeValue = ''
      }
    },
    // 验证码输入框失去焦点
    codeInputBlur () {
      this.inputFocus = false
    },
    // 验证码输入框获取到焦点
    codeInputFocus () {
      this.inputFocus = true
    },
  }
}
</script>

<style lang="less" scoped>
.input_box {
    margin-top: 20px;
    height: 100px;
    position: relative;
  }
  .input_code {
    position: absolute;
    top: 0;
    left: 0;
  }
  .btn{
    position: absolute;
    top: 70px;
    left: 0;
  }
  .codes{
    position: absolute;
    top: 0;
    display: flex;
    justify-content: flex-start;
    .code_item {
      width: 50px;
      height: 50px;
      text-align: center;
      line-height: 50px;
      border: 1px solid #f0f0f0;
      margin-right: 10px;
    }
  }
  .code_item_active {
    border: 1px solid #F23026 !important;
    // box-sizing: border-box;
  }
  // 隐藏input
  .input_box {
    ::v-deep .el-input__inner {
      width: 100%;
      height: 50px !important;
      background-color: transparent;
      border: none;
      color: transparent;
    }
  }
  ::v-deep .el-dialog {
    min-height: 100px;
  }
</style>

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

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

相关文章

MySQL Error 1215: Cannot add foreign key constraint

首先确保中介表中被设置外键的字段不能被设置为主键 第二步确保外键字段的属性与要连接的表的字段属性相同 第三步&#xff0c;设置表的选项 修改引擎为 InnoDB 三个表的引擎都要修改 最后就是运行代码 SET OLD_FOREIGN_KEY_CHECKSFOREIGN_KEY_CHECKS; SET FOREIGN_KEY_…

Android Icon 添加水印 Python脚本

源代码 # -*- coding: utf-8 -*- from PIL import Image 图片合成def mergePictureLXJ():commonIcon Image.open("icon.png")markIcon Image.open("领现金.png")markLayer Image.new(RGBA, commonIcon.size, (0, 0, 0, 0))markLayer.paste(markIcon, (0…

魔术般的速度,焕然一新的磁盘空间 - Magic Disk Cleaner for Mac 2023

在当今这个信息时代&#xff0c;我们的磁盘空间无时无刻不在被各种文件和数据所填满。无论是工作文件&#xff0c;还是日常生活的照片、视频&#xff0c;亦或是下载的各种应用程序&#xff0c;都在不断地蚕食着我们的磁盘空间。面对这种情况&#xff0c;一款高效、便捷的磁盘垃…

大厂面试题-为什么Netty线程池默认大小为CPU核数的2倍

目录 1、分析原因 2、如何衡量性能指标 3、总结与使用建议 1、分析原因 我们都知道使用多线程的本质是为了提升程序的性能&#xff0c;总体来说有两个最核心的指标&#xff0c;一个延迟&#xff0c;一个吞吐量。延迟指的是发出请求到收到响应的时间&#xff0c;吞吐量指的是…

Cannot resolve class ‘DruidDataSource‘

无法配置 DataSource&#xff1a;未指定“url”属性&#xff0c;并且无法配置嵌入数据源。 原因&#xff1a;无法确定合适的驱动程序类 原因是数据库没有配置或者没事错误 1配置配置文件报错 没有依赖 pom.xml加入 <dependency><groupId>com.alibaba</grou…

Oracle-执行计划生成及查看的几种方法

1. EXPLAIN FOR 语法&#xff1a; EXPLAIN PLAN FOR SQL语句SELECT * FROM TABLE(dbms_xplan.display());优点&#xff1a; 无需真正执行SQL 缺点&#xff1a; 没有输出相关的统计信息&#xff0c;例如产生了多少逻辑读、物理读、递归调用等情况无法判断处理了多少行无法判断…

单元测试反射注解

单元测试 就是针对最小的功能单元(方法)&#xff0c;编写测试代码对其进行正确性测试。 咱们之前是如何进行单元测试的&#xff1f;有啥问题 &#xff1f; Junit单元测试框架 可以用来对方法进行测试&#xff0c;它是由Junit公司开源出来的 具体步骤 Junit框架的常见注解…

前端埋点方式

前言&#xff1a; 想要了解用户在系统中所做的操作&#xff0c;从而得出用户在本系统中最常用的模块、在系统中停留的时间。对于了解用户的行为、分析用户的需求有很大的帮助&#xff0c;想实现这种需求可以通过前端埋点的方式。 埋点方式&#xff1a; 1.什么是埋点&#xff1f…

批量发送邮件时怎么使用蜂邮EDM与Outlook?

批量发送邮件时使用蜂邮EDM和Outlook的方法&#xff1f;群发电子邮件的技巧有哪些&#xff1f; 电子邮件仍然是最常用的沟通工具之一&#xff0c;无论是企业还是个人用户&#xff0c;都希望能够高效地一次性将邮件发送给多个收件人。在本文中&#xff0c;将深入探讨蜂邮EDM和O…

无限上下文,多级内存管理!突破ChatGPT等大语言模型上下文限制

目前&#xff0c;ChatGPT、Llama 2、文心一言等主流大语言模型&#xff0c;因技术架构的问题上下文输入一直受到限制&#xff0c;即便是Claude 最多只支持10万token输入&#xff0c;这对于解读上百页报告、书籍、论文来说非常不方便。 为了解决这一难题&#xff0c;加州伯克利…

循环神经网络(RNN)与长短期记忆网络(LSTM)

前言&#xff1a; 通过前面的学习&#xff0c;我们以BP神经网络为基础&#xff0c;认识到了损失函数&#xff0c;激活函数&#xff0c;以及梯度下降法的原理&#xff1b;而后学习了卷积神经网络&#xff0c;知道图像识别是如何实现的。今天这篇文章&#xff0c;讲述的就是计算机…

OSPF复习(2)

目录 一、LSA的头部 二、6种类型的LSA&#xff08;课堂演示&#xff09; 1、type1-LSA&#xff1a;----重要且复杂 2、type2-LSA&#xff1a; 3、type3-LSA&#xff1a; 4、type4-LSA&#xff1a; 5、type5-LSA&#xff1a; 6、type7-LSA&#xff1a; 三、OSPF的网络类…

基于Docker-consul容器服务更新与发现

目录 一、什么是服务注册与发现&#xff1a; 二、Docker-consul介绍&#xff1a; 三、consul的关键特性&#xff1a; 四、consul部署&#xff1a; 1.部署规划&#xff1a; 2.consul服务器部署&#xff1a; 2.1 建立consul服务&#xff1a; 启动consul后默认会监听5个端口&a…

【案例】3D地球(vue+three.js)

需要下载插件 <template><div class"demo"><div id"container" ref"content"></div></div> </template> <script> import * as THREE from three; // import mapJSON from ../map.json; import { Or…

MetaAI提出全新验证链框架CoVE,大模型也可以通过“三省吾身”来缓解幻觉现象

​ 论文名称&#xff1a; Chain-of-Verification Reduces Hallucination in Large Language Models 论文链接&#xff1a; https://arxiv.org/abs/2309.11495 曾子曰&#xff1a;“吾日三省吾身” --出自《论语学而》 时至今日&#xff0c;生成幻觉&#xff08;hallucination&…

【Docker】十分钟完成redis安装,你也可以的!!!

十分钟完成redis安装&#xff0c;你也可以的 前言安装步骤1.创建安装目录2.创建docker-compose.yml3.创建redis.conf文件4.启动容器5.连接redis 总结 前言 本文基于Docker安装redis&#xff0c;首先确保系统安装了docker和docker-compose。 没有使用过docker朋友可以去看看博主…

呼吸灯【FPGA】

晶振50Mhz 1us 等于 计0~49 1ms等于 0~999us 1s等于 0~999ms //led_outalways(posedge FPGA_CLK_50M_b5 or negedge reset_e8) //【死循环】敏感【触发条件&#xff1a;上升沿 clk】【运行副本】if(reset_e81b0)begin //50Mhz晶振&#xff0c; 49_999_999 是 1秒…

LiveMeida视频接入网关

一、产品简介 视频接入网关主要部署在视频存储节点或视频汇聚节点&#xff0c;面向不同用户&#xff0c;主要用于对接不同厂家、不同型号的摄像机设备&#xff0c;获取摄像机视频后&#xff0c;以统一标准的视频格式和传输协议&#xff0c;将视频推送至上层联网/应用平台。可广…

洒洒水阿萨阿萨

1. 多表查询 多表查询(也叫关联查询, 联结查询): 可以用于检索涉及到多个表的数据. 使用关联查询, 可以将两张或多张表中的数据通过某种关系联系在一起, 从而生成需要的结果集.前提条件: 这些一起查询的表之间它们之间一定是有关联关系.# 先熟悉一下三张表: -- 1. 员工表(11个…

R语言使用surveyCV包对NHANES数据(复杂调查加权数据)进行10折交叉验证

美国国家健康与营养调查&#xff08; NHANES, National Health and Nutrition Examination Survey&#xff09;是一项基于人群的横断面调查&#xff0c;旨在收集有关美国家庭人口健康和营养的信息。 地址为&#xff1a;https://wwwn.cdc.gov/nchs/nhanes/Default.aspx 既往咱们…