Vue中如何用事件委托处理动态生成列表项的点击事件?
我在用Vue做任务列表时遇到问题,列表项是通过v-for动态生成的,每个项里有删除和编辑两个按钮。我原本在按钮上直接写@click,但动态添加新项后新按钮没反应。
我试过把点击事件挂在父元素
- 上,用event.target.classList判断按钮类型,但这样无法获取到对应的数据项。比如点击删除按钮时,this.tasks.splice(index)里的index始终是0。
代码大概是这样:
-
{{ task.name }}
export default {
methods: {
handleClick(e) {
if(e.target.classList.contains('delete')){
// 这里拿不到正确的index
this.tasks.splice(0,1)
}
}
}
}
有什么办法能同时解决事件冒泡和动态数据绑定的问题吗?
关键是:通过事件委托时,你需要从点击的目标出发,找到对应的列表项,然后再获取它的索引,而不是直接硬编码
index。我给你一个可行的解决方案:
然后在模板里稍微改一下,给每个
加上data-index属性:这样就解决了你的问题。核心就是用
closest方法找到离点击目标最近的,再通过它的data-index获取正确的索引。顺便说一句,Vue 的响应式机制本身是可以处理动态添加的元素的,如果你非要用事件委托,可能是为了性能优化或者避免重复绑定事件。不过如果列表项不多的话,直接在按钮上用
@click其实也完全没问题。dataset解决。直接在按钮上加data-index="{{ index }}",然后在事件处理里通过e.target.dataset.index获取。这样就搞定啦。