0

0

Vue.js渲染器中Mount与Patch函数的递归执行逻辑剖析

舞姬之光

舞姬之光

发布时间:2026-03-18 09:31:03

|

190人浏览过

|

来源于php中文网

原创

mount 和 patch 通过递归调用、类型分发与子节点遍历构成统一渲染链:mount 从根节点深度挂载,patch 基于双树比对条件递归更新,二者均以 children 为驱动,遇叶子节点或空 children 终止。

vue.js渲染器中mount与patch函数的递归执行逻辑剖析

Vue.js 渲染器中,mountpatch 是两个核心函数,它们共同构成虚拟 DOM 的首次挂载与后续更新流程。二者并非独立运行,而是通过**递归调用 + 类型分发 + 子节点遍历**形成统一的执行链条。理解其递归逻辑,关键在于把握“谁调谁”“何时递归”“递归边界”三个维度。

mount 函数:从根节点开始的深度递归挂载

mount 负责将虚拟节点(VNode)首次渲染为真实 DOM 并插入容器。它本身不直接操作 DOM,而是根据 VNode 类型分发到对应挂载函数(如 mountElementmountComponent),再由这些函数内部触发子节点的递归挂载。

  • 遇到普通元素节点(type === string),调用 mountElement → 创建 DOM 元素 → 遍历 children → 对每个子 VNode 调用 mount
  • 遇到组件节点(type 是对象或函数),调用 mountComponent → 创建组件实例 → 触发组件 setuprender → 得到子 VNode → 再次调用 mount 挂载子树
  • 遇到文本节点(type === Text),直接创建文本节点并插入,不递归

patch 函数:双树比对中的条件递归更新

patch 在响应式数据变化后被调用,用于对比新旧 VNode 并更新真实 DOM。它同样按类型分发,但递归行为取决于“是否需要更新子节点”:

  • 元素节点:若新旧节点 typekey 相同,进入“就地更新”流程 → 先 patch 属性/事件 → 再根据子节点类型决定是否递归:
      • 新旧都有 children → 进入 patchChildren,按模式(text / array / mixed)分别处理,并在遍历过程中对可复用的子节点再次调用 patch
      • 旧有 children、新无 → 卸载全部旧子节点(不递归 mount,而是 unmount)
      • 新有 children、旧无 → 对每个新子节点调用 mount
  • 组件节点:先判断是否需更新组件实例(props / slots 等)→ 若需更新,则调用组件实例的 update 方法 → 组件重新 render 得到新子 VNode → 对新子树调用 patch(可能再次进入 mount 或 patch 分支)

递归的统一入口与终止条件

整个渲染流程的递归始终围绕一个入口函数展开:在 Vue 3 中是 patch(mount 实际也是通过 patch(null, n2, container) 启动)。递归的启动与延续完全由当前 VNode 的 children 字段驱动:

MidReal AI
MidReal AI

MidReal AI是一款革命性的AI小说生成工具,同时也是一个文本互动冒险游戏平台。

下载

立即学习前端免费学习笔记(深入)”;

  • 启动点:根 VNode 的 patch 调用
  • 延续点:当子节点存在且需挂载/更新时,对每个子 VNode 显式调用 patchmount
  • 终止点:遇到没有 children 的叶子节点(如纯文本、空 Fragment、无子节点的元素),或 childrennull/undefined,递归自然停止

关键细节:递归不是无脑遍历,而是受控分支

很多人误以为 mount/patch 是简单 for 循环递归,实际上每次调用前都经过严格判断:

  • 是否跳过更新(dynamicChildren 优化、v-once 标记)
  • 是否需要卸载旧子树(unmount 逻辑常与递归并存,但方向相反)
  • 是否启用静态提升(hoistStatic 后,静态子树在 patch 阶段直接跳过,不进入递归)
  • Fragment 节点会扁平化子节点,使递归跳过中间层,直接作用于真实子元素

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
vue.js为什么报错
vue.js为什么报错

vue.js报错的原因:1、语法错误;2、组件使用不当;3、数据绑定问题;4、生命周期钩子使用不当;5、插件或依赖问题;6、路由配置错误;7、异步操作处理不当等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

129

2024.03.11

vue.js插槽有哪些用
vue.js插槽有哪些用

vue.js插槽的作用:1、提高组件的可重用性;2、实现组件的灵活布局;3、实现组件间的数据传递和交互;4、促进组件的解耦和模块化。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

187

2024.03.11

vue.js怎么带参数跳转
vue.js怎么带参数跳转

vue.js带参数跳转的方法:1、定义路由;2、在组件中使用路由参数;3、进行带参数的跳转。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

98

2024.03.11

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1091

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

256

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1154

2024.03.01

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

532

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

596

2023.07.28

抖漫入口地址合集
抖漫入口地址合集

本专题整合了抖漫入口地址相关合集,阅读专题下面的文章了解更多详细地址。

17

2026.03.17

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Vue 教程
Vue 教程

共42课时 | 9.7万人学习

Vue3.x 工具篇--十天技能课堂
Vue3.x 工具篇--十天技能课堂

共26课时 | 1.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号