vue动态添加的元素点击后面的删除会触发多次,删除多条数据的问题

本人在开发项目中遇到一个需要动态添加表单的需求,如下图:

 可以点击下面的两个按钮分别添加不同的表单元素在页面,添加是没有问题的,如下图:

 在新添加的表单元素后面都有删除的图标,此时绑定了点击事件,删除本条元素在数组中的索引位置的一条数据,按道理说点击一次只会触发一次点击事件并且只会删除一项,但是奇怪的事情发生了,如下图左下角打印的元素索引被打印的次数,每点击一次,点击的元素的索引都会被打印两次:

 本来有8条数据,触发了两次删除事件,删除了两次数组元素中的索引为2的数据,因此数据变成了6条,但是这个效果明显不是我们需要的,这个问题困扰了我好几天,但是今天突然灵机一动,想到了一个非常简单的原因,那就是:事件冒泡

因此解决方案也就非常简单了,只需要在代码中加入:event.stopPropagation(),一行代码就可以解决,如下图再次点击时,发现就只会触发一次了,问题完美解决。

 

 感觉有用的记得点个赞哦!

Vue项目中,如果你在一个子页面的`App.vue`组件的`mounted`生命周期钩子中监听`window`对象的`message`事件,并且发现触发多次相同的事件,这通常是因为有重复的事件监听器注册了多次,或者是因为页面内部或外部代码在不断地触发`window.postMessage`方法。 要解决这个问题,你可以采取以下步骤: 1. 确保在`mounted`钩子中只添加一次事件监听器。你可以通过设置一个布尔变量来检查是否已经添加过监听器。 2. 如果你不需要在组件销毁时移除事件监听器,可以使用`Vue.nextTick`来确保DOM已经渲染完成后再添加监听器,这样可以避免由于DOM渲染导致的重复添加。 3. 检查`window.postMessage`是否被其他代码多次调用,可能是页面内部的JavaScript代码或者其他库代码。 4. 实现事件监听函数时,确保它能够处理重复的消息,并且在处理完后有适当的逻辑来防止消息的重复处理。 下面是一个基本的示例代码: ```javascript export default { data() { return { hasMounted: false, // 用于标记是否已经挂载 }; }, mounted() { if (!this.hasMounted) { this.hasMounted = true; window.addEventListener('message', this.handleMessage); } }, methods: { handleMessage(event) { // 处理消息的逻辑 console.log('Received message:', event.data); // 确保消息只处理一次,可以通过检查事件对象的特定属性来实现 // 例如,如果你使用postMessage传递JSON对象,可以检查其特定属性 if (event.data && event.data.uniqueMessageId && this.hasHandledMessage(event.data.uniqueMessageId)) { return; } this.saveHandledMessage(event.data.uniqueMessageId); // 消息处理后的逻辑 // ... }, hasHandledMessage(messageId) { // 检查是否已经处理过这条消息 // ... return false; // 假设消息未处理过 }, saveHandledMessage(messageId) { // 将处理过的消息记录下来 // ... } }, // ... }; ``` 在上述代码中,我们使用`hasMounted`变量来确保`message`事件监听器只被添加一次。同时,在`handleMessage`方法中,我们实现了消息的去重逻辑,通过检查消息是否已经处理过,来避免重复处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值