vue2-vue实例挂载的过程

news/2025/1/12 18:50:31/

1、思考
new Vue()这个过程中究竟做了什么?过程中是如何完成数据的绑定,又是如何将数据渲染到视图的等等。

2、分析
首先找到vue的构造函数。
源码位置:/src/core/instance/index.js在这里插入图片描述
options是用户传递过来的配置项,如data、methods等常用的方法。
vue构建函数调用__init方法,但在文本中并未发现此方法,但仔细可以看到文件下方定义了很多初始方法。
在这里插入图片描述
首先可以看到initMixin方法,发现该方法在vue原型上定义了__init方法。
源码位置:/src/core/instance/init.js
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
仔细阅读以上代码,我们可以得出以下结论:
在调用beforeCreate之前,数据初始化并未完成,像data、props这些属性无法访问到
到了created的时候,数据已经初始化完成,能够访问data、props这些属性,但这时候并未完成DOM的挂载,因此无法访问到dom元素。
挂载方法是调用vm.$mount方法。

initState方法是完成props/data/method/watch/method的初始化。
源码位置:/scr/core/instance/state.js
在这里插入图片描述
这里我们主要看初始化data的方法为initData,它与initState在同一文件下。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
仔细阅读上面代码,我们可以得到以下结论:
初始化顺序:props、methods、data
data定义的时候可以选择函数形式或者对象形式(组件只能是函数形式)

数据的响应式。
上文提到的挂载方法是调用vm.$mount方法。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
阅读上方代码,可以得到一下结论:
不要将根元素放到body或者 html上
可以在对象中定义template/render或者直接使用template、el表示元素选择器
最终都会解析成render函数,调用compileToFunctions,会将template解析成render函数

对template的解析步骤大致分为以下几步:
将html文档片段解析成ast描述符
将ast描述符解析成字符串
生成render函数

生成render函数,挂载到vm上后,会再次调用mount方法。

源码位置:/src/paltforms/web/runtime/index.js
在这里插入图片描述
调用mountComponent渲染组件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
阅读上述代码,可以得到下面结论:
会触发beforeCreate钩子
定义updateComponent渲染页面视图方法
监听组件数据,一旦发生变化,触发beforeUpdate生命钩子

updateComponent方法主要执行在vue初始化时声明的render,update方法

render的主要作用是生成vnode
源码位置:/src/core/instance/render.js
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
_update主要功能是调用patch,将vnode转化为真实DOM,并且更新到页面中。
源码位置:/src/core/instance/lifecycle.js
在这里插入图片描述
在这里插入图片描述3、结论
new Vue的时候会调用_init方法
定义 s e t 、 set、 setget、 d e l e t e 、 delete、 deletewatch等方法
定义 o n 、 on、 onoff、 e m i t 等事件定 义 u p d a t e 、 emit等事件 定义_update、 emit等事件定updateforceUpdate、$deatory生命周期

调用$mount进行页面挂载
挂载的时候主要是通过mountComponent方法
定义updateComponent更新函数
执行render生成虚拟dom
_update将虚拟DOM生成真实DOM结构,并渲染到页面中。


http://www.ppmy.cn/news/1007568.html

相关文章

Java 8 中使用 Stream 遍历树形结构

在实际开发中,我们经常会开发菜单,树形结构,数据库一般就使用父id来表示,为了降低数据库的查询压力,我们可以使用Java8中的Stream流一次性把数据查出来,然后通过流式处理,我们一起来看看&#x…

C++11类型转换

目录 1.类型转换 static_cast reinterpret_cast const_cast dynamic_cast 复习重载强制类型转换 2.RAII RTTI 3.cin返回值强转bool 1.类型转换 static_cast reinterpret_cast const_cast 去掉const,p指针指向的内容可以被修改,但是(如果没有vola…

【C语言进阶篇】关于指针的八个经典笔试题(图文详解)

🎬 鸽芷咕:个人主页 🔥 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活! 文章目录 📋 前言💬 指针笔试题💭 笔试题 1:✅ 代码解析⁉️ 检验结果&…

NLPCC 出版部分相关源码记录

目录 Download Unzip Author Title Affiliation Check number of tex Zip Rename Delete Download import requests from bs4 import BeautifulSoup# 登录网站并获取登录后的 session def login(username, password):login_url = https://example.com/loginsession = …

机器学习模型选择评估和超参数调优

如何选择模型?如何评估模型?如何调整模型的超参数?模型评估要在测试集上进行,不能在训练集上进行,否则评估的准确率总是100%。所以,一般我们准备好数据集后,要将其分为训练集和测试集&#xff0…

过去几十年来,主要湖泊遭受了严重的水流失

一项新的研究表明,干旱和潮湿地区的损失是全球性的,可能对地球四分之一的人口产生重大影响。 美国宇航局的地表水和海洋地形任务(如图所示)在轨道上运行,将扫描湖泊和水库,为全球湖泊水储存估计提供新数据…

kvm+qemu+libvirt管理虚机

virt-manager 图形化创建虚拟机 #virt-manager纳管远程kvm虚拟机 # 可以指定kvm虚机的ssh端口和virt-manager所在主机的私钥 virt-manager -c qemussh://root10.197.115.17:5555/system?keyfileid_rsa --no-fork # 如果你生成的ssh-key 的名称是 test-key,在/home/ssh-key/ 目…

nginx设置转发未生效问题

nginx设置转发失效问题 在配置了 nginx 转发后,发现没有生效,经过反复的比较后记录一下问题: 正常转发: location ~ ^/prefix/path {proxy_pass http://101.1.12.11:8181; }未正常转发: location ~ ^/prefix/path {…