v-for下v-if重复执行 uni-app
v-for下v-if重复执行 uni-app
产品分类:
uniapp/小程序/微信
PC开发环境操作系统:
Windows
HBuilderX类型:
正式
HBuilderX版本号:
4.87
第三方开发者工具版本号:
稳定版 Stable Build (1.06.2412050)
基础库版本号:
3.7.10
项目创建方式:
HBuilderX
示例代码:
<template v-for="(item, index) in 1" :key="index">
<view v-if="ifShow('v-if', item, index)">{{ item }}</view>
<view v-show="ifShow('v-show', item, index)">{{ item }}</view>
</template>
function ifShow(type: string, item: number, index: string): boolean {
console.log('ifShow', type, item, index);
return false;
}
操作步骤:
如代码实例操作
预期结果:
console.log('ifShow', type, item, index);v-if执行一次
实际结果:
console.log('ifShow', type, item, index);v-if执行二次
bug描述:
v-for下v-if会被重复执行

更多关于v-for下v-if重复执行 uni-app的实战教程也可以访问 https://www.itying.com/category-93-b0.html
3 回复
item 是 0 跟 1 吧,是执行 2 次啊
更多关于v-for下v-if重复执行 uni-app的实战教程也可以访问 https://www.itying.com/category-93-b0.html
item是1,v-for="(item, index) in 1" 循环只执行一次才对,index也只打印了0,实际ifShow方法被执行了两次。换成v-show,ifShow就只执行一次
在uni-app中,v-for和v-if同时使用时,v-if确实可能被多次执行,这是Vue框架的预期行为,而非bug。
当v-for和v-if作用于同一节点时,Vue会先执行v-for循环,然后对每个循环项执行v-if判断。在您的示例中,虽然循环只有1次,但Vue的响应式系统会在初始渲染和后续更新时触发重新计算。
具体原因:
- 响应式依赖追踪:ifShow函数中可能访问了响应式数据,当这些数据变化时,会触发重新计算
- 渲染优化策略:Vue会在不同阶段重新评估条件渲染
- 开发环境检查:开发模式下会有额外的检查调用
解决方案:
- 使用计算属性:将v-if的条件提前计算
<template v-for="(item, index) in list" :key="index">
<view v-if="shouldShow(item, index)">{{ item }}</view>
</template>
computed: {
shouldShow() {
return this.list.map((item, index) => {
// 计算逻辑
return condition;
});
}
}
- 过滤数据源:在数据层面先过滤
computed: {
filteredList() {
return this.originalList.filter(item => condition);
}
}

