浅谈Vue源码

152 阅读2分钟
  1. 模板编译
  2. 响应式
  3. Vdom
  4. patch

模板编译

vue中的template不是html,vue-loader会将template编译成render函数,会在开发时候完成,此过程为模板的编译,使用js去编写html。

响应式

监听数据的获取与设置,通过Object.definePropperty(data,key,{set(){},get(){}}),实现对对象的属性进行监听,但此方法适合监听对象,不适合监听数组与对象属性的增加与删除,vue2中用set,set,delete进行对象属性的增加与删除从而进行其他操作,而数组通过重写它的原型,将调用该方法的时候进行数据的改变与视图的更新。

Vdom

虚拟Dom,数据驱动视图,减少DOM的操作,提高性能,数据改变集中处理,再进行渲染到页面上,无需多次渲染。 {tag: div,props:{className:'liss'},children:[{},{},{}]}

patch

patch(ele,Vdom),patch(oldVdom,newVdom),diff算法,只会比较同一层级,tag不同直接删除,tag、key一样认定为同一元素,直接位置到响应位置即可,最终渲染至页面即可。

Vue组件的初次渲染与更新的过程 通过vue-loader将模板编译成render函数,触发数据的监听,监听数据的set与get,执行render函数,触发data中的set,将获取的数据收集起来放置watch池,render函数执行完形成Vdom,再使用patch进行渲染至页面。 更新:触发set,去watch池中查询是否是template模板中的数据,或是,进行再次render函数形成,在执行render函数,形成新的虚拟Dom,在进行patch,进而渲染页面。

异步渲染,也就是每次改变值,不会马上渲染,而是集中起来,一次渲染,提高性能,出现nextTick函数,nextTick回调函数,当页面渲染完毕后执行的函数。