一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情。
系列介绍
经常会被面试官问到这个怎么实现,或者怎么实现xx?
有些功能或者效果没有做过或者实现过,回答不出来,场面一度有些尴尬
于是打算出一个怎么实现系列,来实现xx功能或者xx效果,以此来提升自己的实战效果和能力。
本系列是一个开放系列,我实现的不一定是最好的,欢迎大家交流讨论
场景
面试官:vue的生命周期有了解吧,有这么一个场景,父组件里有一个子组件。子组件销毁了,那父组件怎么监听到子组件销毁的生命周期?
(思考了一会)
我:呃...这个我没有监听过
面试官:...
查阅资料
不会实现没有关系,后面马上去查阅相关资料,学习一下怎么实现父组件监听子组件的生命周期
实现
先使用vue-cli脚手架快速创建一个基本vue工程出来
然后创建两个组件:parent.vue和child.vue
在parent组件里引入child组件
parent.vue
<template>
<div>
<child />
</div>
</template>
<script>
import child from './child1.vue'
export default {
components: {
child,
},
}
</script>
child.vue
<template>
<div>子组件</div>
</template>
<script>
export default {}
</script>
再在App.vue里面引入parent组件
<template>
<div id="app">
<parent />
</div>
</template>
<script>
import parent from './components/parent.vue'
export default {
name: 'App',
components: {
parent,
},
}
</script>
好的,整个基础工程搭建完毕。接下来开始实现过程
方案一 在子组件的生命周期里emit一个事件出来
-
在子组件里的destroyed生命周期里,emit一个事件出来
destroyed() { this.$emit('destroy') }, -
在父组件里监听对应事件
<div> <child @destroy="destroyHandle" /> </div> -
在父组件里增加一个按钮,来销毁子组件
同时完善一下父组件代码
<template> <div> <child v-if="show" @destroy="destroyHandle" /> <button @click="clickHandler">销毁子组件</button> </div> </template> <script> import child from './child.vue' export default { components: { child, }, data() { return { show: true, } }, methods: { destroyHandle() { console.log('子组件销毁了') }, clickHandler() { this.show = false }, }, } </script>到浏览器查看效果
点击按钮后,可以看到控制台打印出子组件销毁了
说明可以监听到子组件的destroyed生命周期,说明该方案可行
方案二 vue会把组件对应的生命周期hook暴露出来,监听对应的hook即可
改造一下上面parent.vue和child.vue的代码
parent.vue
<template>
<div>
<child v-if="show" @hook:destroyed="destroyHandle" />
<button @click="clickHandler">销毁子组件</button>
</div>
</template>
<script>
import child from './child.vue'
export default {
components: {
child,
},
data() {
return {
show: true,
}
},
methods: {
destroyHandle() {
console.log('子组件销毁了')
},
clickHandler() {
this.show = false
},
},
}
</script>
child.vue
<template>
<div>子组件</div>
</template>
<script>
export default {}
</script>
到浏览器点击按钮,可以看到控制台打印除 子组件销毁了
说明这种方案也是可行的
小结
以上两中方案都是可行的,父组件可以监听到子组件的生命周期
我暂时只想到这两种方案