vue3+vite3+typescript实现验证码功能及表单验证

news2024/11/23 0:16:30

文章目录

    • 验证码组件
    • 父组件
    • 表单验证
    • 最终效果

验证码组件


<template>
  <div class="captcha" style="display: flex;">
    <canvas ref="canvas" width="100" height="40"></canvas>

  </div>
  <div class="valicode-btn">
    <el-button type="text" @click="refresh">看不清,换一张</el-button>
  </div>
</template>

<script setup lang="ts">
import { ref, onMounted } from 'vue'
const emits = defineEmits(['getCode'])
const canvasRef = ref<HTMLCanvasElement | null>(null)
const ctx = ref<CanvasRenderingContext2D | null>(null)
const code = ref('')
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
const charLength = chars.length

function getRandomChar() {
  return chars.charAt(Math.floor(Math.random() * charLength))
}

function draw() {
  if (!ctx.value) return

  ctx.value.clearRect(0, 0, canvasRef.value!.width, canvasRef.value!.height)

  let x = 10
  for (let i = 0; i < 4; i++) {
    const c = getRandomChar()
    code.value += c
    ctx.value.font = 'bold 20px Arial'
    ctx.value.fillStyle = '#333'
    ctx.value.fillText(c, x, 25)
    x += 20
  }

  for (let i = 0; i < 10; i++) {
    ctx.value.strokeStyle = '#ccc'
    ctx.value.beginPath()
    ctx.value.moveTo(Math.random() * 100, Math.random() * 40)
    ctx.value.lineTo(Math.random() * 100, Math.random() * 40)
    ctx.value.stroke()
  }
  emits('getCode', code.value)
}

function refresh() {
  code.value = ''
  draw()
  emits('getCode', code.value)
}

onMounted(() => {
  const code = ref('')
  canvasRef.value = document.querySelector('canvas')
  emits('getCode', code.value)
  ctx.value = canvasRef.value?.getContext('2d')
  draw()
})
</script>

<style scoped>
.captcha {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-direction: column;
}
.valicode-btn{
    height:50px;
    line-height: 50px;
}
</style>


🎨 这是一个Vue组件,包含一个验证码的canvas和一个刷新按钮。具体解释如下:

  1. <template>标签中包含了组件的模板,其中包含了一个class为captcha的div,其中包含了一个canvas元素和一个class为valicode-btn的div,后者包含了一个刷新按钮。

  2. <script>标签中使用了Vue 3的Composition API,包含了以下内容:

  • import语句引入了Vue 3的refonMounted函数,以及defineEmits函数用于定义组件的自定义事件。
  • const关键字定义了一个canvasRef变量,用于引用canvas元素;一个ctx变量,用于引用canvas的2D上下文;一个code变量,用于存储验证码;一个chars变量,用于存储可用于生成验证码的字符;一个charLength变量,用于存储可用于生成验证码的字符的数量。
  • getRandomChar函数用于从chars中随机获取一个字符🎲。
  • draw函数用于绘制验证码。首先清空canvas,然后循环4次,每次从chars中随机获取一个字符,并将其绘制到canvas上。同时,将字符添加到code变量中。接着循环10次,每次绘制一条随机的直线,用于增加验证码的复杂度。
  • refresh函数用于刷新验证码。首先清空code变量,然后调用draw函数重新绘制验证码,并触发自定义事件getCode,将新的验证码传递给父组件。
  • onMounted函数用于在组件挂载后执行一些操作。首先定义一个code变量,然后引用canvas元素和2D上下文,并调用draw函数绘制验证码。最后触发自定义事件getCode,将验证码传递给父组件。
  1. <style>标签中定义了组件的样式,其中.captcha类用于设置验证码和刷新按钮的布局,.valicode-btn类用于设置刷新按钮的样式。scoped属性用于将样式限定在组件内部。

父组件

  <div class="validate-code">
     <div style="display: flex">
       <el-form-item label="验证码:" prop="valicode">
          <el-input v-model="form.valicode"/>
                                                   
            </el-form-item>
          <valicode ref="refresh" @getCode="getCode"  width="150px" />
      </div>
  </div>

<script setup lang="ts">

const code = ref('')
const getCode=(value:any)=> {
    code.value = value
    console.log(value);
}

</script>

验证码组件是通过引入一个名为valicode的组件来实现的。当验证码组件生成新的验证码时,会通过@getCode事件将验证码传递给父组件,并通过console.log打印出来。父组件通过v-model绑定了验证码输入框的值,当用户输入验证码时,会将输入的值保存在form.valicode中。整个表单的验证依赖于prop属性,即valicode。如果用户未输入验证码或输入的验证码与生成的验证码不匹配,则表单验证不通过。

