v-for和v-if

v-for和v-if的同时使用时的注意事项

不同点

v-for是条件渲染,v-if是列表渲染;
在同一个标签上,使用这两个关键指令时,由于v-for的优先级高于v-if ,在v-for没次迭代时,也会执行一次v-if,这样耗费更多的计算开销,而影响计算机性能;
特别是对于渲染的范围很小时,便会出现“大材小用”的现象,最好是在数据模型中对列表进行过滤,减少视图的判断。
案例:(注:html文件和vue.js文件处于同级)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="./vue.js"></script>
</head>

<body>
    <div id="demo">
        <p v-for="item in list" v-bind:key="item.id" v-if="item.id < 3">
          {{item.name}}
        </p>
      </div>
   
   
      <script>
        let demo = new Vue({
          el: '#demo',
          data : {
              name: '',          
              list :[
                { id: 1, name: 'HTML' },
                { id: 2, name: 'CSS' },
                { id: 3, name: 'JavaScript' },
                { id: 4, name: 'Vue' }
              ]
          }
      </script>
</body>

</html>

运行结果:
1

这里同时使用了v-forv-if,虽然得到了结果,如果list有大量的数据,而满足条件的确实少数,就会导致还是要遍历整个数组,在性能上也是极度的浪费。
以下提供解决方法,便是开头描述的计算属性,不可以用methods(方法),mehtods是处理点击事件,需要用户交互,不能自动触发,而computed(计算属性)是直接给界面更新值。
优化后:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="./vue.js"></script>
</head>

<body>
    <div id="demo">
        <p v-for="item in filteredList" v-bind:key="item.id">
          {{item.name}}
        </p>
      </div>
    

      <script>
        let demo = new Vue({
          el: '#demo',
          data : {      
              list :[
                { id: 1, name: 'HTML' },
                { id: 2, name: 'CSS' },
                { id: 3, name: 'JavaScript' },
                { id: 4, name: 'Vue' }
              ]
          },
          computed: {
            filteredList() {
              return this.list.filter(function (item) {
                return item.id < 3
              })
            }
          }
        })
      </script>
</body>
</html>

运行结果:
2
和前者运行一样,但在性能上有很大差别,此处数据量较小,效果不明显。
如果要同时使用v-ifv-for就不要以同级的形式。
实际案例:

<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <script src="./vue.js"></script>
</head>
<body>
  <div id="demo">
    <div v-if="products.length == 0" >没有找到商品!</div>
    <div v-else>
        <p v-for="item in product" :key="item.name">
            名称:{{item.name}}
            价格:{{item.price}}
        </p>
    </div>
 
  </div>

  <script>
    let dem = new Vue({
      el: '#demo',
      data : {
        products :[
                { name: '手机', price: 3000},
                { name: '电脑', price: 7000},
                { name: '平板', price: 6500},
                { name: '电视', price: 8000}
              ]
      },
      computed: {
            product() {
              return this.products.filter(function (item) {
                return item.name,item.price
              })
            }
          }
    })
  </script>
</body>
</html>

运行结果:
3
可以自行尝试把数组设为空值,则会触发<div v-if="products.length == 0" >没有找到商品!</div>,只打印其中的文本。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一蝉YiChan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值