开发者社区 问答 正文

Vue 中的 key 有什么作用?

已解决

Vue 中的 key 有什么作用?

展开
收起
pandacats 2019-12-10 11:25:25 599 分享 版权
1 条回答
写回答
取消 提交回答
  • 采纳回答

    key 是为 Vue 中 vnode 的唯一标记,通过这个 key,我们的 diff 操作可以更准确、更快速。Vue 的 diff 过程可以概括为:oldCh 和 newCh 各有两个头尾的变量 oldStartIndex、oldEndIndex 和 newStartIndex、newEndIndex,它们会新节点和旧节点会进行两两对比,即一共有4种比较方式:newStartIndex 和oldStartIndex 、newEndIndex 和 oldEndIndex 、newStartIndex 和 oldEndIndex 、newEndIndex 和 oldStartIndex,如果以上 4 种比较都没匹配,如果设置了key,就会用 key 再进行比较,在比较的过程中,遍历会往中间靠,一旦 StartIdx > EndIdx 表明 oldCh 和 newCh 至少有一个已经遍历完了,就会结束比较。具体有无 key 的 diff 过程,可以查看作者写的另一篇详解虚拟 DOM 的文章《深入剖析:Vue核心之虚拟DOM》

    所以 Vue 中 key 的作用是:key 是为 Vue 中 vnode 的唯一标记,通过这个 key,我们的 diff 操作可以更准确、更快速

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

    更快速:利用 key 的唯一性生成 map 对象来获取对应节点,比遍历方式更快,源码如下:

    function createKeyToOldIdx (children, beginIdx, endIdx) {
      let i, key
    
      const map = {}
    
      for (i = beginIdx; i <= endIdx; ++i) {
    
        key = children[i].key
    
        if (isDef(key)) map[key] = i
    
      }
    
      return map
    
    }
    
    
    
    2019-12-10 11:26:07
    赞同 展开评论
问答分类:
问答标签:
问答地址: