读 vue 源码4 - 初始化实例成员

58 阅读1分钟

Vue 实例成员初始化的过程在 src/core/instance/index.js 中,其中主要调用了以下几个方法,都是给 Vue 的原型(实例)上混入了相应的成员:

initMixin(Vue)

Vue.prototype 上注册了 _init 方法,这个方法是 Vue 的入口方法,在 Vue 的构造函数中被调用。

stateMixin(Vue)

Object.defineProperty 给 Vue 原型上添加了 $data$props 属性,使用 Object.defineProperty 是为了设置 getset 方法,取值时返回 this._datathis._props,不能修改。

Object.defineProperty(Vue.prototype, '$data', dataDef)
Object.defineProperty(Vue.prototype, '$props', propsDef)

添加了 $set$delete$watch 方法

Vue.prototype.$set = set  (===Vue.set)
Vue.prototype.$delete = del  (===Vue.delete)
Vue.prototype.$watch = function() {...}

eventsMixin(Vue)

注册事件 : $on $once $off $emit

lifecycleMixin(Vue)

生命周期相关:

  1. _update: 最核心的是调用 __patch__ 方法,将虚拟 Dom 转换为真实 Dom,最终挂载到 $el
  2. $forceUpdate: 强制更新
  3. $destroy:销毁

renderMixin(Vue)

  1. installRenderHelpers(Vue.prototype) 安装了渲染相关的帮助方法
  2. 注册 $nextTick 方法
  3. 注册 _render 方法
Vue.prototype._render = function () {
   // 核心,vm.$options.render 是用户定义的 render 或者 template 编译后的 render
   const { render, _parentVnode } = vm.$options
   vnode = render.call(vm._renderProxy, vm.$createElement)
   // ...
}