欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于JS實(shí)現(xiàn)發(fā)送驗(yàn)證碼的計(jì)時(shí)器效果

 更新時(shí)間:2023年11月30日 11:21:00   作者:Ashy  
這篇文章主要為大家詳細(xì)介紹了如何基于JS實(shí)現(xiàn)一個(gè)發(fā)送驗(yàn)證碼的計(jì)時(shí)器效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下吧

一、實(shí)現(xiàn)效果

需求:

  • 點(diǎn)擊按鈕后開始讀秒
  • 讀秒期間不可點(diǎn)擊
  • 讀秒結(jié)束后可以繼續(xù)點(diǎn)擊

二、實(shí)現(xiàn)思路(步驟)

1.要做到計(jì)時(shí)器的效果,首先得實(shí)現(xiàn)一個(gè)讀秒的效果

let count = 60; // 這里只做演示說(shuō)明 Gif 中是 10
setInterval(() => {
  count = count - 1
}, 1000)

2.清除定時(shí)器的效果,處理狀態(tài)

let count = 10;
let timer = setInterval(() => {
  count = count - 1
}, 1000)

// 這里我用 setTimeout 來(lái)做 clearInterval 的操作
setTimeout(function () {
  timer && clearInterval(timer)
  // 清理定時(shí)器的時(shí)機(jī)為 10 次之后
}, 10 * 1000)

注:

這里對(duì)于 setTimeout 清理 setInterval 這個(gè)定時(shí)器做一個(gè)說(shuō)明

原本我的實(shí)現(xiàn)是在 setInterval 的執(zhí)行中通過判斷計(jì)數(shù)來(lái)銷毀這個(gè)定時(shí)器的,但是發(fā)現(xiàn)定時(shí)器依然在執(zhí)行,執(zhí)行的原因是:setInterval 函數(shù)會(huì)在執(zhí)行完回調(diào)函數(shù)后,創(chuàng)建一個(gè)新的定時(shí)器,并將舊的定時(shí)器銷毀。 因此,當(dāng)你在 setInterval 中執(zhí)行 clearInterval 時(shí),實(shí)際上是清除了一個(gè)已經(jīng)被銷毀的定時(shí)器。

通過以上兩步,就可以實(shí)現(xiàn)了需求 1。將上述操作封裝函數(shù)就可以得到一個(gè)簡(jiǎn)單的定時(shí)器功能了。

3.處理定時(shí)器的讀秒期間不可點(diǎn)擊實(shí)現(xiàn)(需求 2)

/**
 * @param {number} initCount 調(diào)用次數(shù)
 * @param {(count: number) => count} time 定時(shí)器執(zhí)行時(shí)間間隔
 * @returns [開始調(diào)用, 計(jì)數(shù)器, 是否執(zhí)行中]
 */
let tiggering = false;
export const tigger = (initCount = 60, callback: (count: number) => count) => {
    let count = initCount;
    let timer: NodeJS.Timeout | null = null
    
    // 如果未觸發(fā),則可以執(zhí)行定時(shí)器
    if (!tiggering) {
        tiggering = true
        timer = setInterval(() => {
            count = count - 1
            // 定時(shí)器每次執(zhí)行后更新回調(diào),這樣可以在頁(yè)面使用該狀態(tài)
            callback(count)
        }, time)
    }

    setTimeout(function () {
        // 定時(shí)器結(jié)束時(shí)設(shè)置更新觸發(fā)狀態(tài)
        tiggering = false
        timer && clearInterval(timer)
    }, count * time)
}

在這里我是將邏輯部分抽離為工具函數(shù)的使用,在實(shí)際項(xiàng)目中有步驟 2,在合適的時(shí)機(jī)做相對(duì)應(yīng)的邏輯處理,基本夠用了。

這段代碼的實(shí)現(xiàn)基本沒什么大的問題了,tiggering 狀態(tài)的維護(hù)是放在了工具函數(shù)之外,感覺不是很優(yōu)雅。在函數(shù)內(nèi)部的實(shí)現(xiàn)話就需要用到閉包維護(hù)內(nèi)部函數(shù)的形式來(lái)保護(hù)這個(gè)變量了,這點(diǎn)大家可以看看表達(dá)下自己的想法~

三、封裝一個(gè)適用的 React 自定義 hook

實(shí)現(xiàn)思路大致和 步驟 3 類似:

import { useState } from 'react'

/**
 * @param initCount 調(diào)用次數(shù)
 * @param time 定時(shí)器執(zhí)行時(shí)間間隔,這里支持修改真實(shí)的時(shí)間間隔
 * @returns [開始調(diào)用, 計(jì)數(shù)器, 是否執(zhí)行中]
 */
export default (initCount = 120, time = 1000): [() => void, number, boolean] => {
  // 維護(hù)調(diào)用次數(shù)
  const [count, setCount] = useState(initCount)
  // 維護(hù)觸發(fā)狀態(tài),用于 UI 部分實(shí)現(xiàn)禁用
  const [tiggering, setTiggering] = useState(false)

  let timer: NodeJS.Timeout | null = null
  const tigger = () => {
    // 注:在這里又進(jìn)行了一次 setCount 賦值操作,是為了解決第一次驗(yàn)證碼讀秒結(jié)束后,
    // 第二次驗(yàn)證碼執(zhí)行(tigger 函數(shù)調(diào)用)時(shí),自定義 hook 已經(jīng)執(zhí)行,count 的值為 0 的情況
    setCount(initCount)
    if (!tiggering) {
      setTiggering(true)
      timer = setInterval(() => {
        setCount(count => count - 1)
      }, time)
    }

    setTimeout(function () {
      timer && clearInterval(timer)
      setTiggering(false)
    }, initCount * time)
  }

  return [tigger, count, tiggering]
}

