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);
    });
})
相关推荐
a11177641 分钟前
图书借阅管理系统(FastAPI + Vue)
前端·vue.js·fastapi
常年游走在bug的边缘1 小时前
掌握JavaScript作用域:从函数作用域到块级作用域的演进与实践
开发语言·前端·javascript
极致♀雨1 小时前
vue2+elementUI table表格勾选行冻结/置顶
前端·javascript·vue.js·elementui
林shir1 小时前
3-15-前端Web实战(Vue工程化+ElementPlus)
前端·javascript·vue.js
zhaoyin19942 小时前
Fiddler弱网实战
前端·测试工具·fiddler
换日线°3 小时前
前端炫酷展开效果
前端·javascript·vue
夏幻灵4 小时前
过来人的经验-前端学习路线
前端
CappuccinoRose4 小时前
React框架学习文档(七)
开发语言·前端·javascript·react.js·前端框架·reactjs·react router
FFF-X4 小时前
前端字符串模糊匹配实现:精准匹配 + Levenshtein 编辑距离兜底
前端
Hi_kenyon4 小时前
Ref和Reactive都是什么时候使用?
前端·javascript·vue.js