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


    一、列表渲染

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

    1. <template>
    2. <div>
    3. <div v-for="(item, index) in arr" :key="index">{{ item }}div>
    4. div>
    5. template>
    6. <script>
    7. export default {
    8. data() {
    9. return {
    10. arr: [1, 2, 3, 4],
    11. };
    12. },
    13. };
    14. script>

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

    1、作用

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

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

    2、原理

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

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

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

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

    3、注意

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

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

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

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

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

    三、为什么index不能当做key

    1、用index当做key

    1. <template>
    2. <div>
    3. <div v-for="(item, index) in infos" :key="index">
    4. {{ item.name }} --- <button @click="del(index)">删除</button>
    5. </div>
    6. </div>
    7. </template>
    8. <script>
    9. export default {
    10. data() {
    11. return {
    12. infos: [
    13. {
    14. name: "张三",
    15. age: 18,
    16. },
    17. {
    18. name: "李四",
    19. age: 20,
    20. },
    21. {
    22. name: "王五",
    23. age: 21,
    24. },
    25. ],
    26. };
    27. },
    28. methods: {
    29. del (index) {
    30. this.infos.splice(index, 1)
    31. }
    32. }
    33. };
    34. </script>

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

    2、唯一值当做下标

    1. <template>
    2. <div>
    3. <div v-for="(item, index) in infos" :key="item.name">
    4. {{ item.name }} --- <button @click="del(index)">删除</button>
    5. </div>
    6. </div>
    7. </template>
    8. <script>
    9. export default {
    10. data() {
    11. return {
    12. infos: [
    13. {
    14. name: "张三",
    15. age: 18,
    16. },
    17. {
    18. name: "李四",
    19. age: 20,
    20. },
    21. {
    22. name: "王五",
    23. age: 21,
    24. },
    25. ],
    26. };
    27. },
    28. methods: {
    29. del (index) {
    30. this.infos.splice(index, 1)
    31. }
    32. }
    33. };
    34. </script>

    3、结论

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

  • 相关阅读:
    JavaScript进阶(二十六):ES各版本特性详解
    【NLP开发】Python实现聊天机器人(微信机器人)
    优秀工具|使用Reqable替换处理过的动态混淆js
    BP神经网络的详细原理,基于BP神经网络的图像跟踪,基于BP神经网络的细胞跟踪,基于BP神经网络的视频跟踪
    重写与重载and抽象类与接口!!!!
    Git版本控制管理
    Vue-Resource发送get-post-jsonp请求
    [运维|中间件] 在东方通TongWeb部署前端
    ython requests 库中 POST 方法的使用及文档改进
    k8s部署kafka,并使用zookeeper做注册中心
  • 原文地址:https://blog.csdn.net/weixin_57017198/article/details/134063826