第八节——Vue渲染列表+key作用

一、列表渲染

vue中使用v-for指令进行列表

复制代码
<template>
  <div>
    <!-- item 代表 当前循环的每一项 -->
    <!-- index 代表 当前循环的下标-->
    <!-- 注意:必须要加key-->
    <div v-for="(item, index) in arr" :key="index">{{ item }}</div>
  </div>
</template>
<script>
export default {
  data() {
    return {
      arr: [1, 2, 3, 4],
    };
  },
};
</script>

二、为什么循环的时候需要加key

1、作用

1.key的作用主要是为了高效的更新虚拟DOM,提高渲染性能。

2.key属性可以避免数据混乱的情况出现。

2、原理

1.vue实现了一套虚拟DOM,使我们可以不直接操作DOM元素只操作数据,就可以重新渲染页面,而隐藏在背后的原理是高效的Diff算法

2当页面数据发生变化时,Diff算法只会比较同一层级的节点;

3.如果节点类型不同,直接干掉前面的节点,再创建并插入新的节点,不会再比较这个节点后面的子节点;如果节点类型相同,则会重新设置该节点属性,从而实现节点更新

4.使用key给每个节点做一个唯一标识,Diff算法就可以正确识别此节点,"就地更新"找到正确的位置插入新的节点

3、注意

1.key 的值只能是字符串或数字类型

  1. key 的值必须具有唯一性(即:key 的值不能重复)

2.建议把数据项 id 属性的值作为 key 的值(因为 id 属性的值具有唯一性)

3.使用 index 的值当作 key 的值没有任何意义(因为 index 的值不具有唯一性,实际项目中如果没有id,推荐使用index)

4.建议使用 v-for 指令时一定要指定 key 的值(既提升性能、又防止列表状态紊乱)

三、为什么index不能当做key

1、用index当做key

复制代码
<template>
  <div>
    <div v-for="(item, index) in infos" :key="index">
      {{ item.name }} --- <button @click="del(index)">删除</button>
    </div>
  </div>
</template>
<script>
export default {
  data() {
    return {
      infos: [
        {
          name: "张三",
          age: 18,
        },
        {
          name: "李四",
          age: 20,
        },
        {
          name: "王五",
          age: 21,
        },
      ],
    };
  },

  methods: {
    del (index) {
      this.infos.splice(index, 1)
    }
  }
};
</script>

这么乍一看,好像可以正常实现功能,但是我们通过浏览器的控制台检查列表的渲染后发现,我们删除了一个项,竟然连带着整个列表都进行了重新渲染!

2、唯一值当做下标

复制代码
<template>
  <div>
    <div v-for="(item, index) in infos" :key="item.name">
      {{ item.name }} --- <button @click="del(index)">删除</button>
    </div>
  </div>
</template>
<script>
export default {
  data() {
    return {
      infos: [
        {
          name: "张三",
          age: 18,
        },
        {
          name: "李四",
          age: 20,
        },
        {
          name: "王五",
          age: 21,
        },
      ],
    };
  },

  methods: {
    del (index) {
      this.infos.splice(index, 1)
    }
  }
};
</script>

3、结论

如果key改变,当前元素会重新渲染,所以循环的时候推荐使用唯一不会改变的值当做key。

相关推荐
zach24 分钟前
Vue/React SPA 打包部署后,子路由刷新 401 未登录问题彻底解决
前端·nginx·next.js
旋生万物26 分钟前
素数螺旋映射 $z_n=n^{1+i}$ 的角分布统计检验与零模型对比
大数据·前端·人工智能·算法·云原生·螺旋生成论·螺旋相位
亿元程序员27 分钟前
游戏引擎都没用!纯AI又上线了一款蚂蚁搬家小游戏!
前端
福兮说34 分钟前
JS 正则的六个坑:带 g 的 test() 一真一假、空匹配死循环、replace 里的 $
开发语言·前端·javascript·正则表达式
miss36 分钟前
给规则引擎加一个拖拽画布:Vue Flow 单向投影 + 布局语义分离
javascript·vue.js·canvas
溪语流沙36 分钟前
Django + Vue电商项目第005讲:后端骨架|Django初始化、配置分层与DRF接入
vue.js·后端·python·django
码艺-Alimjan38 分钟前
Web 网站打包桌面应用的另一种方式,超级简单(C# exe 33Kb)
开发语言·前端·c#
flash俊杰44 分钟前
时间线到 filter_complex:把编辑文档编译成 FFmpeg 滤镜图
前端
Tyrvision1 小时前
新品发布前,三维动画怎么排期才不挤在最后一周?
前端
miss1 小时前
从零做一个可视化规则引擎:Vue3 递归条件树 + 双引擎结果对比
前端·vue.js·typescript