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创建Silverlight Plugin以及自定义nonSilverlight和lowSilverlight样式
Jun 28 Javascript
JavaScript实现获取dom中class的方法
Feb 09 Javascript
在父页面得到zTree已选中的节点的方法
Feb 12 Javascript
JQuery节点元素属性操作方法
Jun 11 Javascript
JavaScript三种绑定事件方式及相互之间的区别分析
Jan 10 Javascript
JS常用知识点整理
Jan 21 Javascript
Vue非父子组件通信详解
Jun 12 Javascript
Angular+Bootstrap+Spring Boot实现分页功能实例代码
Jul 21 Javascript
微信小程序中使用ECharts 异步加载数据的方法
Jun 27 Javascript
对Vue beforeRouteEnter 的next执行时机详解
Aug 25 Javascript
解决ie11 SCRIPT5011:不能执行已释放Script的代码问题
May 05 Javascript
layui固定下拉框的显示条数(有滚动条)的方法
Sep 10 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/10/09 PHP
php抓取页面与代码解析 推荐
2010/07/23 PHP
PHP If Else(elsefi) 语句
2013/04/07 PHP
PHP正则表达式替换站点关键字链接后空白的解决方法
2014/09/16 PHP
PHP的简单跳转提示的实现详解
2019/03/14 PHP
PHP 对象接口简单实现方法示例
2020/04/13 PHP
jQuery中文入门指南,翻译加实例,jQuery的起点教程
2007/02/09 Javascript
jquery $.ajax入门应用二
2008/11/19 Javascript
JS 自动安装exe程序
2008/11/30 Javascript
基于jquery实现状态限定编辑的代码
2012/02/11 Javascript
DWZ刷新dialog解决方法
2013/03/03 Javascript
让图片跳跃起来  javascript图片轮播特效
2016/02/16 Javascript
Js获取图片原始宽高的实现代码
2016/05/17 Javascript
Bootstrap Tree View简单而优雅的树结构组件实例解析
2017/06/15 Javascript
js+css实现红包雨效果
2018/07/12 Javascript
Node.js EventEmmitter事件监听器用法实例分析
2019/01/07 Javascript
轻松学习JavaScript函数中的 Rest 参数
2019/05/30 Javascript
layUI实现前端分页和后端分页
2019/07/27 Javascript
[01:47]2018年度DOTA2最佳教练-完美盛典
2018/12/16 DOTA
[33:09]完美世界DOTA2联赛循环赛 Forest vs DM BO2第二场 10.29
2020/10/29 DOTA
python使用心得之获得github代码库列表
2014/06/25 Python
python实现分页效果
2017/10/25 Python
python 矩阵增加一行或一列的实例
2018/04/04 Python
对python模块中多个类的用法详解
2019/01/10 Python
PyQt5的PyQtGraph实践系列3之实时数据更新绘制图形
2019/05/13 Python
利用Python实现手机短信监控通知的方法
2019/07/22 Python
CSS3圆角和渐变2种常用功能详解
2016/01/06 HTML / CSS
浅谈CSS3中的变形功能-transform功能
2017/12/27 HTML / CSS
HTML5超炫酷粒子效果的进度条的实现示例
2019/08/23 HTML / CSS
如何在发生故障的节点上重新安装 SQL Server
2013/03/14 面试题
酒店管理专业毕业生推荐信
2013/11/10 职场文书
班级道德讲堂实施方案
2014/02/24 职场文书
2015年公司新年寄语
2014/12/08 职场文书
求职信内容一般写什么?
2015/03/20 职场文书
吴仁宝观后感
2015/06/09 职场文书
Zabbix6通过ODBC方式监控Oracle 19C的详细过程
2022/09/23 Servers