vue生命周期以及父子组件生命周期,多组件与keep-alive交叉生命周期(2)

144 阅读2分钟

关于vue生命周期的一些思考

"再见少年拉满弓,不惧风雨不惧风"

上一篇文章我们简单的介绍了一下vue的生命周期,还有vue父子间组件生命周期的执行顺序

难么这一篇文章让我们从一个面试题开始,我们面试的时候经常会被问到:讲一vue的生命周期,这是我们如果只是简单的讲一讲上一篇文章中的一些知识,难免显得有些匮乏

ps:那么我们应该从什么角度切入,使问题更加深入一些呢?

首先我们可以讲一下,进入组件时生命周期的调用顺序,第一次进入组件的时候会调用 beforecreate 、created 、 beforemount 、mounted 这几个生命周期,当然如果我们使用keep-alive来对组件进行缓存的话,还会额外调用actived组件

那么讲到这面试官可能会问,如果再次进入keep-alive缓存的页面,以及离开组件的话会调用哪些生命周期函数呢?

首先keep-alive缓存页面之后,再次进入keep-alive的页面只会调用actived这个生命周期函数,离开组件的话如果页面没有被keep-alive缓存,那么会调用destoryed这个回调函数,如果被keep-alive缓存的话呢,离开页面会调用deactived这个生命周期函数,大家一定要记牢

兄弟组件之间的生命周期执行顺序

那么兄弟组件之间生命周期的调用顺序又是什么样的呢? 假设我们有两个子组件,如下: 父组件:

<template>
    <div>
        <photo></photo>
        <ttext></ttext>
       
        验证加入keep-alive后的执行顺序
          <!-- <keep-alive>
            <photo></photo>
        </keep-alive>
         <keep-alive>
            <ttext></ttext>
        </keep-alive> -->

        <!-- <keep-alive>
            <photo></photo>
        </keep-alive>
        <ttext></ttext> -->
    </div>
</template>

<script>

import photo from './zizujian/photo.vue'
import ttext from './zizujian/text.vue'

export default {
    data() {
        return {
            flag: 'a',
        }
    },
    components: {
        photo,
        ttext
    },
    beforeCreate() {
        console.log('父组件beforecreate');
    },
    created() {
        console.log('父组件created');
    },
    beforeMount() {
        console.log('父组件beforeMount');
    },
    mounted() {
        console.log('父组件mounted')
    },
    activated() {
        console.log('父组件activated')
    },
    deactivated() {
        console.log('父组件deactivated');
    },
    beforeDestroy() {
        console.log('父组件beforeDestroy');
    },
    destroyed() {
        console.log('父组件destroyed');
    }

}
</script>

<style>
</style>

A:图片

<template>
   <div>
      图片
   </div>
</template>

<script>
export default {
   beforeCreate() {
      console.log('图片beforecreate');
   },
   created() {
      console.log('图片created');
   },
   beforeMount() {
      console.log('图片beforeMount');
   },
   mounted() {
      console.log('图片mounted')
   },
   activated() {
      console.log('图片activated')
   },
   deactivated() {
      console.log('图片deactivated');
   },
   beforeDestroy() {
      console.log('图片beforeDestroy');
   },
   destroyed() {
      console.log('图片destroyed');
   }
}

</script>

<style>
</style>

B:文字

<template>
   <div>
      文字
   </div>
</template>

<script>
export default {

   beforeCreate() {
      console.log('文字beforecreate');
   },
   created() {
      console.log('文字created');
   },
   beforeMount() {
      console.log('文字beforeMount');
   },
   mounted() {
      console.log('文字mounted')
   },
   activated() {
      console.log('文字activated')
   },
   deactivated() {
      console.log('文字deactivated');
   },
   beforeDestroy() {
      console.log('文字beforeDestroy');
   },
   destroyed() {
      console.log('文字destroyed');
   }

}

</script>

<style>
</style>

执行的顺序如下:

image.png

这就是子组件不在keep-alive缓存的执行顺序

在keep-alive缓存后的执行顺序

得到的结果是这样的

image.png

兄弟组件的actived执行在兄弟的mounted回调函数之前

这就是兄弟组件之间的回调函数顺序,如果有不对的地方,希望大家批评指正

8与15日 wxb 写在230