欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 培训 > vue2和vue3组件如何监听子组件生命周期

vue2和vue3组件如何监听子组件生命周期

2025/5/19 9:55:38 来源:https://blog.csdn.net/qq_25416827/article/details/147670944  浏览:    关键词:vue2和vue3组件如何监听子组件生命周期

在 Vue 中监听子组件的生命周期是一个常见需求,但 Vue 官方并不直接推荐这么做,因为这会打破组件的封装性。但在**一些特定场景(如自动化监控、封装逻辑复用)**下仍是有意义的。

下面分别讲解 Vue 2Vue 3 中如何监听 子组件的生命周期


✅ Vue 2 中监听子组件生命周期

Vue 2 没有内建的方式监听子组件的生命周期,但可以用以下方式实现:

✅ 方法一:在子组件中使用 $emit 通知父组件

<!-- Child.vue -->
<template><div>子组件</div></template>
<script>
export default {mounted() {this.$emit('mounted')},destroyed() {this.$emit('destroyed')}
}
</script>
<!-- Parent.vue -->
<template><Child @mounted="onChildMounted" @destroyed="onChildDestroyed" />
</template><script>
import Child from './Child.vue'export default {components: { Child },methods: {onChildMounted() {console.log('子组件挂载了')},onChildDestroyed() {console.log('子组件被销毁了')}}
}
</script>

✅ 方法二:通过 ref 调用子组件方法(变通方案)

<Child ref="child" />

父组件中在 mounted 钩子中访问子组件:

mounted() {this.$refs.child.doSomething()
}

✅ Vue 3 中监听子组件生命周期

Vue 3 引入了 defineExpose,并支持 onMounted 等生命周期钩子组合式使用。监听子组件生命周期的方法如下:

✅ 方法一:事件方式(推荐)

<!-- Child.vue -->
<script setup>
import { onMounted, onUnmounted, defineEmits } from 'vue'const emit = defineEmits(['mounted', 'unmounted'])onMounted(() => emit('mounted'))
onUnmounted(() => emit('unmounted'))
</script>
<!-- Parent.vue -->
<template><Child @mounted="onChildMounted" @unmounted="onChildUnmounted" />
</template><script setup>
import Child from './Child.vue'function onChildMounted() {console.log('子组件挂载')
}function onChildUnmounted() {console.log('子组件卸载')
}
</script>

✅ 方法二:ref + expose(组合式 API)

<!-- Child.vue -->
<script setup>
import { onMounted, onUnmounted, ref } from 'vue'const status = ref('idle')
onMounted(() => {status.value = 'mounted'
})defineExpose({ status })
</script>
<!-- Parent.vue -->
<template><Child ref="childRef" />
</template><script setup>
import { onMounted, ref } from 'vue'
import Child from './Child.vue'const childRef = ref(null)onMounted(() => {console.log('子组件状态:', childRef.value?.status)
})
</script>

✅ 总结对比

方法Vue 2Vue 3推荐用途
$emit 生命周期监听子组件挂载/卸载(最通用)
ref + expose访问子组件状态或方法
$refs + 方法调用访问子组件实例(临时方案)

是否需要我给你封装一个 useChildLifecycle 的组合式钩子,让父组件自动监听多个子组件的生命周期?

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词