在vue的内部封装了大量的api和方法供开发者调用,$mount方法是其中之一:

用法:

vm.$mount( [elementOrSelector] )

参数:

  • {Element | string} [elementOrSelector]
  • {boolean} [hydrating]

作用:

  • 如果 Vue 实例在实例化时没有收到 el 选项,则它处于“未挂载”状态,没有关联的 DOM 元素。可以使用 vm.$mount() 手动地挂载一个未挂载的实例。
  • 如果没有提供 elementOrSelector 参数,模板将被渲染为文档之外的的元素,并且你必须使用原生 DOM API把它插入文档中。
  • 这个方法返回实例自身,因而可以链式调用其它实例方法。
var mount = Vue.prototype.$mount;
Vue.prototype.$mount = function (el,hydrating) {el = el && query(el);if (el === document.body || el === document.documentElement) {warn("Do not mount Vue to <html> or <body> - mount to normal elements instead.");return this}var options = this.$options;// resolve template/el and convert to render functionif (!options.render) {var template = options.template;if (template) {if (typeof template === 'string') {if (template.charAt(0) === '#') {template = idToTemplate(template);/* istanbul ignore if */if (!template) {warn(("Template element not found or is empty: " + (options.template)),this);}}} else if (template.nodeType) {template = template.innerHTML;} else {{warn('invalid template option:' + template, this);}return this}} else if (el) {template = getOuterHTML(el);}if (template) {if (config.performance && mark) {mark('compile');}var ref = compileToFunctions(template, {outputSourceRange: "development" !== 'production',shouldDecodeNewlines: shouldDecodeNewlines,shouldDecodeNewlinesForHref: shouldDecodeNewlinesForHref,delimiters: options.delimiters,comments: options.comments}, this);var render = ref.render;var staticRenderFns = ref.staticRenderFns;options.render = render;options.staticRenderFns = staticRenderFns;if (config.performance && mark) {mark('compile end');measure(("vue " + (this._name) + " compile"), 'compile', 'compile end');}}}return mount.call(this, el, hydrating)
};

从源码中可以看到,在vue的实例上挂$mount方法之前,做了一次缓存$mount。这是因为vue的俩个版本造成的,还记得吗,一个是完整版,一个是运行时版本,他们的区别就是有没有模版编译,所以,$mount也就有两个版本,最开始的缓存就是为了,缓存运行时的$mount。下面我们来细看$mount内部是怎么实现的。

从代码中可以看到,该函数可大致分为三部分:

  • 根据传入的el参数获取DOM元素;
  • 在用户没有手写render函数的情况下获取传入的模板template
  • 将获取到的template编译成render函数;

首先,根据传入的el获取dom元素,并判断其不是body或者html,这是因为body或者html替换后会破坏html文档结构。

其次,在用户没有手写render函数的情况下获取传入的模板template。

首先获取用户传入的template选项赋给变量template,如果变量template存在,则接着判断如果template是字符串并且以##开头,则认为templateid选择符,则调用idToTemplate函数获取到选择符对应的DOM元素的innerHTML作为模板。如果template不是字符串,那就判断它是不是一个DOM元素,如果是,则使用该DOM元素的innerHTML作为模板,如果既不是字符串,也不是DOM元素,此时会抛出警告:提示用户template选项无效。如果变量template不存在,表明用户没有传入template选项,则根据传入的el参数调用getOuterHTML函数获取外部模板,不管是从内部的template选项中获取模板,还是从外部获取模板,总之就是要获取到用户传入的模板内容,有了模板内容接下来才能将模板编译成渲染函数。获取到模板之后,接下来要做的事就是将其编译成渲染函数,把模板编译成渲染函数是在compileToFunctions函数中进行的,该函数接收待编译的模板字符串和编译选项作为参数,返回一个对象,对象里面的render属性即是编译好的渲染函数,最后将渲染函数设置到$options上。

这就是$mount函数的实现过程。

