zoukankan      html  css  js  c++  java
  • vue key的作用

    key的作用是什么?

    简单来说:

    key是给每一个vnode的唯一id,可以依靠key,更准确, 更的拿到oldVnode中对应的vnode节点。

    1. 更准确

    因为带key就不是就地复用了,在sameNode函数 a.key === b.key对比中可以避免就地复用的情况。所以会更加准确。

    2. 更快

    利用key的唯一性生成map对象来获取对应节点,比遍历方式更快。(这个观点,就是我最初的那个观点。从这个角度看,map会比遍历更快。)

    详解:

    部分讨论是基于没有key的情况diff速度会更快。确实,这种观点并没有错。没有绑定key的情况下,并且在遍历模板简单的情况下,会导致虚拟新旧节点对比更快,节点也会复用。而这种复用是就地复用,一种鸭子辩型的复用。以下为简单的例子:

    <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]
      }
    })

    以上的例子,v-for的内容会生成以下的dom节点数组,我们给每一个节点标记一个身份id:

      [
        '<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
      ]
    1. 改变dataList数据,进行数据位置替换,对比改变后的数据
     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
      ]

    增删dataList列表项

      vm.dataList = [3, 4, 5, 6, 7] // 数据进行增删
    
      // 1. 没有key的情况, 节点位置不变,内容也更新了
      [
        '<div>3</div>', // id: A
        '<div>4</div>', // id:  B
        '<div>5</div>', // id:  C
        '<div>6</div>', // id:  D
        '<div>7</div>'  // id:  E
      ]
    
      // 2. 有key的情况, 节点删除了 A, B 节点,新增了 F, G 节点
      // <div v-for="i in dataList" :key='i'>{{ i }}</div>
      [
        '<div>3</div>', // id: C
        '<div>4</div>', // id:  D
        '<div>5</div>', // id:  E
        '<div>6</div>', // id:  F
        '<div>7</div>'  // id:  G
      ]

    从以上来看,不带有key,并且使用简单的模板,基于这个前提下,可以更有效的复用节点,diff速度来看也是不带key更加快速的,因为带key在增删节点上有耗时。这就是vue文档所说的默认模式。但是这个并不是key作用,而是没有key的情况下可以对节点就地复用,提高性能。

    这种模式会带来一些隐藏的副作用,比如可能不会产生过渡效果,或者在某些节点有绑定数据(表单)状态,会出现状态错位。VUE文档也说明了 这个默认的模式是高效的,但是只适用于不依赖子组件状态或临时 DOM 状态 (例如:表单输入值) 的列表渲染输出

    在不带key的情况下,对于简单列表页渲染来说diff节点更快是没有错误的。但是这并不是key的作用呀。

  • 相关阅读:
    CR开发笔记-1工作前的准备
    CR开发笔记-2基础飞机的搭建以及测试代码
    c++还有一个小时考试
    c# winform 打印笔记
    aspcms部署
    c#复习笔记 继承
    [转]IoC框架
    Cinder-2 窗口的创建过程
    Cinder-1 TinderBox
    admin模板
  • 原文地址:https://www.cnblogs.com/wangtong111/p/11244517.html
Copyright © 2011-2022 走看看