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

如何在React中实现滚动百分比数值的实时动态渲染

问题原因

你当前的代码仅在组件首次渲染时执行一次滚动百分比计算,没有绑定滚动事件监听触发组件重渲染,因此滚动过程中React不会更新页面展示的数值,自然无法实时同步滚动进度。

修复方案

修改后的完整代码如下:

import React, { useState, useEffect } from 'react'

const App = () => {  
  const [scrollPercent, setScrollPercent] = useState(0)

  useEffect(() => {
    const getScrollPercent = () => {
      const h = document.documentElement, 
        b = document.body,
        st = 'scrollTop',
        sh = 'scrollHeight';

      const percent = Math.round((h[st]||b[st]) / ((h[sh]||b[sh]) - h.clientHeight) * 100);
      return isNaN(percent) ? 0 : percent
    }

    const handleScroll = () => {
      setScrollPercent(getScrollPercent())
    }

    // 绑定滚动监听,passive设为true提升滚动性能
    window.addEventListener('scroll', handleScroll, { passive: true })

    // 组件卸载时移除监听,避免内存泄漏
    return () => {
      window.removeEventListener('scroll', handleScroll)
    }
  }, [])

  return (
    <p>{`${scrollPercent}%`}</p>
  )
}
核心修改点
  • 新增useState存储滚动百分比数值,数值变化时会自动触发React组件重渲染
  • 通过useEffect在组件挂载时绑定全局滚动事件监听,每次滚动触发时重新计算百分比并更新状态
  • 增加组件卸载时的监听移除逻辑,避免内存泄漏
可选优化

如果担心滚动事件触发频率太高影响性能,可以给滚动回调增加节流逻辑,比如限制100ms最多执行一次计算:

// 在useEffect内定义handleScroll前加入节流逻辑
let timer = null
const throttledHandleScroll = () => {
  if (timer) return
  timer = setTimeout(() => {
    setScrollPercent(getScrollPercent())
    timer = null
  }, 100)
}
// 绑定监听的时候用throttledHandleScroll代替handleScroll即可

内容的提问来源于stack exchange,提问作者user16686016

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 06:45:03