【vue】封装一个可随时暂停启动无需担心副作用的定时器

devtools/2024/11/13 15:25:48/

【vue】封装一个可随时暂停启动无需担心副作用的定时器

  • 现成轮子:VueUse 库的 useIntervalFn 方法
    • 是什么?
    • 为什么要用它?
    • 怎么用?
  • 分析源码 & 自己手写一个
    • 源码
    • 自己手写

现成轮子:VueUse 库的 useIntervalFn 方法

是什么?

创建定时器的组合式函数

为什么要用它?

  • 定时执行回调(入参;回调函数、时间间隔、配置项)
  • 控制定时器的行为(返回:开始、暂停定时器的方法)
  • 响应式间隔(入参的时间间隔可以是一个 响应式引用ref 或者一个函数,当它的值改变,定时器会自动更新其间隔时间,无需手动重启定时器)
  • 立即执行选项(入参 options.immediate 控制 是否在初始化时立即启动定时器;入参 options.immediateCallback 控制是否在调用resume方法猴立即执行一次回调函数)

怎么用?

官网有说怎么安装依赖,就不过多解释: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函数*/
export type Fn = () => void/*** 任意函数*/
export type AnyFn = (...args: any[]) => any/*** 它可能是一个 ref 对象,或者一个普通的值*/
export type MaybeRef<T = any> =
| T
| Ref<T>
| ShallowRef<T>
| WritableComputedRef<T>/*** 它可能是一个 ref 对象,或者一个普通的值,或者一个 getter 函数* @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 生命周期的作用域内。如果是的话,它会注册一个清理函数(fn 参数),该函数会在作用域结束时执行;如果不是在这样的作用域内,那么它将不做任何操作。* @param fn */
export function tryOnScopeDispose(fn: Fn) {if (getCurrentScope()) {onScopeDispose(fn)return true}return false
}export interface UseIntervalOptions {/*** 立即执行这个定时器*/immediate?: boolean/*** 在调用 resume 函数后,立即执行回调函数*/immediateCallback?: boolean
}export interface Pausable {/*** 一个 ref 表示 pausable 实例是否处于活动状态*/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} = optionslet timer: ReturnType<typeof setInterval> | null = nullconst isActive = ref(false)function clean() {if (timer) {clearInterval(timer)timer = null}}function pause() {isActive.value = falseclean()}function resume() {const intervalValue = toValue(interval)if (intervalValue <= 0) {return}isActive.value = trueif (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}
}

http://www.ppmy.cn/devtools/133421.html

相关文章

100种算法【Python版】第50篇——Tim Sort

本文目录 1 基本原理2 主要步骤3 算法示例4 Python 实现4.1 代码说明4.2 复杂度分析Tim Sort 是一种混合排序算法,由 Tim Peters 于 2002 年为 Python 编程语言设计。它结合了插入排序和归并排序的优点,专门针对实际数据中的某些模式进行优化。Tim Sort 的核心思想是将数组分…

基于STM32设计的矿山环境监测系统(NBIOT)_262

文章目录 一、前言1.1 项目介绍【1】开发背景【2】研究的意义【3】最终实现需求【4】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】上位机开发思路1.3 项目开发背景【1】选题的意义【2】摘要【3】国内外相关研究现状【5】参考文献1.4 开发工具的选择【1】设备端开发【2】…

React 守卫路由

1.在components文件夹下新建一个Auth.js的文件&#xff0c;里面写入判断token的逻辑&#xff1a; // 导入重定向的路由模块 import { Navigate } from "react-router-dom" // 获取本地token let token window.sessionStorage.getItem(token) function Auth({childr…

Qt | QMediaPlayer+QGraphicsVideoItem视频播放器

点击上方"蓝字"关注我们 01、上节回顾 Qt | windows视频播放器小项目

Bert框架详解(下)

一、Bert模型网络结构 1、Add与Normalize Add&#xff1a;将前面的数据传到后面层&#xff0c;残差网络同理。 Normalize &#xff1a;归一化&#xff0c;与batch normalize同理。 2、outputs(shifted right) outputs&#xff08;shifted right&#xff09;&#xff1a;指在…

C++之SET容器

set 是 C STL (Standard Template Library) 中的一个关联容器。它存储唯一的元素&#xff0c;并且这些元素是自动排序的&#xff08;默认情况下为升序&#xff09;。set 内部通常实现为红黑树&#xff0c;这是一种自平衡二叉搜索树。 主要特点 唯一性&#xff1a;set 容器不允…

Intern大模型训练营(四):使用Hugging Face下载模型

1. Huggingface下载模型 首先在Huggingface平台注册账号。 然后进入https://github.com/codespaces&#xff0c;选择使用jupyter_notebook配置&#xff0c;输入以下命令流安装香瓜依赖。 # 安装transformers pip install transformers4.38 pip install sentencepiece0.1.99 …

图像处理椒盐噪声

椒盐噪声&#xff0c;也称为脉冲噪声&#xff0c;是图像中经常见到的一种噪声。它是一种随机出现的白点或者黑点&#xff0c;可能是亮的区域有黑色像素或是在暗的区域有白色像素&#xff08;或是两者皆有&#xff09;。这些白点和黑点会在图像中随机分布&#xff0c;导致图像中…