学学Vue(04)-列表渲染

104 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情 >>

v-for的基本使用

data 中定义的可迭代对象都可以进行列表渲染,使用形如item in movies ,现在也可以使用item of movies 效果相同,item 就是当前取到的条目,如果想要使用index 即表示当前是第几个条目的时候,就直接使用(item,index) in movies ,index从0开始

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .item{
      margin-top: 5px;
      background-color: orange;
    }
  </style>
</head>
<body>
  <div id="app">
    <h2>电影列表</h2>
    <ul>
      <li v-for="(item,index) in movies">{{index}}-{{item}}</li>
    </ul>
    <h2>商品列表</h2>
    <div v-for="(item,index) in products" class="item">
      <h3>{{item.name}}</h3>
      <span>{{item.price}}</span>
      <p>{{item.desc}}</p>
    </div>
  </div>
  <script src="../lib/vue.mini.js"></script>
  <script>
    const app=Vue.createApp({
      data(){
        return{
          movies:['星际穿越','少年派','大话西游'],
          products:[
            {
              id:110,
              name:'MacBook',
              price:9,
              desc:'9.9秒杀'
            },
             {
              id:110,
              name:'MacBook',
              price:9,
              desc:'9.9秒杀'
            },
             {
              id:110,
              name:'MacBook',
              price:9,
              desc:'9.9秒杀'
            }
          ]
        }
      }
    })
    app.mount('#app')
  </script>
</body>
</html>

v-for的其他类型

当遍历对象的时候,我们还可以获取对象中的key ,如下所示,使用形如(item,key,index) in info 来获取条目、key和位置

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .item{
      margin-top: 5px;
      background-color: orange;
    }
  </style>
</head>
<body>
  <div id="app">
   <ul>
    <li v-for="(item,key,index) in info">{{item}}-{{key}}-{{index}}</li>
   </ul>
    
  </div>
  <script src="../lib/vue.mini.js"></script>
  <script>
    const app=Vue.createApp({
      data(){
        return{
          info:{
            name:'why',
            age:10,
            height:18.8
          }
        }
      }
    })
    app.mount('#app')
  </script>
</body>
</html>

数组更新检测

  • Vue将被侦听的数组的变更方法进行了包裹,所以它们页将会触发视图更新
  • 这些被包裹过的方法包括:
    • push
    • pop
    • shift
    • unshift
    • splice
    • sort
    • reverse

即对原数组造成了改变的方法,被调用会触发数组更新

key相关

当列表渲染没有绑定key的时候

我们可以看到,a和b进行了复用,但是c和d没有进行复用,它们并没有改变,不需要改动,因为列表到f的时候就和老的对不上了,后面就只有进行新增。

image.png

image.png

当列表渲染绑定key的时候

image.png

image.png

  • 第一步从头开始进行遍历、比较:

    • a和b是一致的会继续进行比较
    • c和f因为key不一致,所以就会break跳出循环
  • 第二步的操作是从尾部开始遍历、比较:

image.png

  • 第三步是如果旧的节点遍历完毕,但是依然有新的节点,那么就新增节点:

image.png

  • 第四步是如果新的节点遍历完毕,但是依然有旧的节点,那么就移除久节点:

image.png

  • 第五步是最特殊的情况,中间还有很多未知的或者乱序的节点:

image.png

总结

  • 在没有key的时候页面更新效率是十分低效的
  • 在进行插入活着重置顺序的时候,保持相同的key可以让diff算法更加的高效