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

使用Vue封裝一個可隨時暫停啟動無需擔心副作用的定時器

 更新時間:2024年11月13日 11:54:18   作者:yulamz  
這篇文章主要為大家詳細介紹了如何使用Vue封裝一個可隨時暫停啟動無需擔心副作用的定時器,感興趣的小伙伴可以跟隨小編一起學習一下

現(xiàn)成輪子:VueUse 庫的 useIntervalFn 方法

是什么?

創(chuàng)建定時器的組合式函數(shù)

為什么要用它?

定時執(zhí)行回調(diào)(入?yún)?;回調(diào)函數(shù)、時間間隔、配置項)

控制定時器的行為(返回:開始、暫停定時器的方法)

響應式間隔(入?yún)⒌臅r間間隔可以是一個 響應式引用ref 或者一個函數(shù),當它的值改變,定時器會自動更新其間隔時間,無需手動重啟定時器)

立即執(zhí)行選項(入?yún)?options.immediate 控制 是否在初始化時立即啟動定時器;入?yún)?options.immediateCallback 控制是否在調(diào)用resume方法猴立即執(zhí)行一次回調(diào)函數(shù))

怎么用?

官網(wǎng)有說怎么安裝依賴,就不過多解釋:https://vueuse.org/shared/useIntervalFn/

分析源碼 & 自己手寫一個

源碼

https://github1s.com/vueuse/vueuse/blob/main/packages/shared/useIntervalFn/index.ts

自己手寫

安裝vue-demi依賴后,就可以開始手寫啦~

import type { ComputedRef, Ref, ShallowRef, WritableComputedRef } from 'vue-demi'
import { getCurrentScope, isRef, onScopeDispose, ref, unref, watch } from 'vue-demi'

/**
 * Void函數(shù)
 */
export type Fn = () => void

/**
 * 任意函數(shù)
 */
export type AnyFn = (...args: any[]) => any

/**
 * 它可能是一個 ref 對象,或者一個普通的值
 */
export type MaybeRef<T = any> =
| T
| Ref<T>
| ShallowRef<T>
| WritableComputedRef<T>

/**
 * 它可能是一個 ref 對象,或者一個普通的值,或者一個 getter 函數(shù)
 * @param cb 
 * @param interval 
 */
export type MaybeRefOrGetter<T = any> = MaybeRef<T> | ComputedRef<T> | (() => T)

/**
 * 獲取值、ref 或 getter 的實際值
 */
export function toValue<T>(r: MaybeRefOrGetter<T>): T {
  return typeof r === 'function' ? (r as AnyFn)() : unref(r)
}

/***
 * 是否為客戶端
 */
export const isClient = typeof window !== 'undefined' && typeof document !== 'undefined'

/**
 * 是否處于一個 Vue 3 的響應式 effect 生命周期的作用域內(nèi)。如果是的話,它會注冊一個清理函數(shù)(fn 參數(shù)),該函數(shù)會在作用域結束時執(zhí)行;如果不是在這樣的作用域內(nèi),那么它將不做任何操作。
 * @param fn 
 */
export function tryOnScopeDispose(fn: Fn) {
  if (getCurrentScope()) {
    onScopeDispose(fn)
    return true
  }
  return false
}


export interface UseIntervalOptions {
  /**
   * 立即執(zhí)行這個定時器
   */
  immediate?: boolean
  /**
   * 在調(diào)用 resume 函數(shù)后,立即執(zhí)行回調(diào)函數(shù)
   */
  immediateCallback?: boolean
}

export interface Pausable {
  /**
   * 一個 ref 表示 pausable 實例是否處于活動狀態(tài)
   */
  isActive: Readonly<Ref<boolean>>
  /**
   * 暫停定時器
   */
  pause: Fn
  /**
   * 恢復定時器
   */
  resume: Fn
}

export function useIntervalFn(cb: Fn, interval: MaybeRefOrGetter<number> = 1000, options: UseIntervalOptions = {}): Pausable {
  const {
    immediate = true,
    immediateCallback = true
  } = options

  let timer: ReturnType<typeof setInterval> | null = null
  const isActive = ref(false)

  function clean() {
    if (timer) {
      clearInterval(timer)
      timer = null
    }
  }

  function pause() {
    isActive.value = false
    clean()
  }

  function resume() {
    const intervalValue = toValue(interval)
    if (intervalValue <= 0) {
      return
    }
    isActive.value = true

    if (immediateCallback){
      cb()
    }

    clean()

    if (isActive.value) {
      timer = setInterval(cb, intervalValue)
    }
  }

  
  if (immediate && isClient) {
    resume()
  }

  if (isRef(interval) || typeof interval === 'function') {
    const stopWatch = watch(interval, () => {
      if (isActive.value && isClient) {
        resume()
      }
    })
    tryOnScopeDispose(stopWatch)
  }

  tryOnScopeDispose(pause)

  return {
    isActive,
    pause,
    resume
  }
}

