vue 源码解析之虚拟Dom-render


Posted in Javascript onAugust 26, 2019

vue 源码解析 --虚拟Dom-render

instance/index.js
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)
}
renderMixin(Vue)

初始化先执行了 renderMixin 方法, Vue 实例化执行this._init, 执行this.init方法中有initRender()

renderMixin
installRenderHelpers( 将一些渲染的工具函数放在Vue 原型上)

Vue.prototype.$nextTick = function (fn: Function) {
  return nextTick(fn, this)
 }

仔细看这个函数, 在Vue中的官方文档上这样解释

Vue 异步执行 DOM 更新。只要观察到数据变化,Vue 将开启一个队列,并缓冲在同一事件循环中发生的所有数据改变。如果同一个 watcher 被多次触发,只会被推入到队列中一次。这种在缓冲时去除重复数据对于避免不必要的计算和 DOM 操作上非常重要。然后,在下一个的事件循环“tick”中,Vue 刷新队列并执行实际 (已去重的) 工作。Vue 在内部尝试对异步队列使用原生的 Promise.then MessageChannel,如果执行环境不支持,会采用 setTimeout(fn, 0)代替。

export function nextTick (cb?: Function, ctx?: Object) {
 let _resolve
 callbacks.push(() => {
  if (cb) {
   try {
    cb.call(ctx)
   } catch (e) {
    handleError(e, ctx, 'nextTick')
   }
  } else if (_resolve) {
   _resolve(ctx)
  }
 })
 if (!pending) {
  pending = true
  timerFunc()
 }
 // $flow-disable-line
 if (!cb && typeof Promise !== 'undefined') {
  return new Promise(resolve => {
   _resolve = resolve
  })
 }
}

Vue.nextTick用于延迟执行一段代码,它接受2个参数(回调函数和执行回调函数的上下文环境),如果没有提供回调函数,那么将返回promise对象。

function flushCallbacks () {
 pending = false
 const copies = callbacks.slice(0)
 callbacks.length = 0
 for (let i = 0; i < copies.length; i++) {
  copies[i]()
 }
}

这个flushCallbacks 是执行callbacks里存储的所有回调函数。

timerFunc 用来触发执行回调函数

先判断是否原生支持promise,如果支持,则利用promise来触发执行回调函数;
否则,如果支持MutationObserver,则实例化一个观察者对象,观察文本节点发生变化时,触发执行 
所有回调函数。

如果都不支持,则利用setTimeout设置延时为0。

const observer = new MutationObserver(flushCallbacks)
 const textNode = document.createTextNode(String(counter))
 observer.observe(textNode, {
  characterData: true
 })
 timerFunc = () => {
  counter = (counter + 1) % 2
  textNode.data = String(counter)
 }
 isUsingMicroTask = true

MutationObserver是一个构造器,接受一个callback参数,用来处理节点变化的回调函数,observe方法中options参数characterData:设置true,表示观察目标数据的改变

_render函数

通过执行 createElement 方法并返回的是 vnode,它是一个虚拟的 Node。

vnode = render.call(vm._renderProxy, vm.$createElement)

总结

以上所述是小编给大家介绍的vue 源码解析之虚拟Dom-render,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
一段好玩的JavaScript代码
Dec 01 Javascript
js 页面执行时间计算代码
Mar 04 Javascript
JavaScript获取table中某一列的值的方法
May 06 Javascript
简单的jquery左侧导航栏和页面选中效果
Aug 21 Javascript
JavaScript中使用Math.PI圆周率属性的方法
Jun 14 Javascript
功能强大的Bootstrap效果展示(二)
Aug 03 Javascript
遍历js中对象的属性和值的实例
Nov 21 Javascript
BootStrap 实现各种样式的进度条效果
Dec 07 Javascript
jquery Ajax 全局调用封装实例详解
Jan 16 Javascript
通过实例学习React中事件节流防抖
Jun 17 Javascript
JavaScript forEach中return失效问题解决方案
Jun 01 Javascript
一起深入理解js中的事件对象
Feb 06 Javascript
Node.js爬虫如何获取天气和每日问候详解
Aug 26 #Javascript
vue移动端实现手机左右滑动入场动画
Jun 17 #Javascript
详解vuex数据传输的两种方式及this.$store undefined的解决办法
Aug 26 #Javascript
JS阻止事件冒泡的方法详解
Aug 26 #Javascript
express框架中使用jwt实现验证的方法
Aug 25 #Javascript
JS异步处理的进化史深入讲解
Aug 25 #Javascript
Vue源码分析之Vue实例初始化详解
Aug 25 #Javascript
You might like
几个学习PHP的网址
2006/11/25 PHP
PHP完整的日历类(CLASS)
2006/11/27 PHP
php中截取字符串支持utf-8
2007/01/18 PHP
php文件怎么打开 如何执行php文件
2011/12/21 PHP
PHP中去掉字符串首尾空格的方法
2012/05/19 PHP
JavaScript 对话框和状态栏使用说明
2009/10/25 Javascript
actionscript与javascript的区别
2011/05/25 Javascript
jQuery中实现动画效果的基本操作介绍
2013/04/16 Javascript
JS分页控件 可用于无刷新分页
2013/07/23 Javascript
JS动态增加删除UL节点LI及相关内容示例
2014/05/21 Javascript
Ionic如何创建APP项目
2016/06/03 Javascript
JavaScript中Array对象用法实例总结
2016/11/29 Javascript
JS实现一次性弹窗的方法【刷新后不弹出】
2016/12/26 Javascript
微信小程序  http请求封装详解及实例代码
2017/02/15 Javascript
JavaScript运动框架 解决速度正负取整问题(一)
2017/05/17 Javascript
基于Vue实现后台系统权限控制的示例代码
2017/08/29 Javascript
bootstrap datetimepicker控件位置异常的解决方法
2017/11/23 Javascript
详解plotly.js 绘图库入门使用教程
2018/02/23 Javascript
vue单页应用在页面刷新时保留状态数据的方法
2018/09/21 Javascript
js中arguments对象的深入理解
2019/05/14 Javascript
node学习笔记之读写文件与开启第一个web服务器操作示例
2019/05/29 Javascript
JS用最简单的方法实现四舍五入
2019/08/27 Javascript
jquery弹窗时禁止body滚动条滚动的例子
2019/09/21 jQuery
layui-select动态选中值的例子
2019/09/23 Javascript
vue插槽slot的简单理解与用法实例分析
2020/03/14 Javascript
了不起的11个JavaScript代码重构最佳实践小结
2021/01/11 Javascript
wxPython框架类和面板类的使用实例
2014/09/28 Python
Python基础中所出现的异常报错总结
2016/11/19 Python
Python变量和数据类型详解
2017/02/15 Python
Python 动态导入对象,importlib.import_module()的使用方法
2019/08/28 Python
Anaconda+VSCode配置tensorflow开发环境的教程详解
2020/03/30 Python
Python基于当前时间批量创建文件
2020/05/07 Python
加州风格的游泳和沙滩装品牌:Cupshe
2019/06/10 全球购物
掌上明珠Java程序员面试总结
2016/02/23 面试题
2016年心理学教育培训学习心得体会
2016/01/12 职场文书
Python GUI编程之tkinter 关于 ttkbootstrap 的使用详解
2022/03/03 Python