当前位置: 首页 > 知识库问答 >
问题:

react.js - 请教一个react 中页面切换到后台,定时器刷新的问题?

宗政霄
2024-08-12

需求如下: 在页面上显示服务器的时间, 每隔十分钟与服务器同步一次,在此期间,前端使用定时器进行递增显示时间,在正常情况下是可以的。但是在页面切换到后台之后,由于浏览器的机制导致定时器执行比预期的慢,页面显示回来的时候,时间已经比预期的慢一点了,

let interTimer: any = 0
let hiddTime = 0
let hasLoading = true
const GetTime = () => {
  const [time, setTime] = useState((dayjs().valueOf())
  useEffect(() => {
    loadNTPTime()
    const inters = setInterval(
      () => {
        loadNTPTime()
      },
      1000 * 60 * 10,
    )
    document.addEventListener('visibilitychange', () => {
      if (document.visibilityState === 'visible') {
        const diffTime = Math.floor((new Date().getTime() - hiddTime) / 1000)
        if (diffTime > 60 && hasLoading) {
          hasLoading = false
          loadNTPTime()
        }
      } else if (document.visibilityState === 'hidden') {
        hiddTime = new Date().getTime()
        hasLoading = true
      }
    })
    return () => {
      clearInterval(inters)
    }
  }, [])

  useEffect(() => {
    console.log(time) // 在页面切换后台后,再回来,这里不会执行了,页面也不显示更新了,但是定时器还是执行的
  }, [time])

  const loadNTPTime = async () => {
    const response = await http.get('/app/time')
    const { data } = formatResponse(response)
    if (data) {
      let millsecond = dayjs(data).valueOf()
      setTime(dayjs(data))
      if (interTimer) {
        clearInterval(interTimer)
      }
      interTimer = setInterval(() => {
        millsecond += 1000
        setTime(dayjs(millsecond))
      }, 1000)
    } else {
      setTime('--')
    }
  }
  return <div>{time}</div>
}

想通过页面切换后,重新加载服务器时间进行更新,但是无效果
最后使用了worker 进行刷新的。

共有1个答案

华宪
2024-08-12

浏览器会暂停后台标签页的脚本的执行。但是你可以监听页面进入后台和恢复前台的事件。

 类似资料:
  • 正在学习 React 不懂为什么用了 useEffect 还会发起两次请求,应该怎么解决?

  • 问题内容: 好的,我有一个仅包含的简单表格。当我们点击submit(通过ajax存储)时,在文本字段中写入的数据将存储在DB中。Ajax可以正常工作并提交数据,但是,页面会自动刷新,并且URL包含输入字段的内容。 我的表格: 阿贾克斯:- PHP的:- 结果显示在后,页面将刷新,URL变为: -chat.php?message = 454545&submit_message = 为什么要刷新页面?

  • 在我的应用程序中,用户登录后我有一个主页和一些其他页面。问题是,当我在其中一个页面中刷新页面时,它会再次将我发送到主页。这是我的路线: 应用程序组件具有路由器出口 那么,我期待什么呢?首先,如果我是我的“列表”页面()并且我刷新了这个页面,它应该留在那里。在那一页。但现在它将我重定向到本地主机:4200/home。当然,当我单击一个列表项时,它应该将我发送到本地主机:4200/detail/ite

  • 背景 前端由React构建。 后端使用Envoy作为流量网关,listeners的路由部分配置如下: Envoy将下游请求代理到由Go编写的HTTP服务器,服务器内部路由的处理如下: 问题 只要带路径,刷新浏览器就报404。 疑惑 我知道是因为React Router的原因,也知道服务器为Nginx或者httpd时的解决方案。 但通过Envoy➕Go部署时,Envoy的prefix已经将所有路径的

  • 本文向大家介绍JavaScript实现页面定时刷新(定时器,meta),包括了JavaScript实现页面定时刷新(定时器,meta)的使用技巧和注意事项,需要的朋友参考一下 接下来进入正题-定时不断刷新页面的方法: 1.看到定时,很容易想到js的定时器: 2.通过meta来设置: 以上所述是小编给大家介绍的JavaScript实现页面定时刷新(定时器,meta),希望对大家有所帮助,如果大家有任

  • 两个页面切换,如何禁止刷新呢?不借助浏览器缓存方法,比如localStorage、sessionStorage, 切换会重新刷新页面,想要的结果是第一次切换刷新后,再次切换到当前页面无需刷新,就跟antd的Tabs一样效果 比如下面两个页面,用Radio来互相切换,比如第一个ChildComponents_1页面input输入“测试”内容,切换到ChildComponents_2,再切换Child

  • 本文向大家介绍Android中使用的定时针(刷新页面请求服务器)详解,包括了Android中使用的定时针(刷新页面请求服务器)详解的使用技巧和注意事项,需要的朋友参考一下 我要在程序中用到5秒请求一下数据(不建议大家这样做,我的需求是这样) 代码展示: 1.在OnCreate中创建定时针Timer 2.在线程中创建Handler 3.创建一个标识为了做循环用 4.在case 1中做需要循环的需求(

  • 我在我的Angular 5应用程序中使用keycloak JavaScript适配器,虽然我的登录和重定向工作,但问题是每当我刷新我的ng应用程序时,它会再次要求keycloak登录,尽管我看到我的会话仍然在 /auth/realms/{image a领域名称}/帐户上处于活动状态。 正如我从KeyClope JS适配器文档中了解到的那样https://www.keycloak.org/docs/