vue源码解析:vue生命周期方法$mount方法的实现原理相关推荐

  1. vue源码解析:vue生命周期方法$destory方法的实现原理

    我们知道vue生命周期的最后一个阶段是销毁阶段,那么vue会调用自己的destory函数,那么$destory函数的实现原理是什么?且往下看. 用法: vm.$destroy() 作用: 完全销毁一个 ...

  2. Glide源码解析2 -- 生命周期原理

    一 概述 Glide 中一个重要的特性就是Request可以绑定Activity或者fragment的onStart而resume,onStop而pause,onDestroy而clear,所以Gli ...

  3. Vue源码解析(尚硅谷)

    视频地址:Vue源码解析系列课程 一.Vue源码解析之mustache模板引擎 1. 什么是模板引擎 模板引擎是将数据要变为视图最优雅的解决方案 历史上曾经出现的数据变为视图的方法 2. mustac ...

  4. Vue源码解析(一)

    前言:接触vue已经有一段时间了,前面也写了几篇关于vue全家桶的内容,感兴趣的小伙伴可以去看看,刚接触的时候就想去膜拜一下源码~可每次鼓起勇气去看vue源码的时候,当看到几万行代码的时候就直接望而却 ...

  5. 【vuejs深入三】vue源码解析之二 htmlParse解析器的实现

    写在前面 一个好的架构需要经过血与火的历练,一个好的工程师需要经过无数项目的摧残. 昨天博主分析了一下在vue中,最为基础核心的api,parse函数,它的作用是将vue的模板字符串转换成ast,从而 ...

  6. [Vue源码解析] patching算法

    [Vue源码解析] patching算法 pathching算法:通过对比新旧VNode的不同,然后找出需要更新的节点进行更新 操作:1.创建新增节点 2.删除废弃节点 3.修改需要更新的节点 创建节 ...

  7. Vue源码分析--Vue.component

    Vue源码分析–Vue.component 我将非 Vue.component 的部分去掉了 export function initAssetRegisters (Vue: GlobalAPI) { ...

  8. Vue源码解析之Template转化为AST的实现方法

    什么是AST 在Vue的mount过程中,template会被编译成AST语法树,AST是指抽象语法树(abstract syntax tree或者缩写为AST),或者语法树(syntax tree) ...

  9. Vue源码解析之数组变异

    力有不逮的对象 众所周知,在 Vue 中,直接修改对象属性的值无法触发响应式.当你直接修改了对象属性的值,你会发现,只有数据改了,但是页面内容并没有改变. 这是什么原因? 原因在于: Vue 的响应式 ...

  10. Vue源码解析:虚拟dom比较原理

    通过对 Vue2.0 源码阅读,想写一写自己的理解,能力有限故从尤大佬2016.4.11第一次提交开始读,准备陆续写: 模版字符串转AST语法树 AST语法树转render函数 Vue双向绑定原理 V ...

最新文章

  1. iOS 11开发教程(十九)iOS11应用视图美化按钮之设置按钮的外观
  2. 浅谈VS2012单元测试
  3. RapidMiner数据挖掘入门
  4. java: 代码过长_给初学Java,知道这4点太重要了!
  5. 地理信息数据 中国市级行政区划 SHP
  6. PotPlayer+SVP4视频补帧简易教程
  7. 计算机搜不到连接打印机主机,电脑搜索不到局域网打印机怎么办
  8. 3DMax与Unity统一长度单位和轴
  9. 创新产品访谈:Ntalker V2.5
  10. 2019年,重拾博客!
  11. Android系统java/native crash和anr异常处理流程以及DroboxManagerService日志记录
  12. 四大名著红楼梦第一回 甄士隐梦幻识通灵 贾雨村风尘怀闺秀
  13. SpringBoot入门(四)Service、Dao
  14. ASCII编码以及转换
  15. 游戏音乐怎样达到阴阳平衡?
  16. hbuilderx 数据库_HBuilderX入门教程
  17. python列表对应元素相乘_在python中,将两个列表中的每个元素相乘
  18. 可汗学院计算机课程都有哪些,要录制可汗学院教学视频你需要哪些硬件和软件?...
  19. IBM发展了用于混合云控制的自动化和数据功能
  20. 镶嵌数据集使用--ArcGIS Pro

热门文章

  1. 6-1 哈夫曼树及哈夫曼编码
  2. 联发科6758_OPPO新机使用联发科天玑720处理器,整体性能到底怎么样?
  3. 通过phpmyadmin修改帝国CMS的管理员密码
  4. 概率论 随机变量及常用6大分布整理
  5. 开始起飞-golang编码技巧分享--Dave Cheney博客读后整理
  6. (bilibili)b站看不见视频评论区或不显示高级弹幕
  7. php直播源码平台开发过程中使用第三方sdk
  8. Android移动开发基础
  9. kettle- linux定时执行ktr shell脚本
  10. 分享收集网络上的免费0元虚拟主机