浏览器tab切换最小化,当前页面无操作刷新页面

6 篇文章 0 订阅
/* eslint-disable react-hooks/exhaustive-deps */
import React, {useState, useEffect} from 'react'

// 可见状态下的延迟
const visibleDelay = 3000
// 不可见状态下的延迟
const invisibleDelay = 1000
// 触发刷新定时器执行次数
const timerTimes = 2

const App = () => {
  // 是否触发事件
  const [isEventActive, setIsEventActive] = useState(false)
  // 计时器id
  // const [timerId, setTimerId] = useState(null)
  // 计时器操作序号
  const [timerNumber, setTimerNumber] = useState(1)
  // 延迟时间
  const [delayTime, setDelayTime] = useState(document.visibilityState === 'hidden' ? invisibleDelay : visibleDelay)
  // 时间戳
  // const [timestamp, setTimestamp] = useState(new Date().getTime())

  // 触发事件后初始化
  const initTimer = () => {
    setIsEventActive(true)
    setTimerNumber(1)
  }
  // 定时器顺序执行操作
  const timerOrder = () => {
    if (timerNumber < timerTimes) {
      console.warn(`第${timerNumber}次无操作, 请尽快操作页面, ${timerTimes}次后将刷新页面`)
      // 定时器回调函数可以完美地在每次触发的时候给React发送c => c + 1更新指令。
      setTimerNumber(c => c + 1)
    } else {
      console.log('刷新')
      window.location.reload()
    }
  }

  const reloadPage = () => {
    const isVisible = !(document.visibilityState === 'hidden')
    // console.log(isVisible, isEventActive, timerNumber)
    const timer = setTimeout(() => {
      // 可见状态下,当前页面2个30分钟无操作
      if (!isEventActive && isVisible && timerNumber) {
        timerOrder()
      } else if (!isVisible) {
        // 不可见状态下
        timerOrder()
      } else {
        // 可见状态下有操作, initTimer后状态为true,此时设置状态为false,重新渲染计时
        setIsEventActive(false)
        timer && clearTimeout(timer)
      }
    }, delayTime)
    // console.log('reload', timer)
    return timer
  }

  useEffect(() => {
    const timerId = reloadPage()
    // 返回一个清除定时器函数, 清除函数会在组件卸载前执行,执行当前effect前对上一个effect进行清除  
     return () => clearTimeout(timerId)
  }, [isEventActive, timerNumber, delayTime])


  useEffect(() => {
    // 浏览器切换事件
    document.addEventListener('visibilitychange', () => {
      // 状态判断
      if (document.visibilityState === 'hidden') {
        // 设置不可见状态下的延时
        setDelayTime(invisibleDelay)
        initTimer()
      } else {
        // 设置可见状态下的延时
        setDelayTime(visibleDelay)
        initTimer()
      }
    })

    document.addEventListener('mousedown', () => {
      initTimer()
    })
    document.addEventListener('mousemove', () => {
      initTimer()
    })
    document.addEventListener('keypress', () => {
      initTimer()
    })
    // initTimer()
  }, [])

  return (
    <button>test</button>
  )
}


export default App

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在网页中使用Tab切换时,可以使用JavaScript来实现不刷新页面的效果。具体实现方式如下: 1. 首先,在HTML中添加一个tab切换的容器,比如使用ul和li组成的标签结构。 2. 在JavaScript中,监听每个tab的点击事件,当点击某个tab时,隐藏其他tab的内容,显示当前tab的内容。 3. 使用CSS来控制tab内容的显示和隐藏,可以使用display:none属性来隐藏内容,使用display:block属性来显示内容。 下面是一个简单的例子: HTML代码: ```html <ul class="tab"> <li class="active">Tab1</li> <li>Tab2</li> <li>Tab3</li> </ul> <div class="tab-content"> <div class="tab-pane active">Tab1 Content</div> <div class="tab-pane">Tab2 Content</div> <div class="tab-pane">Tab3 Content</div> </div> ``` CSS代码: ```css .tab-content .tab-pane { display: none; } .tab-content .active { display: block; } ``` JavaScript代码: ```javascript var tabs = document.querySelectorAll('.tab li'); var tabContents = document.querySelectorAll('.tab-content .tab-pane'); for (var i = 0; i < tabs.length; i++) { tabs[i].addEventListener('click', function(e) { e.preventDefault(); var tabId = this.getAttribute('data-tab'); for (var j = 0; j < tabContents.length; j++) { if (tabContents[j].getAttribute('data-tab') == tabId) { tabContents[j].classList.add('active'); } else { tabContents[j].classList.remove('active'); } } for (var k = 0; k < tabs.length; k++) { if (tabs[k].getAttribute('data-tab') == tabId) { tabs[k].classList.add('active'); } else { tabs[k].classList.remove('active'); } } }); } ``` 在这个例子中,我们通过JavaScript监听每个tab的点击事件,并根据点击的tab来显示对应的内容。同时,使用CSS控制tab内容的显示和隐藏,从而实现无刷新tab切换效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值