vue数据驱动
date
Nov 17, 2021
slug
vue-data
status
Published
tags
Vue
type
Post
summary
vue数据驱动
数据驱动
new vue的时候发生了什么
Vue是个构造函数
首先检查vue有没有被合适的实例化,然后调用
init
方法Vue 初始化主要就干了几件事情,合并配置,初始化生命周期,初始化事件中心,初始化渲染,初始化 data、props、computed、watcher (主要在init里面)
vue实例挂载
vue中实例挂载是通过
$mount
实现的,带有complier版本的实际上用了原型链上的$mount
方法,并且重写了这个方法,无论是el
还是template
都会在这个方法中转换为render
方法,所有 Vue 的组件的渲染最终都需要 render
方法,无论我们是用单文件 .vue 方式开发组件,还是写了 el
或者 template
属性,最终都会转换成 render
方法,那么这个过程是 Vue 的一个“在线编译”的过程,它是调用 compileToFunctions
方法实现的mountComponent
核心就是先实例化一个渲染Watcher
,在它的回调函数中会调用 updateComponent
方法,在此方法中调用 vm._render
方法先生成虚拟 Node,最终调用 vm._update
更新 DOM。Watcher
在这里起到两个作用,一个是初始化的时候会执行回调函数,另一个是当 vm 实例中的监测的数据发生变化的时候执行回调函数,这块儿我们会在之后的章节中介绍。函数最后判断为根节点的时候设置
vm._isMounted
为 true
, 表示这个实例已经挂载了,同时执行 mounted
钩子函数。总结
mount
方法(把el或者是template转换成render)继承了Vue实例上的$mount
方法
$mount
调用了mountComponent
方法(这个方法实现了监听器,并挂载虚拟dom),实现了beforeUpdate
和mounted
两个钩子
mountComponent
方法的逻辑也是非常清晰的,它会完成整个渲染工作,接下来我们要重点分析其中的细节,也就是最核心的 2 个方法:vm._render
和vm._update
。
render
vm._render
最终是通过执行 createElement
方法并返回的是 vnode
,它是一个虚拟 Node。Vritual Dom
为什么
因为真实的dom开销巨大
是什么
虚拟dom就是是用js对象来描述一个真实dom节点。在vue中 vnode是用class实现的,并且借鉴了一个库叫做snabbdom
其实 VNode 是对真实 DOM 的一种抽象描述,它的核心定义无非就几个关键属性,标签名、数据、子节点、键值等,其它属性都是用来扩展 VNode 的灵活性以及实现一些特殊 feature 的。由于 VNode 只是用来映射到真实 DOM 的渲染,不需要包含操作 DOM 的方法,因此它是非常轻量和简单的。
Virtual DOM 除了它的数据结构的定义,映射到真实的 DOM 实际上要经历 VNode 的 create、diff、patch 等过程。那么在 Vue.js 中,VNode 的 create 是通过之前提到的
createElement
方法创建的.CreateElement
- 首先用了createElement 方法, 该方法是对
_createElement
的封装,处理了一些参数
_createElement
流程较多,分析规范化子数组和创建vnode(其实就是做了一些情况处理加上实例化vnode这个类)
createElement
创建 VNode 的过程,每个 VNode 有children
,children
每个元素也是一个 VNode,这样就形成了一个 VNode Tree,它很好的描述了我们的 DOM Tree。