美文网首页
03. 认识 Vue 对象(三)

03. 认识 Vue 对象(三)

作者: KimYYX | 来源:发表于2019-03-08 09:52 被阅读0次

接上篇:02. 认识 Vue 对象(二)


今天我们一口气,把剩下的 lifecycleMixin(Vue)renderMixin(Vue) 都解决了💪。

lifecycleMixin(Vue) 新增 3 个方法:

  • Vue.prototype._update
  • Vue.prototype.$forceUpdate
  • Vue.prototype.$destroy

✨ _update

这个方法在源码中没有被直接使用,而是被包裹在一个 updateComponent 方法中,作为第二个参数传给 Watcher 实例。

_update 方法的作用就是更新 Vue 实例的虚拟节点 vnode 和关联的 DOM 对象 $el。在这个方法中有个重要的方法 vm.__patch__,我们在后面碰到的时候再详细说。

✨ $forceUpdate

该方法是强制 Vue 实例重新渲染,实现方法就是调用 vm._watcherupdate() 方法。vm._watcherWatcher 的一个实例,update 的方法调用链其实很长,我下面简单写一下

watcher.update -> watcher.run -> watcher.get -> (watcher.getter = _update)

注意啦!这里的 getter 方法引用的就是上面提到的 _update 方法

✨ $destroy

销毁 Vue 实例,包括该实例绑定的一切对象。大概会经历如下过程:

  1. 调用 beforeDestroy 钩子
  2. 如果有父对象,则从父对象的 parent.$children 中移除自身
  3. 关闭存在的 Watcher 监听:vm._watcher.teardown() & vm._watchers[i].teardown()
  4. 关闭存在于 data 上的 Observer 监听:vm._data.__ob__.vmCount--
  5. 调用 destroyed 钩子
  6. 移除实例上的监听:vm.$off()

上面好些实例上的属性大家可能并不熟悉,别着急,后面看到实例化对象的时候就清楚了。


下面是我们《认识 Vue 对象》的最后一个 Part:renderMixin(Vue),赶紧来看看你这个方法都对我们的 Vue 做了些什么:

首先执行了一个 installRenderHelpers(Vue.prototype) 方法,大家不要小看这一行代码,其实里面大有乾坤,大家看下面的源码自行感受下

// target 就是 Vue.prototype
export function installRenderHelpers (target: any) {
  target._o = markOnce
  target._n = toNumber
  target._s = toString
  target._l = renderList
  target._t = renderSlot
  target._q = looseEqual
  target._i = looseIndexOf
  target._m = renderStatic
  target._f = resolveFilter
  target._k = checkKeyCodes
  target._b = bindObjectProps
  target._v = createTextVNode
  target._e = createEmptyVNode
  target._u = resolveScopedSlots
  target._g = bindObjectListeners
}

这个方法给 Vue 对象赋予了一堆方法的短名称,至于这些方法有什么用,我们后面碰到一个再解释一个吧。

然后是新增 2 个常规方法 Vue.prototype.$nextTickVue.prototype._render

✨ $nextTick

这个方法,涉及 JS 的Event Loop 机制:宏观(macro)事件队列和微观(micro)事件队列,先执行微观任务队列,当微观任务队列清空后,再执行宏观任务。

Vue 默认使用 Promise 将该方法传入的回调方法加入微观队列中,在宿主环境不支持 Promise 的情况下,使用宏观队列。

将回调放入微观事件队列的方法有:

  • Promise

将回调放入宏观事件队列的方法有:

  • setImmediate
  • MessageChannel
  • setTimeout

✨ _render

这是个很关键的方法,用于 vue 实例的渲染。这个方法也不会被直接调用(我们发现 _ 开头的方法一般都不会直接调用),它是在 _update 方法里被调用的(这个方法是不是很熟?往上面翻翻)。这个 _render 方法会执行 vm.$options.render 方法,这个方法可是大有来头,我们后面会看到。

相关文章

  • 03. 认识 Vue 对象(三)

    接上篇:02. 认识 Vue 对象(二) 今天我们一口气,把剩下的 lifecycleMixin(Vue) 和 r...

  • 02. 认识 Vue 对象(二)

    接上篇 :01. 认识 Vue 对象(一) 今天我们接着来看 eventsMixin(Vue),这个方法给 Vue...

  • 00. 我和 Vue.js 没一点新意的故事

    ? Catalog 00. 我和 Vue.js 没一点新意的故事 01. 认识 Vue 对象(一) 02. 认识 ...

  • Day12 面向对象基础

    01.迭代器和生成器 02.认识面向对象 03.类的声明 04.对象的属性 05.对象属性的增删改查 06.slo...

  • 2018-09-11 vue 第一节

    一、认识vue 二、 vue的指令---------------- v-for 循环操 三、表格

  • 2019-05-23Vue基础

    Vue主要包含两个部分:Vue对象和指令 1.Vue对象 var 对象名 = new Vue({el:关键对象的选...

  • 03.对象操作

    字符串的声明 在OC中,用NSString类声明的字符串时一个对象 用@创建字符串 创建一个格式化的字符串 字符串...

  • 01. 认识 Vue 对象(一)

    前篇:00. 我和 Vue.js 没一点新意的故事 我们知道 JS 的面向对象,是基于原型(Prototype)的...

  • 01vue环境搭建

    01.安装NODE 02.vue环境搭建 03.引入图标库 04.项目目录

  • Vue

    Vue基础 起步 Vue采用的是MVVM的思想 官方教程 创建Vue对象 使用Vue语法时需要先创建一个Vue对象...

网友评论

      本文标题:03. 认识 Vue 对象(三)

      本文链接:https://www.haomeiwen.com/subject/lzbqpqtx.html