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 09 Javascript
Dojo Javascript 编程规范 规范自己的JavaScript书写
Oct 26 Javascript
浅谈javascript的Touch事件
Sep 27 Javascript
Vue数据驱动模拟实现3
Jan 11 Javascript
Vue中fragment.js使用方法详解
Mar 09 Javascript
js-FCC算法-No repeats please字符串的全排列(详解)
May 02 Javascript
Node.js 实现简单的接口服务器的实例代码
May 23 Javascript
vue2.0中click点击当前li实现动态切换class
Jun 21 Javascript
AngularJS实现controller控制器间共享数据的方法示例
Oct 30 Javascript
react 兄弟组件如何调用对方的方法示例
Oct 23 Javascript
详解Vue2.0组件的继承与扩展
Nov 23 Javascript
bootstrap Table实现合并相同行
Jul 19 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
一个没有MYSQL数据库支持的简易留言本的编写
2006/10/09 PHP
php数组索引与键值操作技巧实例分析
2015/06/24 PHP
Yii数据读取与跳转参数传递用法实例分析
2016/07/12 PHP
php中分页及SqlHelper类用法实例
2017/01/12 PHP
php封装的验证码类分享
2017/02/26 PHP
PHP实现的注册,登录及查询用户资料功能API接口示例
2017/06/06 PHP
asp批量修改记录的代码
2008/06/25 Javascript
JS 字符串连接[性能比较]
2009/05/10 Javascript
JQuery 操作select标签实现代码
2010/05/14 Javascript
JQuery select标签操作代码段
2010/05/16 Javascript
JavaScript中的面向对象介绍
2012/06/30 Javascript
[将免费进行到底]在Amazon的一年免费服务器上安装Node.JS, NPM和OurJS博客
2014/08/18 Javascript
javascript实现俄罗斯方块游戏的思路和方法
2015/04/27 Javascript
Javascript实现单例模式
2016/01/24 Javascript
js+canvas简单绘制圆圈的方法
2016/01/28 Javascript
js删除局部变量的实现方法
2016/06/25 Javascript
JS控制div跳转到指定的位置的几种解决方案总结
2016/11/05 Javascript
JS实现简单的二元方程计算器功能示例
2017/01/03 Javascript
详解Angular5 路由传参的3种方法
2018/04/28 Javascript
解决vue单页路由跳转后scrollTop的问题
2018/09/03 Javascript
基于layui table返回的值的多级嵌套的解决方法
2019/09/19 Javascript
[01:58]DOTA2上海特级锦标赛现场采访:RTZ这个ID到底好不好
2016/03/25 DOTA
跟老齐学Python之有点简约的元组
2014/09/24 Python
Python实现多条件筛选目标数据功能【测试可用】
2018/06/13 Python
python3.7 利用函数os pandas利用excel对文件名进行归类
2019/09/29 Python
Python Django2.0集成Celery4.1教程
2019/11/19 Python
Python While循环语句实例演示及原理解析
2020/01/03 Python
全球知名的婚恋交友网站:Match.com
2017/01/05 全球购物
Carolina Lemke Berlin澳大利亚官网:时尚太阳镜品牌
2019/09/17 全球购物
意大利文具和办公产品在线商店:Y-Office
2020/02/27 全球购物
帮一个朋友写的求职信
2014/08/09 职场文书
幼儿园个人总结
2015/02/28 职场文书
电影焦裕禄观后感
2015/06/09 职场文书
婚育证明格式
2015/06/17 职场文书
《伯牙绝弦》教学反思
2016/02/16 职场文书
python文本处理的方案(结巴分词并去除符号)
2021/05/26 Python