zoukankan      html  css  js  c++  java
  • vue、react中循环遍历为什么会有key,key有什么作用?

    先讲一下,vue和react都是在操作虚拟dom,并且根据diff算法进行新旧dom对比,从而更新dom,以vue举例:

    vue官方文档中写到有

    key 的特殊属性主要用在 Vue 的虚拟 DOM 算法,在新旧 nodes 对比时辨识 VNodes。如果不使用 key,Vue 会使用一种最大限度减少动态元素并且尽可能的尝试修复/再利用相同类型元素的算法。使用 key,它会基于 key 的变化重新排列元素顺序,并且会移除 key 不存在的元素。

    什么意思呢?就是说,key值的存在保证了唯一性,可以用于dom的重新渲染或是就地复用。

    举例来讲:

    <div id="app">
        <div v-for="i in dataList">{{ i }}</div>
    </div>
    var vm = new Vue({
      el: '#app',
      data: {
        dataList: [1, 2, 3, 4, 5]
      }
    })

    以上例子会渲染出5个dom节点,我们分别给每个增加一个id值,也就是key,如下:

    [
        '<div>1</div>', // id: A
        '<div>2</div>', // id:  B
        '<div>3</div>', // id:  C
        '<div>4</div>', // id:  D
        '<div>5</div>'  // id:  E
      ]

    我们改变listdata的数据使dom进行变化

    vm.dataList = [4, 1, 3, 5, 2] // 数据位置替换
    
     // 没有key的情况, 节点位置不变,但是节点innerText内容更新了
      [
        '<div>4</div>', // id: A
        '<div>1</div>', // id:  B
        '<div>3</div>', // id:  C
        '<div>5</div>', // id:  D
        '<div>2</div>'  // id:  E
      ]
    
      // 有key的情况,dom节点位置进行了交换,但是内容没有更新
      // <div v-for="i in dataList" :key='i'>{{ i }}</div>
      [
        '<div>4</div>', // id: D
        '<div>1</div>', // id:  A
        '<div>3</div>', // id:  C
        '<div>5</div>', // id:  E
        '<div>2</div>'  // id:  B
      ]

    vue在执行时,会对节点进行检查,如果没有key值,那么,vue检查到这里有dom节点,则会对内容进行清空,并且赋予新值;如果有key值的存在,那么vue会对oldnode和newnode进行对比,发现两者key值是否相同,进行调换位置或是删除操作。

    基于上述说法,不得不说,编写key值和不编写key值在时间上一定会有所差异(有key值的速度相对慢,但属于用户无法感知到),但时间上的快慢不属于key值的作用。

    key值的作用是:

    更精准-->在虚拟dom节点中赋予key值,会更加快速的拿到需要的目标节点,不会造成就地复用的情况,对于节点的把控更加精准。

  • 相关阅读:
    MQ消息堆积处理
    mysql覆盖索引与回表
    MYSQL-间隙锁详解
    MySQL InnoDB(Spring)并发事务导致的死锁及解决方案
    new String()创建了几个对象
    公平锁和非公平锁
    一个java对象最小占用内存空间
    千万级甚至亿级数据量排序
    @media (prefers-reduced-motion)
    babel 编译后导致_typeof无限递归调用 Maximum call stack size exceeded
  • 原文地址:https://www.cnblogs.com/lucio110/p/11313311.html
Copyright © 2011-2022 走看看