Files
vue3-element-admin/src/views/demo/data-screen/composables/useKeepTicking.ts
Ray.Hao 9cddb95fb7 refactor(views): 重组页面目录并调整路由引用
- 页面按功能归入 dashboard、login、workspace、system、demo、internal
- 数据大屏移入示例目录,错误页、内嵌页与刷新中转移入 internal
- 个人中心与我的通知移入 workspace,统一认证回调移入 login
- 应用中心移入 workspace,菜单组件值 iframe 解析到 internal/iframe
- 在线人数函数更名,未收到推送时显示占位符
2026-10-22 21:50:43 +08:00

53 lines
1.2 KiB
TypeScript

import { onMounted, onUnmounted } from "vue";
/**
* 常驻定时器:组件存活期间按固定间隔执行回调,页面隐藏时自动暂停
*
* @param callback 定时器每次触发时执行的回调
* @param interval 间隔毫秒数,默认 3000
*/
export function useKeepTicking(callback: () => void, interval = 3000) {
/** 定时器是否正在运行 */
let ticking = false;
/** 定时器标识 */
let timerId: ReturnType<typeof setInterval> | null = null;
const startTicker = () => {
if (!ticking) {
ticking = true;
timerId = setInterval(callback, interval);
}
};
const stopTicker = () => {
if (ticking) {
ticking = false;
if (timerId) clearInterval(timerId);
timerId = null;
}
};
const handleVisibilityChange = () => {
if (document.hidden) {
stopTicker();
} else {
startTicker();
}
};
onMounted(() => {
document.addEventListener("visibilitychange", handleVisibilityChange);
startTicker();
});
onUnmounted(() => {
document.removeEventListener("visibilitychange", handleVisibilityChange);
stopTicker();
});
return {
startTicker,
stopTicker,
};
}