You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React-Idle-Timer如何实现剩余时间逐秒静态倒计时展示

解答

完全可以实现无需用户操作触发的逐秒剩余时间倒计时展示。

官方示例只在事件回调中读取剩余时间,本质是因为回调触发时才会执行对应逻辑,只要添加定时轮询逻辑持续读取剩余时间、更新组件状态,就能实现页面静态区域的逐秒刷新倒计时。

实现步骤

  • 新增组件本地状态存储实时剩余时间
  • 组件挂载后启动1秒间隔的定时器,每秒调用一次getRemainingTime()获取最新值更新状态
  • 在组件卸载、用户进入空闲状态时清除定时器,避免内存泄漏和无效计算
  • 对拿到的毫秒级剩余时间做格式化,直接渲染到页面对应位置即可

完整可运行代码

import React, { useState, useEffect, useRef } from 'react'
import { useIdleTimer } from 'react-idle-timer'
import App from './App'

export default function (props) {
  const [remainingTime, setRemainingTime] = useState(0)
  const timerRef = useRef(null)

  const handleOnIdle = event => {
    console.log('user is idle', event)
    console.log('last active', getLastActiveTime())
    // 进入空闲状态后停止倒计时更新
    if (timerRef.current) clearInterval(timerRef.current)
  }

  const handleOnActive = event => {
    console.log('user is active', event)
    // 用户回到活跃状态时重启倒计时
    startCountdown()
  }

  const handleOnAction = event => {
    console.log('user did something', event)
  }

  const { getRemainingTime, getLastActiveTime } = useIdleTimer({
    timeout: 1000 * 60 * 15,
    onIdle: handleOnIdle,
    onActive: handleOnActive,
    onAction: handleOnAction,
    debounce: 500
  })

  const startCountdown = () => {
    // 先清除已有定时器,避免重复创建
    if (timerRef.current) clearInterval(timerRef.current)
    // 初始化时立刻同步一次剩余时间
    setRemainingTime(getRemainingTime())
    // 启动每秒更新
    timerRef.current = setInterval(() => {
      setRemainingTime(getRemainingTime())
    }, 1000)
  }

  useEffect(() => {
    startCountdown()
    // 组件卸载时清理定时器
    return () => {
      if (timerRef.current) clearInterval(timerRef.current)
    }
  }, [])

  // 格式化时间为 分:秒 格式,可按需调整为小时/天等单位
  const formatRemainingTime = (ms) => {
    const totalSec = Math.floor(ms / 1000)
    const minutes = Math.floor(totalSec / 60)
    const seconds = totalSec % 60
    return `${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`
  }

  return (
    <div>
      {/* 逐秒刷新的倒计时展示位 */}
      <p>距离超时自动空闲剩余:{formatRemainingTime(remainingTime)}</p>
      <App />
    </div>
  )
}

简化写法(适用于v5.0及以上版本)

如果你使用的是5.0以上版本的react-idle-timer,钩子本身已经内置了响应式的剩余时间返回值,不需要自行编写定时器逻辑,直接解构使用即可:

const { remainingTime } = useIdleTimer({
  timeout: 1000 * 60 * 15,
  onIdle: handleOnIdle,
  onActive: handleOnActive,
  onAction: handleOnAction,
  debounce: 500
})
// 直接在JSX中使用remainingTime,值会自动逐秒更新

内容的提问来源于stack exchange,提问作者gene b.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.22 16:15:00