# v-for 和 v-if 的优先级

** v-forv-if 一起使用时,vue 会先渲染 v-for 的元素,然后再对渲染出的元素进行 v-if 的判断。** 例如有如下数据结构,我们要将它用 v-for 进行渲染,然后再根据 id 用 v-if 判断 id 是否奇数,然后再决定是否进行显示

data(){
    return {
        human = [
            {
                id:1,
                name:'asuhe'
            },
            {
                id:2,
                name:'sphinx'
            },
            {
                id:3,
                name:'asuka'
            },
            {
                id:4,
                name:'awesome'
            },
        ]  
    }
}

# 情况 1:v-if 判断与 v-for 中的数据有关

<div v-for="item in human" :key="item.id" v-if="item.id%2 === 1">
    
</div>

当我们使用上述方式进行判断时,vue 会将四个 div 全部渲染出来,再进行 v-if 的判断。这就造成了性能损失,进行了一些不必要 div 的渲染和判断

# 解决方案

在这种情况下我们可以使用计算属性,先将符合条件的数据过滤出来,再去使用 v-for 渲染。这样就可以大幅降低性能损耗

computed:{
    person(){
        return this.human.filter(item => item.id%2 === 1 );
    }
}
<div v-for="item in person" :key="item.id">
    
</div>

这样 v-for 就不会渲染不必要的数据

# 情况 2:v-if 判断与 v-for 中的数据无关

v-for 的执行是由其它数据判断则,则可以在 v-for 的上层添加一个 v-if 先进行 v-for 的判断。然后再执行 v-for

# 解决方案

data(){
	return{
        isShow:true,
        human = [
            {
                id:1,
                name:'asuhe'
            },
            {
                id:2,
                name:'sphinx'
            },
        ]
    }
}
<div v-if="isShow">
    <div v-for="item in person" :key="item.id">
        
    </div>
</div>
更新于 阅读次数