Vue 的个人理解
Vue 深入理解
一、响应式原理
Vue 3 的响应式系统基于 effect 函数 构建。
-
核心流程
- 当访问响应式对象的属性时,会触发
track方法进行依赖收集。 - 依赖的存储结构为:
WeakMap<Target, Map<Property, Set<Effect>>>。Target:原始对象。Property:对象的属性。Effect:具体的副作用函数(依赖)。
- 当响应式对象的属性被修改时,会触发
trigger方法,遍历并执行所有收集到的effect函数。
- 当访问响应式对象的属性时,会触发
-
effect函数- 执行时,会先清理旧的依赖。
- 然后将当前
effect标记为活跃 (active) 状态,并压入执行栈,依次执行。
-
reactiveAPI- 基于
Proxy为整个对象创建代理,拦截所有操作(get、set、deleteProperty等)。 - 更新时使用
Reflect方法,确保执行上下文 (this) 指向正确。 - 注意:直接操作原始对象不会触发响应式更新。
reactive默认是深层响应式。shallowReactive可创建仅第一层响应式的代理。
- 基于
-
refAPI- 用于代理基本类型值(因为基本类型按值传递,无法被
Proxy直接代理)。 - 通过
.value属性访问其包装的真实值。 - 在
.value的getter中调用track,在setter中调用trigger。
- 用于代理基本类型值(因为基本类型按值传递,无法被
-
computedAPI- 本质是特殊的响应式
effect。 - 懒执行:仅在首次访问
.value时执行计算。 - 缓存:内部缓存当前值,仅在依赖的响应式数据变化时才重新计算。
- 本质是特殊的响应式
-
watch与watchEffectAPIwatch:显式指定侦听的数据源,仅在数据变化时执行回调,可获取新值与旧值。watchEffect:立即执行一次,并自动追踪其内部所有响应式依赖。
-
其他特性
- Vue 3 对
Array的方法、Map、Set等集合类型进行了响应式代理的重写/包装。 stop函数可用于停止一个响应式effect。onTrack和onTrigger钩子可用于调试复杂的依赖关系。
- Vue 3 对
二、虚拟 DOM 与 Diff 算法
- 虚拟 DOM (VNode):本质是用 JavaScript 对象来描述真实的 DOM 结构。
- Diff 算法:在组件更新时,通过对比新旧 VNode,计算出需要进行的最小化、批量的 DOM 操作,以实现高效、精准的视图更新。
三、模板编译
Vue 的模板 (template) 需要被编译为渲染函数 (render function),其过程如下:
- 解析:将模板字符串解析为抽象语法树 (AST)。
- 转换/优化:对 AST 进行优化。例如:
- 静态节点提升:将纯静态的节点提取出来,在重渲染时直接复用,避免重复创建。
- Vue 会根据开发环境与生产环境进行不同级别的优化。
- 代码生成:将优化后的 AST 生成为可执行的
render函数字符串。
- 后续组件更新时,直接执行这个
render函数生成新的 VNode。 render函数会被一个effect包裹,因此当其内部的响应式依赖变化时,会自动触发重新执行和视图更新。
四、组件系统
-
组件间通信
- Props / Emits:父传子,子传父的标准方式。
- Provide / Inject:跨层级祖先组件向后代组件提供数据。
- 状态管理 (Pinia/Vuex):全局状态共享与管理。
-
组件生命周期
- 在
setup()函数中,可以通过以下组合式 API 访问生命周期:onMountedonUpdatedonUnmounted- 等。
- 在
-
渲染函数
- 开发者可以不写模板,直接使用
h()函数编写render函数来创建 VNode,提供更高的编程灵活性。
- 开发者可以不写模板,直接使用
-
自定义指令
- 允许开发者注册可复用的指令,用于对底层 DOM 元素进行直接操作。

浙公网安备 33010602011771号