表单验证

const rules=reactive<FormRules>({
	valicode: [
    { required: true, message: '请输入验证码', trigger: 'blur' },
    { validator: checkCode, trigger: 'blur' },
    ],
})
const checkCode=(rule: any, value: any, callback: any)=>{
    console.log(code.value);
    
    if (!value) {
    return  callback(new Error('请输入验证码'))
  }
  setTimeout(() => {
    if (value != code.value) {
      callback(new Error('验证码有误,请重新输入'))
    }else {
      callback()
    }
  }, 500)
}

通过reactive函数创建了一个名为rules的响应式对象,其中包含一个名为valicode的属性,其值为一个数组,数组中包含两个对象,分别表示对于valicode这个表单项的两个验证规则。第一个规则要求该表单项必填,且在失去焦点时进行验证;第二个规则使用了自定义的验证函数checkCode,在失去焦点时进行验证。

checkCode函数接收三个参数,分别为验证规则对象、当前表单项的值和回调函数。在函数内部,首先打印出了一个名为code的响应式对象的值,然后判断当前表单项的值是否为空,如果为空则通过回调函数返回一个错误信息。如果不为空,则通过setTimeout函数模拟了一个异步验证过程,500毫秒后判断当前表单项的值是否等于code的值,如果不等于则通过回调函数返回一个错误信息,否则通过回调函数返回一个空值表示验证通过。

这里setTimeout函数给form标签加上status-icon会在校验时有一个转圈的效果哦~

最终效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

LeetCode 1019. Next Greater Node In Linked List【单调栈模板】中等

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

如何实现视觉识别颜色

1. 功能说明 通过摄像头识别特定颜色&#xff08;红、绿、蓝&#xff09;。摄像头采集图像信息并通过WiFi将信息传递给PC端&#xff0c;然后PC端根据比例判断出目标颜色在色盘上的所属颜色后&#xff0c;指针便会指向对应颜色。 红、绿、蓝-色块2. 电子硬件 本实验中采用了以下…

网络编程【TCP流套接字编程】

目录 TCP流套接字编程 1.ServerSocket API 2.Socket API 3.TCP中的长短连接 4.回显程序(短连接) 5.服务器和客户端它们的交互过程 6.运行结果及修改代码 TCP流套接字编程 ❗❗两个核心&#xff1a;ServerSocket Socket 1.ServerSocket API ✨ServerSocket 是创建…

RK3568平台开发系列讲解(Linux系统篇)Linux 目录结构介绍

🚀返回专栏总目录 文章目录 一、 linux 目录结构二、 linux 文件层次标准三、 linux 目录结构沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们从目录管理入手,会更直观的理解 linux 的目录结构。 一、 linux 目录结构 Linux 整个文件系统是以“ / ”目录开…

Cobalt_Strike_4.5渗透工具的安装与使用

前言&#xff1a; Cobalt Strike是一款内网渗透测试神器&#xff0c;Cobalt Strike分为客户端和服务器端&#xff0c;该服务器端被称为团队服务器&#xff0c;是Beacon有效负载的控制器&#xff0c;同时&#xff0c;cobalt strike也具有社会工程学功能&#xff0c;团队服务器还…

企业如何使用OA系统?OA系统有哪些功能和应用的场景?

企业如何使用OA系统&#xff1f;OA系统有哪些功能和应用的场景&#xff1f; 办公自动化&#xff08;Office Automation&#xff0c;简称OA&#xff09;&#xff0c;是将计算机、通信等现代化技术运用到传统办公方式&#xff0c;进而形成的一种新型办公方式。办公自动化利用现代…

02_Uboot基本命令与内存命令

目录 U-Boot命令使用 信息查询命令 环境变量操作命令 内存操作命令 U-Boot命令使用 进入uboot的命令行模式以后输入“help”或者“&#xff1f;”,然后按下回车即可查看当前uboot 所支持的命令,如图所示: 图中只是uboot的一部分命令,具体的命令列表以实际为准。图中的命令…

Mongo初遇回忆录

序 上周&#xff0c;我和M女士分手了&#xff0c;也许是上个月&#xff0c;我不知道。也许是她太墨守成规&#xff0c;也许是我太肆意妄为&#xff0c;她说我给不了她想要的平稳和安定。她没有留下太多东西&#xff0c;我也不愿留下更多回忆。 做决定的过程中&#xff0c;我比…

「计算机控制系统」4. 计算机控制系统分析

Z平面 稳定性分析 稳态误差分析 动态过程分析 频率特性 文章目录Z平面与S平面的映射关系稳定性分析离散Routh判据Jury判据离散Nyquist判据稳态误差静态误差系数动态过程频率特性Z平面与S平面的映射关系 S平面虚轴的映射 ω\omegaω与θ\thetaθ的映射 可以看出从S平面到Z平面…

