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

React+Typescript實(shí)現(xiàn)倒計(jì)時(shí)Hook的方法

 更新時(shí)間:2021年09月14日 09:50:17   作者:燎原火_  
本文主要介紹了React+Typescript實(shí)現(xiàn)倒計(jì)時(shí)Hook的方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

首先對(duì)setInterval做了Hook化封裝👇

import { useEffect, useRef } from 'react'

/**
 * interTerval hooks組件
 * @param fn 執(zhí)行函數(shù)
 * @param delay 時(shí)間
 * @param options immediate為true時(shí),先立即執(zhí)行一次fn函數(shù)后再執(zhí)行定時(shí)器
 */
function useInterval(
  fn: () => void,
  delay: number | null | undefined,
  options?: {
    immediate?: boolean
  }
): void {
  const immediate = options?.immediate
  const timerRef = useRef<() => void>()

  timerRef.current = fn

  useEffect(() => {
    if (delay === undefined || delay === null) {
      return
    }
    if (immediate) {
      timerRef.current?.()
    }
    const timer = setInterval(() => {
      timerRef.current?.()
    }, delay)
    return () => {
      clearInterval(timer)
    }
  }, [delay])
}

export default useInterval

實(shí)現(xiàn)倒計(jì)時(shí)Hook

import { useState, useEffect, useRef, useMemo } from 'react'
import { useInterval } from './'

interface ITime {
  /** 當(dāng)前時(shí)間 */
  currentTime?: number
  /** 結(jié)束時(shí)間 */
  endTime?: number
  /** 另一種方式,不傳當(dāng)前時(shí)間和結(jié)束時(shí)間,直接傳時(shí)間差 */
  differTime?: number
}

interface ICbTime {
  d: number
  h: number
  m: number
  s: number
}

/**
 * 倒計(jì)時(shí)hooks
 * @param options 時(shí)間對(duì)象
 * @param cb 倒計(jì)時(shí)完成時(shí)執(zhí)行的回調(diào)函數(shù)
 * @param noImmediate 時(shí)間傳進(jìn)來滿足執(zhí)行回調(diào)條件時(shí),是否立即執(zhí)行回調(diào),默認(rèn)false執(zhí)行
 */
function useCountDown(
  options: ITime,
  cb?: () => void,
  noImmediate?: boolean
): ICbTime {
  const { currentTime = 0, endTime = 0, differTime = 0 } = options
  const [diffTime, setDiffTime] = useState(0)
  /** 組件接收到參數(shù)時(shí)的時(shí)間 */
  const entryTime = useRef<number>(0)
  /** 當(dāng)前倒計(jì)時(shí)要求的時(shí)間差 */
  const maxTime = useRef<number>(0)
  /** 是否可以執(zhí)行回調(diào) */
  const isImplementCb = useRef(false)

  useEffect(() => {
    if (!isImplementCb.current) {
      isImplementCb.current = true
    }
    if ((currentTime > 0 && endTime > 0) || differTime > 0) {
      entryTime.current = new Date().getTime()
      maxTime.current = differTime > 0 ? differTime : endTime - currentTime
      if (maxTime.current <= 0 && noImmediate) {
        isImplementCb.current = false
      }
      setDiffTime(maxTime.current)
    }
  }, [currentTime, endTime, differTime])

  useInterval(
    () => {
      const curtTimes = new Date().getTime()
      const TimeDifference = curtTimes - entryTime.current
      setDiffTime(maxTime.current - TimeDifference)
    },
    diffTime <= 0 ? null : 1000
  )

  const timeObj = useMemo(() => {
    const time = diffTime > 0 ? diffTime / 1000 : 0
    const d = Math.floor(time / (24 * 60 * 60))
    const h = Math.floor((time / (60 * 60)) % 24)
    const m = Math.floor((time / 60) % 60)
    const s = Math.ceil(time % 60)

    if (diffTime <= 0 && isImplementCb.current) {
      /**
       * setTimeout用于解決react報(bào)錯(cuò)問題:
       * annot update during an existing state transition (such as within `render`).
       * Render methods should be a pure function of props and state.
       */
      setTimeout(() => {
        cb?.()
      }, 0)
    }
    return { d, h, m, s }
  }, [diffTime])

  return timeObj || ({} as ICbTime)
}

export default useCountDown

