当在同一个标签上同时使用 v-for 和 v-if 时,可能会导致意外的结果或错误。这是因为Vue的编译规则中,v-for 比 v-if 优先级更高,意味着 v-for 会先执行,然后 v-if 根据条件进行渲染或移除子元素。
在某些情况下,使用 v-for 和 v-if 在同一个标签上可能会导致逻辑混乱或不符合预期的结果。
为了避免这种问题,可以考虑以下几种解决方案:
-
将
v-for和v-if放在不同的元素上 如:父标签。这样可以更清晰地表达每个指令的作用,并降低出错的概率。 -
使用计算属性或方法:将条件逻辑移至计算属性或方法中,在模板中使用这些计算属性或方法来实现需要的渲染逻辑。这样可以将
v-if用在v-for循环之外或者不再使用v-if,避免可能的冲突。
<template>
<h2>直接使用v-if</h2>
<div v-if="loObj.loList.length">
<div v-for="(item, index) in loObj.loList" :key="index">
<div v-if="item.age > 1">{{ item.name }}</div>
</div>
</div>
<h2>computed 计算后的</h2>
<div v-if="filterLoList.length">
<div v-for="(item, index) in filterLoList" :key="index">
<div>{{ item.name }}</div>
</div>
</div>
</template>
<script lang="ts">
// vue3.0版本语法
import { defineComponent, ref, computed } from 'vue';
export default defineComponent({
name: "组件名",
setup() {
const loObj: any = ref({
loList: [],
})
// 模拟一个接口异步加载数据
setTimeout(() => {
loObj.value.loList = [
{
id: '11',
age: 1,
name: 's赛15分钟速通'
},
{
id: '12',
age: 2,
name: 's赛5连冠任务'
},
{
id: '13',
age: 3,
name: '单吃shy任务'
},
{
id: '14',
age: 4,
name: ''
},
]
},2000)
// vue中的computed计算属性将loList的数组进行过滤
const filterLoList = computed(() => {
return loObj.value.loList.filter((item) => {
return item.age > 1
})
})
return {
loObj,filterLoList
}
},
});
</script>