React滚动百分比指示器数值跳变怎么办?
我在做页面滚动指示功能时遇到了问题,当快速滚动时百分比数值会突然跳变,不太流畅。我尝试用window.scrollY除以文档高度计算,但感觉响应不及时。
这是我的组件代码:
import { useState, useEffect } from 'react';
function ScrollIndicator() {
const [scrollPercent, setScroll] = useState(0);
useEffect(() => {
const handleScroll = () => {
const scrollY = window.scrollY;
const height = document.documentElement.scrollHeight - window.innerHeight;
const percent = (scrollY / height) * 100;
setScroll(percent);
};
window.addEventListener('scroll', handleScroll);
return () => window.removeEventListener('scroll', handleScroll);
}, []);
return <div>滚动了{scrollPercent.toFixed(0)}%</div>;
}
export default ScrollIndicator;
测试时发现数值会在快速滚动时出现0.5秒左右的延迟,而且当内容高度变化时计算结果会突然跳变。请问这种情况下应该怎么优化?是不是应该用requestAnimationFrame?
直接给你个优化方案,用requestAnimationFrame配合节流就行,别自己重复造轮子了:
关键点就是那个ticking锁,防止连续触发。另外记得处理下分母为0的情况,不然页面特别短的时候会NaN。如果你项目里用了lodash,直接debounce也行,但raf是最准的,跟浏览器重绘节奏一致。
要是还不放心,插件可以用react-use里的useScrollPercentage,封装好了边界处理。不过你这个需求其实没必要引入依赖,上面改法就够用了。