react 处理滚动事件更新UI卡顿的问题

2023-03-20 晚上前端 137 次浏览2条评论

前言

今天接到一个需求,要求随着页面向下滚动,上方的搜索组件背景颜色从透明逐渐转为白色。

具体的实现思路就是通过监听页面元素的滚动高度,让搜索组件的透明度随之变化。

但是实现后发现过渡效果有很明显的卡顿感,本文将介绍此问题的解决方法。

解决方法

搜索组件,这里主要就是控制背景颜色的透明度。

<div
	style={{
        background: `rgba(255,255,255,${opacity})`
  	}}
  > ... </div>

优化前的逻辑,渐变效果有很明显的卡顿。

// 顶部搜索透明度0-1
const [opacity, setOpacity] = useState(0)
// 监听滚动事件
useEffect(() => {
    document.addEventListener('scroll', () => {
      setOpacity(opacity => window.scrollY / 70)
    })
}, [])

优化后的逻辑,渐变效果非常顺滑。

// 顶部搜索透明度0-1
const [opacity, setOpacity] = useState(0)
// 页面滚动
const handleScroll = () => {
	setOpacity(window.scrollY / 70)
};
// 添加监听事件
useEffect(() => {
	document.addEventListener('scroll', () => handleScroll());
	return () => document.removeEventListener('scroll', handleScroll);
}, []);

排查后发现,每次加载这个页面时都会给 document 添加滚动事件。导致的结果就是随着页面加载次数的增多,效果也变得越来越卡。

解决方法就是给 useEffect 添加一个清除函数,这样每次重新加载页面时,会把之前的滚动事件清除掉,再重新进行事件的添加。

这样就能保证页面始终都只有一个滚动监听事件,问题也随之解决。


目录

解决方法
ICP备案号:鲁ICP备2020040322号