uni-app 多级嵌套循环判断,点击事件传参错误

uni-app 多级嵌套循环判断,点击事件传参错误

开发环境 版本号 项目创建方式
Windows 22H2 HBuilderX

示例代码:

源码不能提供

操作步骤:

循环,不想说了

预期结果:

1717528885196132353

实际结果:

点击的id: undefined

bug描述:

当嵌套多层,且在某层判断类型再次循环某字段里面数组,点击事件内的值是第一个判断的值

Image Image Image


更多关于uni-app 多级嵌套循环判断,点击事件传参错误的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于uni-app 多级嵌套循环判断,点击事件传参错误的实战教程也可以访问 https://www.itying.com/category-93-b0.html


uni-app 中,如果你遇到多级嵌套循环中的点击事件传参错误,通常是因为在事件处理函数中传递的参数不正确,或者在循环中绑定的参数有误。以下是一些常见的问题和解决方案:

1. 事件处理函数传参错误

在嵌套循环中,如果你直接在事件处理函数中传递参数,可能会导致参数传递错误。例如:

<template>
  <view v-for="(item, index) in list" :key="index">
    <view v-for="(subItem, subIndex) in item.subList" :key="subIndex">
      <button @click="handleClick(item, subItem)">点击</button>
    </view>
  </view>
</template>

<script>
export default {
  data() {
    return {
      list: [
        { subList: ['A', 'B'] },
        { subList: ['C', 'D'] }
      ]
    };
  },
  methods: {
    handleClick(item, subItem) {
      console.log(item, subItem);
    }
  }
};
</script>

在这个例子中,handleClick 方法会接收到 itemsubItem 两个参数。如果你发现参数传递错误,可能是因为在循环中绑定的参数有误。

2. 使用闭包传递参数

如果你需要在事件处理函数中传递更多的参数,或者需要动态传递参数,可以使用闭包来确保参数传递正确:

<template>
  <view v-for="(item, index) in list" :key="index">
    <view v-for="(subItem, subIndex) in item.subList" :key="subIndex">
      <button @click="handleClick(item, subItem, index, subIndex)">点击</button>
    </view>
  </view>
</template>

<script>
export default {
  data() {
    return {
      list: [
        { subList: ['A', 'B'] },
        { subList: ['C', 'D'] }
      ]
    };
  },
  methods: {
    handleClick(item, subItem, index, subIndex) {
      console.log(item, subItem, index, subIndex);
    }
  }
};
</script>

在这个例子中,handleClick 方法会接收到 itemsubItemindexsubIndex 四个参数。这样可以确保在嵌套循环中传递的参数是正确的。

3. 使用 data- 属性传递参数

另一种常见的方式是使用 data- 属性来传递参数,然后在事件处理函数中通过 event.currentTarget.dataset 来获取参数:

<template>
  <view v-for="(item, index) in list" :key="index">
    <view v-for="(subItem, subIndex) in item.subList" :key="subIndex">
      <button :data-item="JSON.stringify(item)" :data-sub-item="subItem" @click="handleClick">点击</button>
    </view>
  </view>
</template>

<script>
export default {
  data() {
    return {
      list: [
        { subList: ['A', 'B'] },
        { subList: ['C', 'D'] }
      ]
    };
  },
  methods: {
    handleClick(event) {
      const item = JSON.parse(event.currentTarget.dataset.item);
      const subItem = event.currentTarget.dataset.subItem;
      console.log(item, subItem);
    }
  }
};
</script>

在这个例子中,itemsubItem 通过 data- 属性传递,然后在 handleClick 方法中通过 event.currentTarget.dataset 获取。这种方式可以避免在嵌套循环中直接传递参数时可能出现的错误。

4. 确保 key 的唯一性

在嵌套循环中,确保每个元素的 key 是唯一的,这样可以避免 Vue 在更新 DOM 时出现错误。例如:

<template>
  <view v-for="(item, index) in list" :key="index">
    <view v-for="(subItem, subIndex) in item.subList" :key="`${index}-${subIndex}`">
      <button @click="handleClick(item, subItem)">点击</button>
    </view>
  </view>
</template>

在这个例子中,key 使用了 indexsubIndex 的组合,确保每个子元素的 key 是唯一的。

5. 检查事件冒泡

如果你在嵌套循环中使用了事件冒泡,可能会导致事件处理函数被多次触发。你可以使用 event.stopPropagation() 来阻止事件冒泡:

<template>
  <view v-for="(item, index) in list" :key="index">
    <view v-for="(subItem, subIndex) in item.subList" :key="subIndex">
      <button @click="handleClick(item, subItem, $event)">点击</button>
    </view>
  </view>
</template>

<script>
export default {
  data() {
    return {
      list: [
        { subList: ['A', 'B'] },
        { subList: ['C', 'D'] }
      ]
    };
  },
  methods: {
    handleClick(item, subItem, event) {
      event.stopPropagation();
      console.log(item, subItem);
    }
  }
};
</script>
回到顶部