vue3实现监听从其他页签回到当前页签重新刷新setInterval

你是否也有遇到过在当前页面设置了定时器,离开当前页签或者切换到其他应用之后重新回来,当前页面上的时间就会出现误差,比理论上的慢几分钟。遇到这种情况第一想法就是监听一下从其他浏览器页签回到当前页签的时机。这边简单记录一下使用document.visibilityState解决这个问题。在 Vue 3 中,你可以通过监听页面的可见性变化来实现从其他页签回到当前页签时重新刷新 setInterval。具体来说,你可以使用 document.visibilityStatevisibilitychange 事件来检测页面的可见性变化。

以下是一个示例代码,展示了如何在 Vue 3 中实现这一功能:

xml 复制代码
<template>
  <div>
    <p>当前时间: {{ currentTime }}</p>
  </div>
</template>

<script>
import { ref, onMounted, onUnmounted } from 'vue';

export default {
  setup() {
    const currentTime = ref(new Date().toLocaleTimeString());
    let intervalId = null;

    const startInterval = () => {
      intervalId = setInterval(() => {
        currentTime.value = new Date().toLocaleTimeString();
      }, 1000);
    };

    const stopInterval = () => {
      if (intervalId) {
        clearInterval(intervalId);
        intervalId = null;
      }
    };

    const handleVisibilityChange = () => {
      if (document.visibilityState === 'visible') {
        // 页面可见,重新启动定时器
        startInterval();
      } else {
        // 页面不可见,停止定时器
        stopInterval();
      }
    };

    onMounted(() => {
      // 初始启动定时器
      startInterval();

      // 监听页面可见性变化
      document.addEventListener('visibilitychange', handleVisibilityChange);
    });

    onUnmounted(() => {
      // 组件卸载时停止定时器并移除事件监听
      stopInterval();
      document.removeEventListener('visibilitychange', handleVisibilityChange);
    });

    return {
      currentTime,
    };
  },
};
</script>

代码说明:

  1. currentTime : 使用 ref 来存储当前时间,并在模板中显示。
  2. startIntervalstopInterval : 分别用于启动和停止 setInterval
  3. handleVisibilityChange: 这是一个事件处理函数,当页面的可见性发生变化时会被调用。如果页面变为可见状态,则重新启动定时器;如果页面变为不可见状态,则停止定时器。
  4. onMounted : 在组件挂载时启动定时器,并监听 visibilitychange 事件。
  5. onUnmounted : 在组件卸载时停止定时器,并移除 visibilitychange 事件监听器。

运行效果:

  • 当用户切换到其他页签时,定时器会停止。
  • 当用户回到当前页签时,定时器会重新启动,并更新当前时间。

这种方式可以有效地节省资源,避免在页面不可见时不必要的计算和渲染。

相关推荐
朱昆鹏5 小时前
开源 Claude Code + Codex + 面板 的未来vibecoding平台
前端·后端·github
lyrieek5 小时前
pgadmin的导出图实现,还在搞先美容后拍照再恢复?
前端
永远是我的最爱6 小时前
基于.NET的小小便利店前台收银系统
前端·sqlserver·.net·visual studio
从文处安6 小时前
「九九八十一难」第一难:前端数据mock指南(TS + VUE)
前端
Zhencode6 小时前
Vue3 响应式依赖收集与更新之effect
前端·vue.js
x-cmd6 小时前
[x-cmd] jsoup 1.22.1 版本发布,引入 re2j 引擎,让 HTML 解析更安全高效
前端·安全·html·x-cmd·jsoup
天下代码客6 小时前
使用electronc框架调用dll动态链接库流程和避坑
前端·javascript·vue.js·electron·node.js
weixin199701080167 小时前
【性能提升300%】仿1688首页的Webpack优化全记录
前端·webpack·node.js
冰暮流星7 小时前
javascript之数组
java·前端·javascript
晚霞的不甘7 小时前
Flutter for OpenHarmony天气卡片应用:用枚举与动画打造沉浸式多城市天气浏览体验
前端·flutter·云原生·前端框架