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

news2025/2/25 11:48:38

目录

第一章 实现效果

第二章 核心实现思路

第三章 封装组件代码实现

第一章 实现效果

  •  为了方便小编的父组件随便找了个页面演示的
  • 通过点击按钮,展示子组件密码输入的输入框
  • 通过点击子组件输入框获取焦点,然后输入验证码数字即可
  • 子组件的确定按钮是验证输入的验证码是否正确
  • 用到的工具: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>

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

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

相关文章

nodejs+vue+python+php智能停车系统-计算机毕业设计-微信小程序-安卓

随着网络技术的不断发展&#xff0c;多媒体技术应用渐渐的出现在教育领域中&#xff0c;智能停车算法研究管理已经成为社会的一个热门话题。 智能停车算法研究系统主要是借助计算机&#xff0c;通过对智能停车算法研究系统所需的信息管理&#xff0c;增加用户的选择&#xff0c…

【MyBatis Plus】使用 MyBatis Plus 完成分页功能,以及通用分页实体的实现

文章目录 一、MyBatis Plus 分页插件1.1 了解 MyBatis Plus 的插件功能1.2 配置分页插件1.3 测试分页功能 二、实现通用分页实体2.1 分页查询需求2.2 分页实体类2.3 分页查询接口2.4 通用实体的转换2.4.1 PageQuery 转换为 MP Page2.4.2 分页结果 PO 转换 VO 一、MyBatis Plus …

canvas实现环形进度条

与setTimeout和setInterval不同&#xff0c;requestAnimationFrame不需要设置时间间隔。 效果图 源代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Canvas progress</title> </head&g…

GCC 编译器 详细总结

前言&#xff1a; 源文件需要经过编译才能生成可执行文件。 在 Windows 下进行开发时&#xff0c;只需要点几个按钮即可编译&#xff0c;集成开发环境(比如 Visual studio)已经将各种编译 工具的使用封装好了。 Linux 下也有很优秀的集成开发工具&#xff0c;但是更多的时候…

oracle如果不适用toad或者plsql工具如何获取索引建表语句

select dbms_lob.substr(dbms_metadata.get_ddl(INDEX,INDEX_NAME,DIXON))||; from dba_indexes where ownerDIXON这个语句可以获取dixon用户的所有索引创建语句&#xff0c;sql脚本形式呈现 点开一个语句查看 如果不使用dbms_lob.substr这个函数最后得到是一个clob selec…

基于Python+Django+Vue在线图书借阅网站、图书管理系统 - 毕业设计 - 课程设计

文章目录 源码下载地址项目介绍项目功能界面预览项目备注毕设定制&#xff0c;咨询 源码下载地址 点击这里下载代码 项目介绍 这是一个基于pythonvue开发的图书借阅网站。平台采用B/S结构&#xff0c;后端采用主流的Python语言进行开发&#xff0c;前端采用主流的Vue.js进行…

牛客网刷题-(10)

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

Mongoose 开源库--SNTP 网络校时使用笔记

一、SNTP介绍 SNTP是一种简单的网络时间协议&#xff0c;它可以通过网络协议同步计算机的时间&#xff0c;时间的精度不如NTP。 关于SNTP介绍&#xff0c;可以参考 https://www.ionos.com/digitalguide/server/know-how/sntp-simple-network-time-protocol/ 或者 https://time…

docker部署Jenkins(Jenkins+Gitlab+Maven实现CI/CD)

GitLab介绍 GitLab是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的Web服务&#xff0c;可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能&#xff0c;能够浏览源代码&#xff0c;管理缺陷和注释。…

开发项目管理必备神器!10款好用的在线看板工具推荐!

在当今高速发展、竞争激烈的商业环境中&#xff0c;项目管理已经成为了许多组织的生存之道。项目管理可以有效地协调资源&#xff0c;监控进度&#xff0c;把握风险&#xff0c;并实现组织的策略目标。然而&#xff0c;传统的项目管理方法已经无法满足日益复杂和变化的工作需求…

框架安全-CVE 复现Apache ShiroApache Solr漏洞复现

文章目录 服务攻防-框架安全&CVE 复现&Apache Shiro&Apache Solr漏洞复现中间件列表常见开发框架Apache Shiro-组件框架安全暴露的安全问题漏洞复现Apache Shiro认证绕过漏洞&#xff08;CVE-2020-1957&#xff09;CVE-2020-11989验证绕过漏洞CVE_2016_4437 Shiro-…

JS动态转盘可手动设置份数与概率(详细介绍)

这个案例是我老师布置的一项作业&#xff0c;老师已详细讲解&#xff0c;本人分享给大家&#xff0c;详细为你们介绍如何实现。 我们转盘使用线段来实现 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title></title>&l…

2023云栖大会:揭示未来科技的璀璨星辰

翻开科技世界的崭新篇章&#xff0c;2023年的云栖大会将在星光璀璨的杭州盛大开启。这一盛会&#xff0c;是科技创新的聚集地&#xff0c;也是前沿科技展示的殿堂。每年&#xff0c;无数优秀的科技人才和业内精英汇聚于此&#xff0c;共同探讨科技的未来趋势和人类发展的无限可…

编写shell脚本,利用mysqldump实现MySQL数据库分库分表备份

查看数据和数据表 mysql -uroot -p123456 -e show databases mysql -uroot -p123456 -e show tables from cb_d 删除头部Database和数据库自带的表 mysql -uroot -p123456 -e show databases -N | egrep -v "information_schema|mysql|performance_schema|sys"编写…

【Java 进阶篇】Java ServletContext详解:在Web应用中获取全局信息

在Java Web开发中&#xff0c;ServletContext是一个重要的概念&#xff0c;它允许我们在整个Web应用程序中共享信息和资源。本篇博客将深入探讨ServletContext的作用、如何获取它&#xff0c;以及如何在Web应用中使用它。无论您是刚刚入门的小白还是有一定经验的开发者&#xf…

QML WebEngineView 调用 JavaScript

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 在 QML 与 Web 混合开发时,除了使用 WebEngineView 加载网页之外,我们还可以在 QML 层运行 JavaScript 代码,这样就能更灵活地操作浏览器窗口和网页内容,从而实现丰富的交互功能了。例如:获取网页标题、…

【JavaEE初阶】 初识网络原理

文章目录 &#x1f332;网络发展史&#x1f6a9;独立模式&#x1f6a9;网络互连&#x1f4cc;局域网LAN&#x1f388;基于网线直连&#x1f388;基于集线器组建&#x1f388;基于交换机组建&#x1f388;基于交换机和路由器组建 &#x1f4cc;广域网WAN &#x1f340;网络通信基…

人工智能与脑机接口:开启人机融合的新时代

人工智能与脑机接口&#xff1a;开启人机融合的新时代 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;我们正与一个全新的时代相遇——人工智能与脑机接口相融合的时代。这个时代将带来前所未有的变革&#xff0c;让人类与机器的交互方式发生根本性的改变。…

洒洒水阿萨阿萨

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