Vue子组件更新嵌入父组件响应式流程:父beforeUpdate→子beforeUpdate→子updated→父updated;依赖props才触发,v-if销毁重建、v-show仅显隐;updated中勿改响应式数据。

Vue 渲染器在子组件更新时,并不是孤立触发它的生命周期,而是将其嵌入父组件的响应式更新流程中统一调度。整个过程由 Vue 的响应式系统驱动,依赖依赖收集、队列更新和异步刷新机制。
子组件更新被纳入父组件的更新周期
当父组件数据变化(如 props 更新或父级 reactive 状态变更),Vue 会触发父组件的 beforeUpdate,然后递归遍历其子组件树,对每个受影响的子组件依次执行:
- 子组件的 beforeUpdate(此时新 props 已同步,但 DOM 尚未重渲染)
- 子组件重新执行 render 函数,生成新的虚拟 DOM
- 对比新旧 VNode,打补丁更新真实 DOM
- 子组件的 updated 被调用(DOM 已完成更新)
最后才触发父组件的 updated。这意味着子组件的更新完全发生在父组件的更新“窗口”内,且顺序严格为:父 beforeUpdate → 子 beforeUpdate → 子 updated → 父 updated。
更新触发的前提是依赖关系成立
子组件能否响应更新,取决于它是否真正依赖父组件传入的数据:
立即学习“前端免费学习笔记(深入)”;
- 如果子组件 用了 props 或 computed 中依赖 props 的值,那么父组件状态变化会触发子组件重渲染
- 如果子组件只用本地 data、不读取任何父级响应式数据,父组件更新时它不会触发 beforeUpdate/updated
- 使用
v-if或v-show控制子组件显隐,也会影响生命周期是否执行(v-if会销毁重建,v-show仅切换 display)
注意异步与批量更新的影响
Vue 默认将同一事件循环内的多次状态变更合并为一次更新,因此:
- 连续修改多个响应式字段,最终只触发一次 beforeUpdate → updated 流程
- 子组件的 updated 总是在所有子组件 DOM 更新完成后才调用,不保证各子组件 updated 的绝对先后顺序(但 beforeUpdate 一定按模板顺序)
- 若需在 DOM 更新后立即操作,应在 updated 中配合
this.$nextTick(),确保获取到最新渲染结果
避免在 updated 中修改响应式数据
子组件的 updated 钩子用于副作用(如聚焦 input、初始化第三方库),不应在此处更改响应式数据,否则会再次触发更新,导致无限循环:
- 错误示例:
updated() { this.count++ }(若 count 被模板使用) - 正确做法:把状态变更逻辑前置到 beforeUpdate,或通过事件通知父组件处理


















