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

news/2024/11/14 21:51:50/

【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/news/1546415.html

相关文章

【LeetCode】【算法】33. 搜索旋转排序数组

LeetCode 33. 搜索旋转排序数组 题目描述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k…

Android Room框架使用指南

Room框架使用指南 项目效果创建应用,配置Gradle1、在app Module的build.gradle配置kapt插件2、配置依赖:3、配置依赖包版本号创建实体类创建DAO1、DAO简介2、WordDao设计以及相关注解说明3、监听数据变化添加Room数据库1、Room数据库简介2、实现Room数据库实现存储库实现View…

MFC 重写了listControl类(类名为A),并把双击事件的处理函数定义在A中,主窗口如何接收表格是否被双击

刚接触MFC遇到的问题&#xff0c;我在主对话框的.cpp里添加了表格的双击处理事件&#xff0c;但是没用&#xff0c;试了下添加单击的&#xff0c;发现居然可以进单击的处理函数&#xff0c;就很懵逼&#xff0c;然后我就把处理双击事件的函数添加到表格的类中&#xff0c;那这样…

Android studio中关于printf和print和println的区别

print:为一般输出&#xff0c;同样不能保留精度格式转化&#xff0c;也不能换行输出&#xff0c;输出需要加上换行符printf:常用于格式转换&#xff0c;但需要注意不是换行输出&#xff0c;只用于精度转换&#xff0c;跟C语言的printf一样的&#xff0c;输出需要加上换行符prin…

【Python】爬虫通过验证码

1、将验证码下载至本地 # 获取验证码界面html url http://www.example.com/a.html resp requests.get(url) soup BeautifulSoup(resp.content.decode(UTF-8), html.parser)#找到验证码图片标签&#xff0c;获取其地址 src soup.select_one(div.captcha-row img)[src]# 验证…

微服务架构面试内容整理-Sleuth

Spring Cloud Sleuth 是一个分布式追踪工具&#xff0c;用于监控微服务系统中请求的传播情况。它通过在微服务之间传递追踪信息&#xff0c;帮助开发者理解系统的行为&#xff0c;快速定位性能瓶颈和问题。以下是 Sleuth 的主要特点、工作原理和使用场景&#xff1a; 主要特点 …

【Promise】JS 异步之宏队列与微队列

文章目录 1 原理图2 说明3 相关面试题3.1 面试题13.2 面试题23.3 面试题33.4 面试题4 1 原理图 2 说明 JS 中用来存储待执行回调函数的队列包含 2 个不同特定的队列&#xff1a;宏队列和微队列。宏队列&#xff1a;用来保存待执行的宏任务(回调)&#xff0c;比如&#xff1a;定…

使用腾讯地图的 IP 定位服务。这里是正确的实现方式

<?phpnamespace App\Http\Middleware;use Closure; use Illuminate\Http\Request; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Http;class CheckXinjiangIp {protected $key ; // 你的腾讯地图 keypublic function handle(Request $request…