v-for和v-if同时使用时的问题:

167 阅读1分钟

当在同一个标签上同时使用 v-for 和 v-if 时,可能会导致意外的结果或错误。这是因为Vue的编译规则中,v-for 比 v-if 优先级更高,意味着 v-for 会先执行,然后 v-if 根据条件进行渲染或移除子元素。

在某些情况下,使用 v-for 和 v-if 在同一个标签上可能会导致逻辑混乱或不符合预期的结果。

为了避免这种问题,可以考虑以下几种解决方案:

  1. 将 v-for 和 v-if 放在不同的元素上 如:父标签。这样可以更清晰地表达每个指令的作用,并降低出错的概率。

  2. 使用计算属性或方法:将条件逻辑移至计算属性或方法中,在模板中使用这些计算属性或方法来实现需要的渲染逻辑。这样可以将 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>

页面显示结果:

image.png