到此這篇關于使用Vue封裝一個可隨時暫停啟動無需擔心副作用的定時器的文章就介紹到這了,更多相關Vue封裝定時器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • vue自定義指令添加跟隨鼠標光標提示框v-tooltip方式

    vue自定義指令添加跟隨鼠標光標提示框v-tooltip方式

    這篇文章主要介紹了vue自定義指令添加跟隨鼠標光標提示框v-tooltip方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Vue之Axios異步通信詳解

    Vue之Axios異步通信詳解

    這篇文章主要為大家介紹了Vue之Axios異步通信,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • Vue.js之$emit用法案例詳解

    Vue.js之$emit用法案例詳解

    這篇文章主要介紹了Vue.js之$emit用法案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • vue使用driver.js完成頁面引導功能的示例詳解

    vue使用driver.js完成頁面引導功能的示例詳解

    在Vue中,driver.js通常是指用于實現(xiàn)用戶引導和教程功能的JavaScript庫,它可以幫助開發(fā)者在應用程序中創(chuàng)建交互式的引導和教程,以引導用戶了解應用程序的不同功能和界面,本文就簡單的給大家介紹一下vue如何使用driver.js完成頁面引導功能
    2023-08-08
  • 詳解vue2與vue3獲取模版引用ref的區(qū)別

    詳解vue2與vue3獲取模版引用ref的區(qū)別

    這篇文章主要為大家詳細介紹了vue2與vue3中獲取模版引用ref的方法與區(qū)別,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-10-10
  • Vue 3 中 toRaw 的用法詳細講解

    Vue 3 中 toRaw 的用法詳細講解

    `toRaw` 是 Vue3 提供的一個 API,用于獲取響應式對象的原始非響應式對象,主要用于調(diào)試、與第三方庫兼容以及避免無限遞歸更新等場景,使用時需要注意不要濫用,以免破壞響應式系統(tǒng),感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • 詳解Vue與VueComponent的關系

    詳解Vue與VueComponent的關系

    這篇文章主要為大家介紹了Vue與VueComponent的關系,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • Vue+Websocket簡單實現(xiàn)聊天功能

    Vue+Websocket簡單實現(xiàn)聊天功能

    這篇文章主要為大家詳細介紹了Vue+Websocket簡單實現(xiàn)聊天功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 基于Vue實現(xiàn)一個textarea幽靈建議功能

    基于Vue實現(xiàn)一個textarea幽靈建議功能

    不知道你有沒有發(fā)現(xiàn)Bing AI聊天有個輸入提示功能,在用戶輸入部分內(nèi)容時后面會給出灰色提示文案,用戶只要按下tab鍵就可以快速添加提示的后續(xù)內(nèi)容,我將這個功能稱為幽靈建議,接下來我將用Vue框架來實現(xiàn)這個功能,需要的朋友可以參考下
    2023-09-09
  • vue2筆記 — vue-router路由懶加載的實現(xiàn)

    vue2筆記 — vue-router路由懶加載的實現(xiàn)

    本篇文章主要介紹了vue2筆記 — vue-router路由懶加載示例,實例分析了vue-router路由懶加載的實現(xiàn),具有一定參考借鑒價值,需要的朋友可以參考下
    2017-03-03

最新評論

贞丰县| 灌云县| 贡山| 岑巩县| 墨脱县| 荣昌县| 桃园县| 湟源县| 海南省| 宁乡县| 江油市| 浦城县| 如皋市| 乐亭县| 隆昌县| 奉化市| 奇台县| 垦利县| 英吉沙县| 科技| 图木舒克市| 阳信县| 澳门| 高要市| 吉安市| 吐鲁番市| 南宁市| 罗山县| 永仁县| 城市| 台前县| 宝清县| 周宁县| 曲靖市| 凤山市| 陈巴尔虎旗| 合水县| 武乡县| 江源县| 宜春市| 郎溪县|