在 Vue 中,父组件与子组件的生命周期钩子执行顺序是怎样的?请分别说明挂载阶段、更新阶段和销毁阶段的具体顺序。
考察说明
考查对 Vue 组件生命周期钩子执行顺序的理解,以及父子组件通信时的生命周期交互。
回答思路
- 【回答框架 1】在 Vue 中,生命周期钩子遵循一定的顺序。挂载阶段顺序:父组件 beforeCreate → 父组件 created → 父组件 beforeMount → 子组件 beforeCreate → 子组件 created → 子组件 beforeMount → 子组件 mounted → 父组件 mounted。
- 【回答框架 2】更新阶段:当父组件更新导致子组件更新时,顺序为:父组件 beforeUpdate → 子组件 beforeUpdate → 子组件 updated → 父组件 updated。若子组件自身更新,则只有子组件的 beforeUpdate 和 updated。
- 【回答框架 3】销毁阶段:父组件 beforeDestroy → 子组件 beforeDestroy → 子组件 destroyed → 父组件 destroyed。
- 【回答框架 4】核心机制是 Vue 的渲染和挂载是从父到子递归进行的,但 mounted 钩子会在子组件挂载完成后才触发父组件的 mounted,因此父组件的 mounted 总是晚于子组件的 mounted。
- 【关键点 1】挂载阶段:父 beforeCreate → 父 created → 父 beforeMount → 子 beforeCreate → 子 created → 子 beforeMount → 子 mounted → 父 mounted
- 【关键点 2】更新阶段:父 beforeUpdate → 子 beforeUpdate → 子 updated → 父 updated
- 【关键点 3】销毁阶段:父 beforeDestroy → 子 beforeDestroy → 子 destroyed → 父 destroyed
- 【关键点 4】原因:组件树递归渲染,子组件先完成挂载,父组件的 mounted 才触发。
- 【易错点 1】容易混淆 beforeMount 和 mounted 的顺序,特别是在嵌套组件中,父组件的 beforeMount 先于子组件的 beforeCreate。
- 【易错点 2】不要在父组件的 mounted 中假设子组件已经挂载完成,实际上此时子组件已挂载,但父组件可能还未完全挂载(在 Vue 3 中应该考虑副作用时机)。