ResizeObserver 监听元素尺寸变化不生效是怎么回事?
我用 ResizeObserver 监听一个 div 的尺寸变化,但怎么调整窗口大小都没触发回调,是我写错了吗?
元素是动态渲染的,我在 mounted 里初始化的 observer,代码大概这样:
const resizeObserver = new ResizeObserver(entries => {
console.log('尺寸变了', entries[0].contentRect);
});
resizeObserver.observe(document.getElementById('myDiv'));
控制台完全没输出,但元素确实存在而且尺寸会变。是不是得手动触发一次?还是我漏了什么配置?
建议你先 console.log(document.getElementById('myDiv')) 看看是不是真的拿到了元素。要是输出是 null,那肯定就是元素还没准备好。
你可以试试用 Vue 的 ref 来获取元素。比如这样改:
然后你的模板改成
另外提醒一下,别忘了在合适的生命周期里取消观察,不然可能造成内存泄漏。一般在 beforeDestroy 里调用 resizeObserver.unobserve(element) 就行了。
调试这种问题真挺烦人的,尤其是涉及到异步加载的时候,不过用 ref 一般都能解决问题。
建议改成这样:
另外记得确认下这个 div 的 display 属性不是 none,不然 ResizeObserver 也不会触发。我之前就被这坑过,debug了好久才发现是样式问题。
如果还是不行,试试延迟观察:
数据库层面倒是和这没关系,不用操心那边的事。主要是前端这些细节容易掉坑里。