为什么频繁修改CSS类会导致页面卡顿?
我在React组件里根据状态切换一个元素的CSS类,但发现页面明显变卡了,尤其在低端手机上。是不是频繁操作class会影响性能?
我试过用useMemo缓存类名,也试过把动画移到transform上,但只要快速切换状态,还是会有掉帧。下面是我的简化代码:
function LoadingButton({ isLoading }) {
return (
<button className={isLoading ? 'btn loading' : 'btn'}>
{isLoading ? '加载中...' : '提交'}
</button>
);
}
是不是这种写法本身就有性能问题?有没有更高效的方式?
改className确实会触发浏览器的样式重新计算,但这通常很快。真正让你掉帧的,是你的
.loading类里面写了什么。如果里面有box-shadow、border、background这些属性的动画或者过渡效果,每次切换都会触发重绘甚至重排,低端机直接跪了。你提到用
transform,方向是对的,但关键是确保只有transform和opacity在变化,其他属性别动。还有个坑,will-change: transform记得加上,让浏览器提前开GPU加速。另外你说"快速切换状态",这个频率是多少?如果是一秒钟切换几十次那种,那问题就在你业务逻辑上了,按钮loading状态哪有疯了一样来回切的?用
requestAnimationFrame或者加个防抖限制一下切换频率。给你个优化后的写法:
JS里面也可以加个保护:
实在还想再优化,就直接操作
style属性,跳过class计算这步,不过大多数场景没必要。你先检查下CSS文件里.loading到底写了啥,把那些触发重排的属性干掉再说。