組件中使用

這里簡(jiǎn)寫實(shí)現(xiàn)過程

// ... 引入略
const [tigger, count, tiggering] = useTimeCount(10)

const sendCode = () => {
    // 發(fā)送驗(yàn)證嗎
    getMailCode({ receiver: code }).then(res => {
        if (res) {
            tigger()
            // 這里可以執(zhí)行其他邏輯,如發(fā)送成功的提示
        }
    })
}

return (
    <Button disabled={tiggering} className='send-btn' onClick={sendCode}>
        {tiggering ? `${count}s` : 'Send code'}
    </Button>
)

小結(jié)

在實(shí)現(xiàn)這套流程的時(shí)候,一開始覺得是個(gè)簡(jiǎn)單的實(shí)現(xiàn),在實(shí)現(xiàn)過程中還是踩了一些小坑的,比如上文中說(shuō)到的 clearInterval 的銷毀時(shí)機(jī)的問題;以及考慮了下普通函數(shù)封裝(步驟 3)。

到此這篇關(guān)于基于JS實(shí)現(xiàn)發(fā)送驗(yàn)證碼的計(jì)時(shí)器效果的文章就介紹到這了,更多相關(guān)JS計(jì)時(shí)器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • javascript常用的方法分享

    javascript常用的方法分享

    本文給大家分享了幾個(gè)javascript中常用的方法,十分的實(shí)用,也很簡(jiǎn)單,有需要的小伙伴可以參考下。
    2015-07-07
  • js利用canvas制作一個(gè)實(shí)時(shí)時(shí)鐘

    js利用canvas制作一個(gè)實(shí)時(shí)時(shí)鐘

    Canvas是HTML5中強(qiáng)大的繪圖工具,它讓我們能夠在網(wǎng)頁(yè)上創(chuàng)建各種精美的圖形和動(dòng)畫效果,本文將向您展示如何使用Canvas制作一個(gè)實(shí)時(shí)時(shí)鐘,感興趣的可以了解下
    2023-08-08
  • 小程序最新獲取用戶昵稱和頭像的方法總結(jié)

    小程序最新獲取用戶昵稱和頭像的方法總結(jié)

    這篇文章主要介紹了小程序最新獲取用戶昵稱和頭像的方法總結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 使用Docker搭建Jackett的詳細(xì)教程

    使用Docker搭建Jackett的詳細(xì)教程

    Jackett是一個(gè)開源的種子搜索器,它提供了一個(gè)統(tǒng)一的API,可以讓你通過一個(gè)界面來(lái)搜索和下載種子文件,這篇文章主要給大家介紹了關(guān)于使用Docker搭建Jackett的相關(guān)資料,需要的朋友可以參考下
    2024-04-04
  • js深拷貝與淺拷貝一文徹底搞懂

    js深拷貝與淺拷貝一文徹底搞懂

    這篇文章主要介紹了js深拷貝與淺拷貝一文徹底搞懂,需要的朋友可以參考下
    2022-04-04
  • 不用typsescript如何使用類型增強(qiáng)功能

    不用typsescript如何使用類型增強(qiáng)功能

    這篇文章主要給大家介紹了關(guān)于不用typsescript如何使用類型增強(qiáng)功能的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • javascript跨域刷新實(shí)現(xiàn)代碼

    javascript跨域刷新實(shí)現(xiàn)代碼

    在XX項(xiàng)目里面需要通過一個(gè)iframe去刷新同一窗口的另外一個(gè)iframe。一個(gè)超級(jí)簡(jiǎn)單的處理,但我還在blog上記一記,有些看似簡(jiǎn)單的東西,在真實(shí)項(xiàng)目應(yīng)用中還是值得思考地方
    2011-01-01
  • 解決layui laydate 時(shí)間控件一閃而過的問題

    解決layui laydate 時(shí)間控件一閃而過的問題

    今天小編就為大家分享一篇解決layui laydate 時(shí)間控件一閃而過的問題,具有好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2019-09-09
  • 實(shí)現(xiàn)圖片首尾平滑輪播(JS原生方法—節(jié)流)

    實(shí)現(xiàn)圖片首尾平滑輪播(JS原生方法—節(jié)流)

    下面小編就為大家?guī)?lái)一篇實(shí)現(xiàn)圖片首尾平滑輪播(JS原生方法—節(jié)流)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2017-10-10
  • JavaScript實(shí)現(xiàn)簡(jiǎn)單圖片翻轉(zhuǎn)的方法

    JavaScript實(shí)現(xiàn)簡(jiǎn)單圖片翻轉(zhuǎn)的方法

    這篇文章主要介紹了JavaScript實(shí)現(xiàn)簡(jiǎn)單圖片翻轉(zhuǎn)的方法,涉及javascript操作圖片與數(shù)組的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-04-04

最新評(píng)論