参考答案:
在 Vue3 中,父组件不能直接“监听”子组件生命周期钩子(不像 DOM 事件那样天然可监听),但可以通过几种设计模式间接感知或控制子组件生命周期阶段。
本质上,这是一个 组件通信 + 生命周期暴露策略 的问题。
生命周期属于子组件内部行为,因此应由 子组件在生命周期中主动向父组件发送事件。
1<script setup> 2import { onMounted, onUnmounted } from 'vue' 3 4const emit = defineEmits(['mounted', 'unmounted']) 5 6onMounted(() => { 7 emit('mounted') 8}) 9 10onUnmounted(() => { 11 emit('unmounted') 12}) 13</script>
1<Child 2 @mounted="handleChildMounted" 3 @unmounted="handleChildUnmounted" 4/>
1function handleChildMounted() { 2 console.log('子组件已挂载') 3}
这是 生产环境标准方案。
ref + expose 访问子组件状态如果父组件需要在某些时机判断子组件是否已经初始化,可以让子组件暴露状态。
1<script setup> 2import { ref, onMounted } from 'vue' 3 4const ready = ref(false) 5 6onMounted(() => { 7 ready.value = true 8}) 9 10defineExpose({ 11 ready 12}) 13</script>
1<Child ref="childRef" />
1const childRef = ref(null) 2 3watchEffect(() => { 4 if (childRef.value?.ready) { 5 console.log('子组件 mounted 完成') 6 } 7})
Vue 内部其实支持 vnode hook:
1<Child 2 @vue:mounted="onMounted" 3 @vue:unmounted="onUnmounted" 4/>
1<Child @vue:mounted="handleMounted" />
这是 Vue3 提供的 vnode 生命周期监听,很多人不知道。
可监听:
| 事件 | 含义 |
|---|---|
@vue:mounted | 子组件挂载完成 |
@vue:updated | 子组件更新 |
@vue:unmounted | 子组件卸载 |
当组件层级很深时:
子组件生命周期中修改 provide 的状态:
1onMounted(() => { 2 injectedStore.childReady = true 3})
父组件监听该响应式状态。
适用于:
1childRef.value.$.isMounted
问题:
最近更新时间:2026-02-24

题库维护不易,您的支持就是我们最大的动力!