uni-app 嵌套使用v-for时,子v-for的in由一个方法返回导致父v-for的item变成错误结果
uni-app 嵌套使用v-for时,子v-for的in由一个方法返回导致父v-for的item变成错误结果
| 开发环境 | 版本号 | 项目创建方式 |
|---|---|---|
| Windows | win10 | HBuilderX |
产品分类:uniapp/小程序/微信
PC开发环境操作系统:Windows
PC开发环境操作系统版本号:win10
HBuilderX类型:正式
HBuilderX版本号:3.1.18
第三方开发者工具版本号:微信开发者工具 1.0.5.2105170
基础库版本号:2.17.3
项目创建方式:HBuilderX
### 示例代码:
```javascript
<template>
<div>
<div v-for="(item,index) in [{num:1}]" :key="index">
<div v-for="(btn,index0) in action()" @click="handleTap(item)" :key="index0">
点击显示item的值
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
list: {
$orig: { num: 1 },
l0: [2, 3]
},
}
}
},
methods: {
action() {
return [2, 3]
},
handleTap(item) {
console.log("handleTap item", item)
},
}
}
</script>
<style>
</style>
操作步骤:
点击按钮,将item的结果打印到控制台。
预期结果:
请看附件1 item的结果应该是:{ num:1 }
实际结果:
请看附件2 item的实际结果是:
{
$orig: { num: 1 },
l0: [2, 3]
}
相当于item的结果被包装进了$orig这个字段。
bug描述:
嵌套使用 v-for 的时候,子 v-for 的 in 如果由一个方法返回,父v-for的item变成了一个非预期的结果。item的结果看附件,正确的结果被包装进了$orig字段。
更多关于uni-app 嵌套使用v-for时,子v-for的in由一个方法返回导致父v-for的item变成错误结果的实战教程也可以访问 https://www.itying.com/category-93-b0.html
这个bug影响很大,请管理员务必解决
更多关于uni-app 嵌套使用v-for时,子v-for的in由一个方法返回导致父v-for的item变成错误结果的实战教程也可以访问 https://www.itying.com/category-93-b0.html
一年多了,bug还在,而且本来没这个bug的项目在新编辑器中也开始出现问题了
麻烦管理员看一下
管理员什么时候能看下这个bug吗?
管理员就不能看一眼这个大bug吗?
已处理,等待下次 alpha 版更新后会通知你。
回复 4***@qq.com: 最新 alpha 版已修复
最新 alpha 版已修复
我还是遇到了啊
回复 6***@qq.com: 说一下具体情况
这是一个典型的 uni-app 嵌套 v-for 渲染优化问题。当子级 v-for 使用函数返回值作为数据源时,uni-app 的渲染机制会对父级 item 进行特殊处理,导致数据被包装。
问题分析:
- 父级 v-for 的
item原本应该是{num:1} - 但由于子级
action()方法返回数组,uni-app 在优化渲染时对数据进行了包装 - 实际得到的 item 变成了包含
$orig字段的包装对象
解决方案:
- 避免在模板中直接调用方法 - 将数据预先计算并存储在 data 中
data() {
return {
parentList: [{num:1}],
childList: [2, 3] // 替代 action() 方法
}
}
- 修改模板引用方式
<div v-for="(item,index) in parentList" :key="index">
<div v-for="(btn,index0) in childList" @click="handleTap(item)" :key="index0">
点击显示item的值
</div>
</div>
- 如果必须使用方法,在点击事件中解构原始数据
handleTap(item) {
const originalItem = item.$orig || item
console.log("handleTap item", originalItem)
}

