最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue3+vite3+typescript實(shí)現(xiàn)驗(yàn)證碼功能及表單驗(yàn)證效果

 更新時(shí)間:2023年04月18日 14:46:14   作者:小城夏記  
這篇文章主要介紹了vue3+vite3+typescript實(shí)現(xiàn)驗(yàn)證碼功能及表單驗(yàn)證效果,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

驗(yàn)證碼組件

<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>

?? 這是一個(gè)Vue組件,包含一個(gè)驗(yàn)證碼的canvas和一個(gè)刷新按鈕。具體解釋如下:

  • <template>標(biāo)簽中包含了組件的模板,其中包含了一個(gè)class為captcha的div,其中包含了一個(gè)canvas元素和一個(gè)class為valicode-btn的div,后者包含了一個(gè)刷新按鈕。
  • <script>標(biāo)簽中使用了Vue 3的Composition API,包含了以下內(nèi)容:
    • import語(yǔ)句引入了Vue 3的refonMounted函數(shù),以及defineEmits函數(shù)用于定義組件的自定義事件。
    • const關(guān)鍵字定義了一個(gè)canvasRef變量,用于引用canvas元素;一個(gè)ctx變量,用于引用canvas的2D上下文;一個(gè)code變量,用于存儲(chǔ)驗(yàn)證碼;一個(gè)chars變量,用于存儲(chǔ)可用于生成驗(yàn)證碼的字符;一個(gè)charLength變量,用于存儲(chǔ)可用于生成驗(yàn)證碼的字符的數(shù)量。
    • getRandomChar函數(shù)用于從chars中隨機(jī)獲取一個(gè)字符??。
    • draw函數(shù)用于繪制驗(yàn)證碼。首先清空canvas,然后循環(huán)4次,每次從chars中隨機(jī)獲取一個(gè)字符,并將其繪制到canvas上。同時(shí),將字符添加到code變量中。接著循環(huán)10次,每次繪制一條隨機(jī)的直線,用于增加驗(yàn)證碼的復(fù)雜度。
    • refresh函數(shù)用于刷新驗(yàn)證碼。首先清空code變量,然后調(diào)用draw函數(shù)重新繪制驗(yàn)證碼,并觸發(fā)自定義事件getCode,將新的驗(yàn)證碼傳遞給父組件。
    • onMounted函數(shù)用于在組件掛載后執(zhí)行一些操作。首先定義一個(gè)code變量,然后引用canvas元素和2D上下文,并調(diào)用draw函數(shù)繪制驗(yàn)證碼。最后觸發(fā)自定義事件getCode,將驗(yàn)證碼傳遞給父組件。

3.<style>標(biāo)簽中定義了組件的樣式,其中.captcha類用于設(shè)置驗(yàn)證碼和刷新按鈕的布局,.valicode-btn類用于設(shè)置刷新按鈕的樣式。scoped屬性用于將樣式限定在組件內(nèi)部。

父組件

  <div class="validate-code">
     <div style="display: flex">
       <el-form-item label="驗(yàn)證碼:" 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>

驗(yàn)證碼組件是通過(guò)引入一個(gè)名為valicode的組件來(lái)實(shí)現(xiàn)的。當(dāng)驗(yàn)證碼組件生成新的驗(yàn)證碼時(shí),會(huì)通過(guò)@getCode事件將驗(yàn)證碼傳遞給父組件,并通過(guò)console.log打印出來(lái)。父組件通過(guò)v-model綁定了驗(yàn)證碼輸入框的值,當(dāng)用戶輸入驗(yàn)證碼時(shí),會(huì)將輸入的值保存在form.valicode中。整個(gè)表單的驗(yàn)證依賴于prop屬性,即valicode。如果用戶未輸入驗(yàn)證碼或輸入的驗(yàn)證碼與生成的驗(yàn)證碼不匹配,則表單驗(yàn)證不通過(guò)。

表單驗(yàn)證

const rules=reactive<FormRules>({
	valicode: [
    { required: true, message: '請(qǐng)輸入驗(yàn)證碼', trigger: 'blur' },
    { validator: checkCode, trigger: 'blur' },
    ],
})
const checkCode=(rule: any, value: any, callback: any)=>{
    console.log(code.value);
    
    if (!value) {
    return  callback(new Error('請(qǐng)輸入驗(yàn)證碼'))
  }
  setTimeout(() => {
    if (value != code.value) {
      callback(new Error('驗(yàn)證碼有誤,請(qǐng)重新輸入'))
    }else {
      callback()
    }
  }, 500)
}

通過(guò)reactive函數(shù)創(chuàng)建了一個(gè)名為rules的響應(yīng)式對(duì)象,其中包含一個(gè)名為valicode的屬性,其值為一個(gè)數(shù)組,數(shù)組中包含兩個(gè)對(duì)象,分別表示對(duì)于valicode這個(gè)表單項(xiàng)的兩個(gè)驗(yàn)證規(guī)則。第一個(gè)規(guī)則要求該表單項(xiàng)必填,且在失去焦點(diǎn)時(shí)進(jìn)行驗(yàn)證;第二個(gè)規(guī)則使用了自定義的驗(yàn)證函數(shù)checkCode,在失去焦點(diǎn)時(shí)進(jìn)行驗(yàn)證。

