Vue lifecycle 生命周期详解

本文章主要介绍在全局混入、多个混入情况下初始化渲染的生命周期、更新生命周期以及销毁的生命周期。

项目地址:vue-lifecycle
演示地址:vue-lifecycle

目录说明

src/mixin 目录下放的是不同组件或者页面的混入。

文件说明
allMixin.js为全局混入
appAMixin.jsapp.vue 的 AMixin
appBMixin.jsapp.vue 的 BMixin
homeAMixin.jsHome.vue 的 AMixin
homeBMixin.jsHome.vue 的 BMixin
homeAComponentAMixin.jsHome.vue 中的 HomeAComponent.vue 组件的 AMixin
homeAComponentBMixin.jsHome.vue 中的 HomeAComponent.vue 组件的 BMixin
homeBComponentAMixin.jsHome.vue 中的 HomeBComponent.vue 组件的 AMixin
homeBComponentBMixin.jsHome.vue 中的 HomeBComponent.vue 组件的 BMixin

mixin 混入说明

上面目录中提到的 mixin 文件都是 先混入 AMixin 再混入 BMixin。

例如App.vue

export default {
  name: 'App',
  mixins: [appAMixin, appBMixin], // 这里的顺序决定了对应文件内的生命周期执行顺序
  ...
}

console 说明

页面初始化时的 console

页面初始化时的 console

结论:

  1. 全局混入会在之后每一个创建的 Vue 实例的时候优先执行全局混入的生命周期。

    例如:

    allMixin: beforeCreate
    allMixin: created
    route: / + allMixin: beforeMount
    allMixin: beforeCreate
    route: / + appAMixin: beforeCreate
    route: / + appBMixin: beforeCreate
    / + app: beforeCreate
    allMixin: created
    route: / + appAMixin: created
    route: / + appBMixin: created
    route: / + app: created
    
  2. 组件mixins的生命周期早于当前组件的生命周期执行:

    例如:

    route: / + appAMixin: beforeCreate
    route: / + appBMixin: beforeCreate
    route: / + app: beforeCreate
    
  3. 组件mixins配置混入的顺序决定混入的生命周期先后执行。

    例如原本输出顺序为:

    route: / + appAMixin: beforeCreate
    route: / + appBMixin: beforeCreate
    route: / + app: beforeCreate
    

    修改App.vue中的顺序:

    export default {
      name: 'App',
      mixins: [appBMixin, appAMixin],
      ...
    }
    

    输出顺序就变更为:

    route: / + appBMixin: beforeCreate
    route: / + appAMixin: beforeCreate
    route: / + app: beforeCreate
    
  4. 父子组件加载渲染过程时的生命周期:

    1. 父组件: beforeCreate -> created -> beforeMount
    2. 子组件: -> beforeCreate -> created -> beforeMount -> mounted
    3. 父组件: -> mounted

    这里先把全局混入及Home.vue中的混入去除,看起来会更清楚,例如:

    route: / + home: beforeCreate
    route: / + home: created
    route: / + home: beforeMount
    route: / + HomeAComponent: beforeCreate
    route: / + HomeAComponent: created
    route: / + HomeAComponent: beforeMount
    route: / + HomeBComponent: beforeCreate
    route: / + HomeBComponent: created
    route: / + HomeBComponent: beforeMount
    route: / + HomeAComponent: mounted
    route: / + HomeBComponent: mounted
    route: / + home: mounted
    
  5. 兄弟组件加载渲染过程时的生命周期:

    1. 兄组件:beforeCreate -> created -> beforeMount
    2. 弟组件:-> beforeCreate -> created -> beforeMount
    3. 兄组件:-> mounted
    4. 弟组件:-> mounted

    例如:

    route: / + HomeAComponent: beforeCreate
    route: / + HomeAComponent: created
    route: / + HomeAComponent: beforeMount
    route: / + HomeBComponent: beforeCreate
    route: / + HomeBComponent: created
    route: / + HomeBComponent: beforeMount
    route: / + HomeAComponent: mounted
    route: / + HomeBComponent: mounted
    

路由切换时的 console

路由切换至about时的 console:
路由切换至about时的 console

路由切换至home时的 console:
路由切换至home时的 console

结论:

  1. 路由切换时会触发App.vuebeforeUpdate -> 当前路由下的组件的创建(生命周期按照父子组件及兄弟组件到最后的一个组件的beforeMount) -> 销毁上个路由及其组件 -> App.vueupdated

  2. 父子组件销毁过程:

    1. 父组件: beforeDestroy
    2. 子组件: -> beforeDestroy -> destroyed
    3. 父组件: -> destroyed
  3. 兄弟组件销毁过程:

    1. 兄组件: beforeDestroy -> destroyed
    2. 弟组件: beforeDestroy -> destroyed

组件 v-if 和 v-show 的切换

Home.vue 中点击 home按钮A/home按钮B 使用 v-if/v-show 切换显示隐藏 组件A/组件B。

v-if 组件A:
v-if 组件A

v-show 组件B:
v-show 组件B

结论:

  1. v-if 切换隐藏组件的时候会依次触发:

    1. 父组件: beforeUpdate
    2. v-if作用的组件:展示的时候会走初始化渲染的生命周期,隐藏的时候会走销毁的生命周期
    3. 父组件: updated
  2. v-show 切换隐藏组件的时候会依次触发:

    1. 父组件: beforeUpdate
    2. 父组件: updated

组件内 v-if 和 v-show 的切换

HomeAComponent.vue 中点击 按钮1/按钮2 使用 v-if/v-show 切换显示隐藏 show content1/show content2。

v-if show content1:
v-if show content1

v-show show content2:
v-show show content2

结论:

  1. 仅触发当前组件的 beforeUpdate -> updated
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue.js 是一个流行的 JavaScript 框架,它有一套完整的生命周期钩子函数,用于在组件的不同阶段执行特定的操作。下面是 Vue 组件的生命周期钩子函数及其对应的阶段: 1. beforeCreate: 在实例被创建之前调用,此时 data 和 methods 等属性还未初始化。 2. created: 在实例创建完成后调用,此时可以访问 data 和 methods,并可以进行一些初始化操作。 3. beforeMount: 在编译模板之前调用,此时模板还未被渲染成真实的 DOM。 4. mounted: 在编译模板之后调用,此时模板已经被渲染成真实的 DOM,并且可以进行 DOM 操作。 5. beforeUpdate: 在数据更新之前调用,此时可以进行一些更新准备工作。 6. updated: 在数据更新之后调用,此时 DOM 已经被更新。 7. beforeDestroy: 在实例销毁之前调用,此时实例仍然可用。 8. destroyed: 在实例销毁之后调用,此时实例及其所有的监听器都已被移除。 下面是一个简单的示例代码,演示了 Vue 组件的生命周期函数的使用: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Vue Lifecycle Demo</title> </head> <body> <div id="app"> {{ message }} </div> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script> new Vue({ el: '#app', data: { message: 'Hello, Vue!' }, beforeCreate() { console.log('beforeCreate hook') }, created() { console.log('created hook') }, beforeMount() { console.log('beforeMount hook') }, mounted() { console.log('mounted hook') }, beforeUpdate() { console.log('beforeUpdate hook') }, updated() { console.log('updated hook') }, beforeDestroy() { console.log('beforeDestroy hook') }, destroyed() { console.log('destroyed hook') } }) </script> </body> </html> ``` 你可以在浏览器中打开该示例,然后在控制台中查看不同生命周期阶段的输出信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值