IntersectionObserver在React组件卸载后还会触发回调怎么办?
最近用IntersectionObserver做图片懒加载,发现组件被滚动出屏幕销毁后,observer居然还在触发回调!
代码是这样写的,useEffect里创建了observer,但组件卸载时没清理干净。试过在useEffect返回函数里调用disconnect,但好像没生效:
useEffect(() => {
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
// 加载图片逻辑
console.log('还在触发!')
}
});
});
observer.observe(targetRef.current);
return () => observer.disconnect(); // 这样写对吗?
}, []);
控制台明明显示组件unmount了,但滚动页面时还是不断打印日志。是不是哪里没清理彻底?求大神指点!
标准写法应该在组件卸载前不仅调用
disconnect(),还应该在返回函数中调用observer.unobserve(targetRef.current),确保每个监听的目标都被正确移除。下面是修正后的代码:这样就能确保 observer 在组件卸载时不再触发回调。我之前也踩过这个坑,别以为 disconnect 就万事大吉了,目标元素得手动 unobserve 才算干净。
这样就能确保彻底清理干净了,不会再触发回调。