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

 更新时间:2023年04月18日 14:46:14   作者:小城夏记  
这篇文章主要介绍了vue3+vite3+typescript实现验证码功能及表单验证效果,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

验证码组件

<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和一个刷新按钮。具体解释如下:

  • <template>标签中包含了组件的模板,其中包含了一个class为captcha的div,其中包含了一个canvas元素和一个class为valicode-btn的div,后者包含了一个刷新按钮。
  • <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,将验证码传递给父组件。

3.<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会在校验时有一个转圈的效果哦~

最终效果

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

到此这篇关于vue3+vite3+typescript实现验证码功能及表单验证效果的文章就介绍到这了,更多相关vue3+vite3+typescript验证码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue3简易实现proxy代理实例详解

    vue3简易实现proxy代理实例详解

    这篇文章主要为大家详细介绍了Python实现学生成绩管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • vue自定义组件实现v-model双向绑定数据的实例代码

    vue自定义组件实现v-model双向绑定数据的实例代码

    vue中父子组件通信,都是单项的,直接在子组件中修改prop传的值vue也会给出一个警告,接下来就用一个小列子一步一步实现了vue自定义的组件实现v-model双向绑定,需要的朋友可以参考下
    2021-10-10
  • 使用webpack搭建vue环境的教程详解

    使用webpack搭建vue环境的教程详解

    这篇文章主要介绍了使用webpack搭建vue环境的教程,本文通过实例的形式给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • vue 路由懒加载详情

    vue 路由懒加载详情

    这篇文章主要介绍了vue 路由懒加载,当打包构建应用时,JavaScript 包会变得非常大,影响页面加载,这便是vue 路由懒加载,接下来随小编一起进入文章了解更多详细内容吧
    2021-10-10
  • vue+elementUI组件tree如何实现单选加条件禁用

    vue+elementUI组件tree如何实现单选加条件禁用

    这篇文章主要介绍了vue+elementUI组件tree如何实现单选加条件禁用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • ElementUI时间选择器限制选择范围disabledData的使用

    ElementUI时间选择器限制选择范围disabledData的使用

    本文主要介绍了ElementUI时间选择器限制选择范围disabledData的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • vue实现弹幕功能

    vue实现弹幕功能

    这篇文章主要介绍了vue实现弹幕功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-10-10
  • 尤大大新活petite-vue的实现

    尤大大新活petite-vue的实现

    打开尤大大的GitHub,发现多了个叫 petite-vue 的东西,Vue3 和 Vite 还没学完呢,又开始整新东西了?本文就来介绍一下
    2021-07-07
  • vue cli 3.x 项目部署到 github pages的方法

    vue cli 3.x 项目部署到 github pages的方法

    这篇文章主要介绍了vue cli 3.x 项目部署到 github pages的方法,非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-04-04
  • 一文带你详细了解vue axios的封装

    一文带你详细了解vue axios的封装

    对请求的封装在实际项目中是十分必要的,它可以让我们统一处理 http 请求,比如做一些拦截,处理一些错误等,本篇文章将详细介绍如何封装 axios 请求,需要的朋友可以参考下
    2023-09-09

最新评论