vue 环境下多个定时器的创建与暂停的统一封装

你也许遇到过这样的需求 有一个页面有多个展示内容(大屏页面),每个展示内容需要定时刷新,并且每个展示内容需要不同的刷新时间。 这个时候你就需要弄很多变量来控制定时器,然后切换出去页面的时候还要取消定时器,简直就是噩梦了。 所以我就写了这个定时器管理器,你只需要传入一个对象,对象中包含定时器名称,定时器回调函数,定时器间隔,就可以自动管理定时器了。

javascript 复制代码
export const useTimers = () => {
  // 存储所有定时器
  const timers = {};
  /**
   * 创建并启动定时器
   * @param {string} key - 定时器名称,用于后续管理
   * @param {Function} callback - 定时执行的回调函数
   * @param {number} interval - 执行间隔(毫秒)
   * @returns {number} 定时器ID
   */
  const startInterval = (key, callback, interval) => {
    // 先清除同名定时器,避免重复
    if (timers[key]) clearInterval(timers[key]);
    // 立即执行一次
    callback();
    // 创建新定时器
    timers[key] = setInterval(callback, interval);
    return timers[key];
  };

  /**
   * 停止并清除定时器
   * @param {string} [key] - 定时器名称,不传则清除所有定时器
   */
  const stopInterval = (key) => {
    if (key) {
      // 清除指定定时器
      if (timers[key]) {
        clearInterval(timers[key]);
        timers[key] = null;
      }
    } else {
      // 清除所有定时器
      Object.keys(timers).forEach((k) => {
        if (timers[k]) {
          clearInterval(timers[k]);
          timers[k] = null;
        }
      });
    }
  };

  // 组件卸载时自动清理所有定时器
  onBeforeUnmount(() => stopInterval());
  // 如使用keep-alive,组件失活时也清理定时器
  onDeactivated(() => stopInterval());

  return { startInterval, stopInterval, timers };
};

使用示例

javascript 复制代码
const user = {
    userList: {
        backFun: getuserList,
        time: 10000
    },
    userInfo: {
        backFun: getuserInfo,
        time: 5000
    }
}

import { useTimers } from './timeConfig';
const { startInterval, stopInterval } = useTimers();
const getuserList = () => {
    return []
}
const getuserInfo = () => {
    return {}
}

onMounted(() => {
    Object.keys(user).forEach(key => {
        startInterval(key, user[key].backFun, user[key].time);
    });
})
相关推荐
老毛肚18 分钟前
软件测试期末考试
vue.js
海兰21 分钟前
【web应用】Excel 项目数据自动化分析系统(AI 驱动分析)详细设计与部署指南(附源代码)
前端·人工智能·自动化·excel
2501_9400417425 分钟前
技术分享:高质量全栈开发提示词设计实践 —— 覆盖简单到复杂
前端·prompt
IT_陈寒1 小时前
Python的os.path.join居然能这么坑?
前端·人工智能·后端
艳阳天_.1 小时前
星瀚弹框页面实现
java·前端·python
杨若瑜1 小时前
本地开发环境慢?localhost的锅!
vue.js
EdgeOne边缘安全加速平台1 小时前
EdgeOne Web 防护×AI 升级:让 AI 既参与攻击识别,也参与误报纠错
前端·人工智能·腾讯云·edgeone
nuIl1 小时前
实现一个 Coding Agent(6):并行工具调用
前端·ai编程·cursor
Rain5091 小时前
2.1 Nest.js 项目初始化与模块化架构
开发语言·前端·javascript·后端·架构·数据分析·node.js
cjp5601 小时前
009. ASP.NET WEB API 用户关联esp32设备
前端·后端·asp.net