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

ops/2024/11/14 6:19:35/

【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/ops/133058.html

相关文章

C语言初阶必会的练习题(3)之位操作符(^ 、、>>等)的应用

C语言初阶必会的练习题&#xff08;3&#xff09; 放在最前面的1、不允许创建临时变量&#xff0c;交换两个整数的内容1.1、分析&#xff1a;见代码注释&#xff08;a&#xff09;方法 1&#xff08;b&#xff09;方法 2 1.2、结果展示方法 1 的 结果&#xff1a;方法 2 的 结果…

Kafka高频面试题详解(consumer端)

1、消费者组和分区数之间的关系是怎样的&#xff1f; 消费者组内每个消费者负责消费不同分区的数据&#xff0c;一个分区只能由一个组内消费者消费 消费者组之间互不影响&#xff0c;所有的消费者都属于某个消费者组&#xff0c;即消费者组是逻辑上的一个订阅者 2、kafka如何知…

el-table 纵向垂直表头处理

项目中表格展示会遇到需要纵向垂直表头情况&#xff0c;下面&#xff0c;我们基于el-table组件来实现这种表格。 以下是这次需要用到的数据表格&#xff0c;已知左侧违章名称是固定的&#xff0c;而月份是不固定的&#xff0c;在后端返回数据格式已确定的情况下&#xff0c;需…

在心理学研究中实施移动眼动追踪:实用指南

摘要 眼动追踪提供了直接的、时间和空间敏感的眼球注视测量。它能够捕捉从婴儿期到成年期的视觉注意模式。然而&#xff0c;常用的基于屏幕的眼动追踪(SET)方法在描绘个体如何在“现实生活”中与环境互动时的信息处理上存在局限性。移动眼动追踪(MET)记录参与者在主动行为背景…

kafka的安装与使用

目录 一、 简介 1.1、概念 1.2、核心成员 1.3、特点 二、安装 2.1、zookeeper 2.2、上传解压重命名 2.3、修改配置文件 2.4、启动 2.5、一个启停脚本 三、使用 3.1、主题命令行操作 3.1.1查看操作主题命令参数 3.1.2创建 first topic 3.1.3查看当前服务器中的所有…

【MySQL】MySQL基础知识复习(下)

前言 上一篇博客介绍了MySQL的库操作&#xff0c;表操作以及CRUD。 【MySQL】MySQL基础知识复习&#xff08;上&#xff09;-CSDN博客 本篇将进一步介绍CRUD操作&#xff0c;尤其是查找操作 目录 一.数据库约束 1.约束类型 1.1NULL约束 1.2UNIQUE&#xff1a;唯一约束 …

lua入门教程:math

在Lua中&#xff0c;math库是一个非常重要的内置库&#xff0c;它提供了许多用于数学计算的函数。这些函数可以处理各种数学运算&#xff0c;包括基本的算术运算、三角函数、对数函数、随机数生成等。结合你之前提到的Lua中的数字遵循IEEE 754双精度浮点标准&#xff0c;我们可…

【Visual Studio系列教程】什么是 Visual Studio?

欢迎阅读本文&#xff01;这意味着你可能已经准备好开始学习如何使用 Visual Studio 进行开发。既然如此&#xff0c;我们就不多做废话&#xff0c;直接进入本系列的第1篇文章&#xff1a;《什么是 Visual Studio&#xff1f;》。 Visual Studio 是一款功能强大的开发人员工具…