寫個(gè)demo看一下效果👇

  const TimeArea = () => {
    const { d, h, m, s } = useCountDown(
      {
        currentTime: 1631262176333,
        endTime: 1831062176333
      },
      () => {
        alert('倒計(jì)時(shí)結(jié)束')
      }
    )
    return (
      <div style={{ width: '200px', height: '200px' }}>
        距離任務(wù)結(jié)束 wppm3vysvbp天<i>{h < 10 ? '0' + h : h}</i>:
        <i>{m < 10 ? '0' + m : m}</i>:<i>{s < 10 ? '0' + s : s}</i>
      </div>
    )
  }

到此這篇關(guān)于React+Typescript實(shí)現(xiàn)倒計(jì)時(shí)Hook的方法的文章就介紹到這了,更多相關(guān)React+Typescript實(shí)現(xiàn)倒計(jì)時(shí) 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaScript 數(shù)組常見操作技巧 (二)

    JavaScript 數(shù)組常見操作技巧 (二)

    這篇文章主要介紹了JavaScript 數(shù)組常見操作技巧,上一篇文章已經(jīng)給大家分享了(一),下面緊接上一篇文章分享下面技巧,需要的小伙伴可以參考一下
    2022-02-02
  • JavaScript 亂碼問題

    JavaScript 亂碼問題

    在用js寫網(wǎng)頁時(shí),如果html等內(nèi)容全部用document.write輸出,包括<html>、<meta等標(biāo)簽,當(dāng)嵌套時(shí),會(huì)出現(xiàn)輸出內(nèi)容為亂碼的問題
    2009-08-08
  • javascript實(shí)現(xiàn)驗(yàn)證IP地址等相關(guān)信息代碼

    javascript實(shí)現(xiàn)驗(yàn)證IP地址等相關(guān)信息代碼

    本文給大家分享的是一組判斷IP地址是否合法,判斷子網(wǎng)掩碼是否合法,驗(yàn)證輸入的網(wǎng)關(guān)地址是否合法的javascript代碼,十分的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下。
    2015-05-05
  • js prototype深入理解及應(yīng)用實(shí)例分析

    js prototype深入理解及應(yīng)用實(shí)例分析

    這篇文章主要介紹了js prototype深入理解及應(yīng)用,結(jié)合實(shí)例形式分析了JavaScript prototype屬性功能、原理、使用方法及操作注意事項(xiàng),需要的朋友可以參考下
    2019-11-11
  • js 調(diào)用百度分享功能

    js 調(diào)用百度分享功能

    本文主要介紹了js調(diào)用百度分享功能的方法,具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-02-02
  • 微信小程序入門教程

    微信小程序入門教程

    本篇文章主要介紹了微信小程序入門教程,現(xiàn)在分享給大家,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2016-11-11
  • Openlayers學(xué)習(xí)之加載鷹眼控件

    Openlayers學(xué)習(xí)之加載鷹眼控件

    這篇文章主要介紹了Openlayers學(xué)習(xí)之加載鷹眼控件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • JavaScript?getter?setter金字塔???????

    JavaScript?getter?setter金字塔???????

    這篇文章主要介紹了JavaScript?getter?setter金字塔???????,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • Typescript文件被識(shí)別為視頻的問題解決

    Typescript文件被識(shí)別為視頻的問題解決

    這篇文章主要為大家介紹了Typescript文件被識(shí)別為視頻的問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 微信小程序?qū)崿F(xiàn)蒙版彈出窗功能

    微信小程序?qū)崿F(xiàn)蒙版彈出窗功能

    這篇文章主要介紹了微信小程序?qū)崿F(xiàn)蒙版彈出窗功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09

最新評(píng)論

巴彦淖尔市| 哈密市| 台东县| 鄂托克前旗| 建始县| 红安县| 陵水| 塔城市| 沐川县| 青州市| 西青区| 登封市| 乌拉特后旗| 隆化县| 佛山市| 肥乡县| 分宜县| 墨竹工卡县| 三河市| 常州市| 汨罗市| 中卫市| 台南县| 汝南县| 西昌市| 兴义市| 奉化市| 婺源县| 钦州市| 永济市| 盈江县| 德庆县| 巨鹿县| 益阳市| 沙河市| 郁南县| 方正县| 罗平县| 山阴县| 高唐县| 万州区|