You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
function Vue (options) {
if (process.env.NODE_ENV !== 'production' &&
!(this instanceof Vue)
) {
warn('Vue is a constructor and should be called with the `new` keyword')
}
this._init(options)
}
initMixin(Vue)
stateMixin(Vue)
eventsMixin(Vue)
lifecycleMixin(Vue)
renderMixin(Vue)
手写 Vue框架
Vue模板编译原理
进阶高级前端,这9种Vue技术你掌握了吗?
一 数据驱动
1.初始化链路:
(1) 没有编译成render函数的,调用compileToFunctions将template编译成render函数
(2) 实例化watch,监听vm,通过vm._render得到vnode,然后通过vm._update将vnode渲染到成真实的dom:
(3) 主要是获取vnode节点树
(4) 上面的底层实现
(5) 这里用到了一个函数柯里化的技巧,通过 createPatchFunction 把差异化参数提前固化,这样不用每次调用 patch 的时候都传递 nodeOps 和 modules 了。
其实就是一个闭包,初始化一次传进去一次初始化参数,然后返回一个函数用于使用。
(6) 这里是patch的过程:
分成两种,一种是第一次初始化,第二种是更新操作。这里只说第一种:
-- 这里,将所有的children的elm挂在到vnode的elm,得到一颗以vnode.elm为根节点的节点树,最后将vnode.elm挂在到parentElm,即查到到dom中。实际上整个过程就是递归创建了一个完整的 DOM 树并插入到 Body 上。
Vue动态创建dom的实质:
jquery时代,是操作的dom树;vue时代,其实是在逻辑层操作的vnode树,最后将差异patch到dom上。每个vnode实例拥有类似下面的诸多属性,其中就报错该实例对应的dom属性elm。这么设置是为了在js中便于处理逻辑。
new Vue执行链再梳理
例子
参考
vue技术揭秘
The text was updated successfully, but these errors were encountered: