面试官:Vue中的v-if、v-show以及v-for

286 阅读2分钟

一、v-if和v-show

v-if和v-show都是控制元素显示或者隐藏的命令,并且两者都通过赋予boolen值来进行控制。 由于v-show默认是false,因此如果不显示的话,我们优先使用v-if,因为v-if为false的时候并不会被创建,这样会节约性能。

vi-ifv-show
应用场景不频繁的切换频繁的切换
切换原理创建、销毁组件控制display的属性

二、v-for和v-if不能一起使用

在Vue中,V-for的优先级比v-if要高,因此,浏览器在执行的过程中,会优先执行V-for,将所有的数据全部都渲染出来,然后再通过v-if来计算,并将不需要的数据销毁,这样会浪费计算机的性能。因此,我们应避免这样的书写。解决方法大致分为2类:

1、当v-if的条件与v-for相关时

例如,我们在 li 标签中通过v-for来对数组 [1、2、3、4] 进行渲染,并且我们在 li 标签中使用 v-if 来控制只渲染数组中偶数的数据。此时计算机会首先渲染出4个标签,然后再销毁2个标签,比较浪费性能。对于这样的情况,我们认为 v-if 的条件与 v-for 相关,可以通过computed方法来对 v-for 的数据进行筛选,返回新的数据,从而实现 v-if 的效果。

优化前:

<template>
  <div>
    <li v-fo='item in list' v-if =' item % 2 === 0' ></li>
  </div>
</template>

<script>
export default {
  data () {
    return {
      list : [1,2,3,4]
    }
  }
}
</script>

优化后:

<template>
  <div>
    <li v-for='item in newList'></li>
  </div>
</template>

<script>
export default {
  data () {
    return {
      list : [1,2,3,4]
    }
  },
  computed:{
    newList(){
      return this.list.filter( item => item % 2 === 0 )
    }
  }
}
</script>

2、当v-if的条件与v-for无关时

例如,还是上面的例子。我们在 li 标签中通过v-for来对数组 [1、2、3、4] 进行渲染,并且我们在 li 标签中使用 v-if 来控制只渲染数组中偶数的数据,但,此时我们再定义一个布尔型的变量 flag 来控制标签的显示与否。那么,计算机会首先渲染出4个标签,然后再销毁4个标签(如果 flag 为 false),更加浪费性能。对于这样的情况,我们认为 v-if 的条件与 v-for 无关,可以通过在 li 标签外面包裹一个 template 标签,在 template 标签中设置 v-if 来实现相同的效果。这样做,在 flag 为 false 的时候,就不会再触发 v-for 来循环 li 标签。

优化前:

<template>
  <div>
     <li v-for='item in list' v-if= 'flag' ></li>
  </div>
</template>

<script>
export default {
  data () {
    return {
      list : [1,2,3,4] ,
      flag : false ,
    }
  },
}
</script>

优化后:

<template>
  <div>
    <template v-if= ' flag ' >
      <li v-for='item in list'></li>
    </template>
  </div>
</template>

<script>
export default {
  data () {
    return {
      list : [1,2,3,4] ,
      flag : false ,
    }
  },
}
</script>