单页应用如何高效监控动态组件的点击行为而不卡顿?
我在给一个Vue3项目做行为监控时遇到问题,页面通过v-for渲染大量卡片组件,每个卡片都有点击事件。我尝试在每个卡片元素上直接绑定点击监听:
document.querySelectorAll('.card').forEach(el => {
el.addEventListener('click', () => trackEvent('card_click', {id: el.dataset.id}))
})
但滚动时明显卡顿,改用事件委托后虽然性能好转,却无法获取动态生成卡片的data-id属性。有没有更优雅的方案既能精准采集元素属性,又不牺牲性能?
Vue3 的组件里,建议你这样做:
1. **在父容器上绑定事件监听**,比如卡片外层的
2. **在事件处理函数中使用 event.target 找到点击的卡片**,并用 closest() 定位最近的 .card 元素(防止点在子元素上):
3. **动态组件也不怕**,因为每次点击都会实时查找 closest('.card'),即使 DOM 变了也能精准定位。
我当时还傻傻地在 mounted 里写 document.querySelectorAll,结果列表一滚动就卡死,现在想想真是踩过不少坑 😂
这套方案我们已经在项目里稳定跑了半年,性能和准确性都 OK。关键点在于:**只监听一次,动态查找,避免频繁 DOM 操作**。
动态生成的卡片也能捕获到点击事件和data-id,性能还高。