checkCode函數(shù)接收三個(gè)參數(shù),分別為驗(yàn)證規(guī)則對(duì)象、當(dāng)前表單項(xiàng)的值和回調(diào)函數(shù)。在函數(shù)內(nèi)部,首先打印出了一個(gè)名為code的響應(yīng)式對(duì)象的值,然后判斷當(dāng)前表單項(xiàng)的值是否為空,如果為空則通過(guò)回調(diào)函數(shù)返回一個(gè)錯(cuò)誤信息。如果不為空,則通過(guò)setTimeout函數(shù)模擬了一個(gè)異步驗(yàn)證過(guò)程,500毫秒后判斷當(dāng)前表單項(xiàng)的值是否等于code的值,如果不等于則通過(guò)回調(diào)函數(shù)返回一個(gè)錯(cuò)誤信息,否則通過(guò)回調(diào)函數(shù)返回一個(gè)空值表示驗(yàn)證通過(guò)。

這里setTimeout函數(shù)給form標(biāo)簽加上status-icon會(huì)在校驗(yàn)時(shí)有一個(gè)轉(zhuǎn)圈的效果哦~

最終效果

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

到此這篇關(guān)于vue3+vite3+typescript實(shí)現(xiàn)驗(yàn)證碼功能及表單驗(yàn)證效果的文章就介紹到這了,更多相關(guān)vue3+vite3+typescript驗(yàn)證碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue頁(yè)面更新patch的實(shí)現(xiàn)示例

    vue頁(yè)面更新patch的實(shí)現(xiàn)示例

    這篇文章主要介紹了vue頁(yè)面更新patch的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • vue3使用vis繪制甘特圖制作timeline可拖動(dòng)時(shí)間軸及時(shí)間軸中文化(推薦)

    vue3使用vis繪制甘特圖制作timeline可拖動(dòng)時(shí)間軸及時(shí)間軸中文化(推薦)

    這篇文章主要介紹了vue3使用vis繪制甘特圖制作timeline可拖動(dòng)時(shí)間軸,時(shí)間軸中文化,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-02-02
  • 結(jié)合el-upload組件實(shí)現(xiàn)大文件分片上傳功能

    結(jié)合el-upload組件實(shí)現(xiàn)大文件分片上傳功能

    Element UI的el-upload上傳組件相信各位小伙伴都已經(jīng)非常熟悉,最近接了一個(gè)新需求,要求在el-upload組件基礎(chǔ)上實(shí)現(xiàn)分片上傳功能,即小于等于5M文件正常上傳,大于5M文件切成5M每片上傳,那么這個(gè)功能怎么實(shí)現(xiàn)呢?一起看看吧
    2022-09-09
  • 淺談vue websocket nodeJS 進(jìn)行實(shí)時(shí)通信踩到的坑

    淺談vue websocket nodeJS 進(jìn)行實(shí)時(shí)通信踩到的坑

    這篇文章主要介紹了淺談vue websocket nodeJS 進(jìn)行實(shí)時(shí)通信踩到的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • 解讀Vue實(shí)例的屬性及模板渲染

    解讀Vue實(shí)例的屬性及模板渲染

    這篇文章主要介紹了解讀Vue實(shí)例的屬性及模板渲染問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Vue生命周期activated之返回上一頁(yè)不重新請(qǐng)求數(shù)據(jù)操作

    Vue生命周期activated之返回上一頁(yè)不重新請(qǐng)求數(shù)據(jù)操作

    這篇文章主要介紹了Vue生命周期activated之返回上一頁(yè)不重新請(qǐng)求數(shù)據(jù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • Vue單頁(yè)式應(yīng)用(Hash模式下)實(shí)現(xiàn)微信分享的實(shí)例

    Vue單頁(yè)式應(yīng)用(Hash模式下)實(shí)現(xiàn)微信分享的實(shí)例

    本篇文章介紹了Vue單頁(yè)式應(yīng)用(Hash模式下)實(shí)現(xiàn)微信分享的實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • vue{{}}拼接字符串和換行符方式

    vue{{}}拼接字符串和換行符方式

    這篇文章主要介紹了vue{{}}拼接字符串和換行符方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 基于vue+canvas的excel-like組件實(shí)例詳解

    基于vue+canvas的excel-like組件實(shí)例詳解

    a vue component,基于vue的表格組件,主要解決大數(shù)據(jù)量的表格渲染性能問(wèn)題,使用canvas繪制表格,同時(shí)支持類似excel的批量選中,復(fù)制黏貼刪除,實(shí)時(shí)編輯等功能.這篇文章主要介紹了基于vue+canvas的excel-like組件,需要的朋友可以參考下
    2017-11-11
  • 前端vue如何使用高德地圖

    前端vue如何使用高德地圖

    這篇文章主要介紹了前端vue如何使用高德地圖,幫助大家利用vue調(diào)用其他key,完成需求,感興趣的朋友可以了解下
    2020-11-11

最新評(píng)論

龙川县| 惠东县| 三江| 台中市| 淳安县| 普宁市| 遵化市| 靖安县| 南昌市| 赣州市| 新建县| 瑞金市| 黄冈市| 宁陵县| 长宁区| 萝北县| 宣化县| 禄丰县| 勐海县| 获嘉县| 松江区| 永善县| 凯里市| 安乡县| 滦南县| 安龙县| 巴林左旗| 乌拉特中旗| 堆龙德庆县| 桑植县| 望江县| 新民市| 连平县| 泰州市| 长寿区| 高邑县| 西乌珠穆沁旗| 阿拉善右旗| 晴隆县| 西安市| 文安县|