图解vue中 v-for 的 :key 的作用,虚拟dom Diff算法

  其实不只是vue,react中在执行列表渲染时也会要求给每个组件添加上key这个属性。

  要解释key的作用,不得不先介绍一下虚拟DOM的Diff算法了。

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

  vue和react的虚拟DOM的Diff算法大致相同,其核心是基于两个简单的假设:

1、两个相同的组件产生类似的DOM结构,不同的组件产生不同的DOM结构。

2、同一层级的一组节点,他们可以通过唯一的id进行区分。

  基于以上这两点假设,使得虚拟DOM的Diff算法的复杂度从O(n^3)降到了O(n)

  这里我们借用React’s diff algorithm中的一张图来简单说明一下:

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

  如果节点类型不同,直接干掉前面的节点,再创建并插入新的节点,不会再比较这个节点以后的子节点了。

  如果节点类型相同,则会重新设置该节点的属性,从而实现节点的更新。

  当某一层有很多相同的节点时,也就是列表节点时,Diff算法的更新过程默认情况下也是遵循以上原则。

  比如以下这个情况:

  我们希望可以在B和C之间加一个F,Diff算法默认执行起来是这样的:

  即把C更新成F,D更新成C,E更新成D,最后再插入E,是不是很没有效率?

  所以我们需要使用key来给每个节点做一个唯一标识,Diff算法就可以正确的识别此节点,找到正确的位置区插入新的节点。

  所以一句话,key的作用主要是为了高效的更新虚拟DOM。另外vue中在使用相同标签名元素的过渡切换时,也会使用到key属性,其目的也是为了让vue可以区分它们,否则vue只会替换其内部属性而不会触发过渡效果。

原文地址:https://www.cnblogs.com/goloving/p/9180820.html

时间: 2024-08-29 13:30:22

图解vue中 v-for 的 :key 的作用,虚拟dom Diff算法的相关文章

Vue中的浏览器关键渲染路径及虚拟DOM

1.浏览器渲染页面过程 (浏览器渲染引擎的渲染流程) 1.1.关键渲染路径 关键渲染路径是指浏览器从最初接收请求来的HTML.CSS.javascript等资源,然后解析.构建树.渲染布局.绘制,最后呈现给客户能看到的界面这整个过程. 所以浏览器的渲染过程主要包括以下几步: 解析HTML生成DOM树. 解析CSS生成CSSOM规则树. 将DOM树与CSSOM规则树合并在一起生成渲染树. 遍历渲染树开始布局,计算每个节点的位置大小信息. 将渲染树每个节点绘制到屏幕. 2.JS操作真实DOM的代价!

vue的虚拟dom(Virtual DOM )

模板转换成视图的过程 在底层实现中Vue会将模板编译成渲染函数,当然我们也可以不写模板,直接写渲染函数,以获得更好的控制. 渲染函数:渲染函数是用来生成Virtual DOM的:VNode虚拟节点:vnode可以理解成dom节点的描述对象,它描述了应该怎样去创建真实的DOM节点:patch(patching算法):虚拟DOM最核心的部分,它可以将vnode渲染成真实的DOM.这个过程是对比新旧虚拟节点之间有哪些不同,然后根据对比结果找出需要更新的的节点进行更新.其实际作用是在现有DOM上进行修改

深入理解react中的虚拟DOM、diff算法

文章结构: React中的虚拟DOM是什么? 虚拟DOM的简单实现(diff算法) 虚拟DOM的内部工作原理 React中的虚拟DOM与Vue中的虚拟DOM比较 React中的虚拟DOM是什么?   虽然React中的虚拟DOM很好用,但是这是一个无心插柳的结果.   React的核心思想:一个Component拯救世界,忘掉烦恼,从此不再操心界面. 1. Virtual Dom快,有两个前提 1.1 Javascript很快  Chrome刚出来的时候,在Chrome里跑Javascript非

vue 中的key 的用法

(Emitted value instead of an instance of Error) <router-link v-for="item in mycrowdJoinArr">: component lists rendered with v-for should have explicit keys. See https://vuejs.org/guide/list.html#key for more info. 我们有的时候会在npm run dev的时候  发

Vue中 key keep-alive的实现原理

vue2.0提供了一个keep-alive组件用来缓存组件,避免多次加载相应的组件,减少性能消耗 keep-aliv是Vue.js的一个内置组件.它能够不活动的组件实例保存在内存中,而不是直接将其销毁,它是一个抽象组件,不会被渲染到真实DOM中,也不会出现在父组件链中. 它有两个生命周期: activated: keep-alive组件激活时调用 deactivated: keep-alive组件停用时调用 它提供了include与exclude两个属性,允许组件有条件地进行缓存. keep-a

VUE中演示v-for为什么要加key

说到这个问题想必要举个例子了 image 没有key <div id="app"> <div> <input type="text" v-model="name"> <button @click="add">添加</button> </div> <ul> <li v-for="(item, i) in list">

Vue 中的 v - if 和 v - show + v-for

v-if   v-show v-if是动态的向DOM树内添加或者删除DOM元素: v-if和v-show 都可以控制显示隐藏 v-if 它是没有加载DOM结构 可以叫做惰性加载 <div id="app"><h1 v-if='true'>{{msg1}}</h1> <span>显示</span> <br><h1 v-if='false'>{{msg2}}</h1> <span>不

vue 中的 key 有什么作用?

key 是为 Vue 中 vnode 的唯一标记,通过这个 key,我们的 diff 操作可以更准确.更快速. Vue 的 diff 过程可以概括为: oldCh 和 newCh 各有两个头尾的变量 oldStartIndex.oldEndIndex 和 newStartIndex.newEndIndex,它们会在新节点和旧节点会进行两两对比 即一共有4种比较方式:newStartIndex 和oldStartIndex .newEndIndex 和 oldEndIndex .newStartI

vue中key的作用 v-for里警告 v-if的复用

vue总是会复用页面上已经存在的dom,区别的方法是加上key就可以,还设有v-for时候的警告也是如此key的作用是区别这条跟那条的.<body> <div id="app"> <div v-if='flag%2'> 用户名:<input type="text"> // 用户名:<input type="text" key='password'> </div> <di