远程组态管理的好处

远程组态管理可以简化管理工作&#xff0c;帮助您节省时间和金钱。远程组态管理可以通过各种应用程序来实现&#xff0c;包括&#xff1a; •监控所有设备的状态&#xff0c;以确保它们正常工作。 •记录现场数据&#xff0c;例如温度&#xff0c;压力或流量。 •快速、轻松地…

自动驾驶「时过境迁」,这家头部出行服务平台再出发

滴滴自动驾驶复活了&#xff1f; 昨日&#xff0c;滴滴正式发布了首个自动驾驶自动运维中心&#xff0c;以及首款未来服务概念车DiDi Neuron&#xff0c;同时还公布了在技术、硬件、量产以及新业务探索方面的进展。 按照计划&#xff0c;滴滴自动驾驶正在结合新能源整车企业能…

【单链表】的增删查改

&#x1f58a;作者 : Djx_hmbb &#x1f4d8;专栏 : 数据结构 &#x1f606;今日分享 : “Onc in a blu moon” : “罕见的,千载难逢的” (出现在19世纪,指的是"在一个月内出现的第二次圆月”&#xff0c;这种现象每隔32个月发生一次。) 文章目录✔单链表的功能实现:&…

大前端突围之路:从RN跨平台到大前端全栈统一

本文首发自「慕课网」(imooc.com)&#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注"慕课网"&#xff01; 作者&#xff1a;FE大公爵|慕课网讲师 前言 不知不觉&#xff0c;在大前端领域也混迹十年了&#xff0c;一路的经历不敢说…

接口自动化测试yaml+requests+allure技术,你学会了吗?

目录 前言 一、什么是接口自动化测试 二、为什么要进行接口自动化测试 三、接口自动化测试的流程 四、yaml语言介绍 五、requests库介绍 六、allure技术介绍 七、总结 前言 接口自动化测试是在软件开发过程中常用的一种测试方式&#xff0c;通过对接口进行自动化测试&a…

SQL Sever 单表数据查询(下)

提示&#xff1a;本篇文章是在上篇文章的基础上进行单表数据查询操作的补充,主要以例题的方式呈现. 文章目录前言1.分组&#xff1a;统计各门课程的选修人数2.分别统计男女生的平均年龄3.查询所有科目成绩在85分以上的学生的学号及其平均分4.查询平均年龄大于18岁的系部和平均年…

Linux复习 / 动静态库QA梳理 | 如何使用第三方库?

文章目录前言Q&A概念Q&#xff1a;使用静态库和使用动态库的程序有什么区别&#xff1f;Q&#xff1a;什么是静态链接/动态链接&#xff1f;使用与制作Q&#xff1a;如何制作动静态库&#xff1f;Q&#xff1a;如何使用第三方库&#xff1f;Q&#xff1a;程序加载时&#x…

C语言-实现顺序二叉树和平衡二叉树AVL

1. 结构体 在实现二叉树之前先看下结构体的一些使用方法 数组是保存一系列相同的数据。在实际问题中&#xff0c;一组数据往往有很多种不同的数据类型。例如&#xff0c;登记学生的信息&#xff0c;可能需要用到 char型的姓名&#xff0c;int型或 char型的学号&#xff0c;in…

4.6--计算机网络之TCP篇之TCP的基本认识--(复习+深入)---好好沉淀,加油呀

1.TCP 头格式有哪些&#xff1f; 序列号&#xff1a; 在建立连接时由计算机生成的随机数作为其初始值&#xff0c;通过 SYN 包传给接收端主机&#xff0c;每发送一次数据&#xff0c;就「累加」一次该「数据字节数」的大小。 用来解决网络包乱序问题。 确认应答号&#xff1a; …

MySQL优化——Explain分析执行计划详解

文章目录前言一. 查看SQL执行频率二. 定位低效率执行SQL三. explain分析执行计划3.1 id3.2 select_type3.3 table3.4 type3.5 key3.6 rows3.7 extra四. show profile分析SQL前言 在应用的的开发过程中&#xff0c;由于初期数据量小&#xff0c;开发人员写 SQL 语句时更重视功能…

酷炫的3D智慧工厂不会打造?这40+可视化大屏模板千万别错过!

数字化已成为各行各业的重要趋势&#xff0c;因为数字化能够带来精准的效益提升。小米公司最近推进了黑灯工厂业务。”24小时熄灯操作&#xff0c;全程无人工干预”&#xff0c;这是小米智能工厂的重要特征。走进工厂&#xff0c;闪烁的灯带提示生产正在进行&#xff0c;机器通…