这就要从react如何渲染出页面开始 一般状况下的步骤是这样react
这个是在state不发生变化的状况下,(state或者prop发生变化都会调用render函数,从新渲染页面)算法
state数据变化时,一般理解下应该是下面的步骤浏览器
这样能够实现,可是很是消耗性能,由于会渲染两次dom树,因此react就采用一种虚拟dom的方法来进行dom更新。bash
JSX转成dom流程dom
用JSX语法时,渲染dom的流程:JSX——JS dom描述对象——真实dom函数
具体步骤:性能
['div',{id:'a'},['span',{},'hello']]
复制代码
<div id='a'><span>hello</span></div>
复制代码
['div',{id:'a'},['span',{},'hi']]
复制代码
在浏览器中能够用虚拟dom生成真实dom显示,在原生应用中也能够用虚拟dom生成对应的方式来显示页面spa
在上面咱们介绍了react中state变化时,dom是如何发生变化的,在第七步中比较原始虚拟dom和新的虚拟dom的区别采用的方法,就是diff算法(diffrence)code
虚拟dom在何时会发生比对?没错,数据发生变化时,也就是调用setState时cdn
react的虚拟dom实际上是同级比较的
但凡在上面哪一步骤出现不一样,就再也不继续比对,而是删除下面的所有节点,采用新的虚拟dom(例如:若是红色框的原始虚拟dom和新的虚拟dom不一致,那么就不在进行比对,采用新的虚拟dom来生成dom)
react利用key来识别组件,它是一种身份标识标识,来提升虚拟dom的比对速度看下面
若是咱们没有key值,那咱们就须要A比对一遍,B对比一遍,以此类推很好性能,而有了key,就像下面的图同样,咱们很快就知道只有f与以前不一样,提升了列表渲染的性能