Vue生命周期详解

一、生命周期的概念

        生命周期,顾名思义就是一个vue组件从 创建销毁 的过程。 

 二、钩子函数

        Vue中有许多内置函数,是随着组件生命周期阶段自动执行的 。我们可以通过钩子函数来在特定的某个生命周期的阶段执行特定的操作,比如能够在 created 中发起 ajax 请求,从而能够初始化 data 数据渲染页面。

        生命周期可以分为四个阶段:

  • 初始化阶段
  • 挂载阶段
  • 更新阶段
  • 销毁阶段

         每个阶段又有相对应的方法,分别为:

阶段方法名方法名
初始化beforeCreatecreated
挂载beforeMountmounted
更新beforeUpdateupdated
销毁beforeDestroydestroyed

官方文档:Vue 实例 — Vue.js

                                                                 生命周期实例图

 三、分步详解

 1. 初始化阶段             

  1. new Vue() – Vue实例化(组件也是一个小的Vue实例)
  2. Init Events & Lifecycle – 初始化事件和生命周期函数
  3. beforeCreate – 生命周期钩子函数被执行
  4. Init injections&reactivity – Vue内部添加data和methods等
  5. created – 生命周期钩子函数被执行, 实例创建----在此函数能够获取到数据,但获取不到真实DOM元素,可以在此进行网络请求或者注册全局事件
  6. 接下来是编译模板阶段 –开始分析
  7. Has el option? – 是否有el选项 – 检查要挂到哪里

    没有就调用 $mount() 方法,有就继续检查 template 选项

 

 2.挂载阶段

  1.  进行检查是否有 template 选项,有就编译 template 返回 render 渲染函数,没有则编译 el选项对应标签作为 template (要渲染的模板)。
  2. 虚拟DOM挂载成真实DOM之前 beforeMount --- 钩子函数被执行,预处理 data 数据,updated 不会被触发
  3. Create ---把虚拟DOM和要渲染的数据一并挂载
  4. 真实DOM挂载完成
  5. mounted --- 钩子函数被执行,可以在此函数中获取挂载后真实DOM的数据

 3.更新阶段

  1. 当 data 里的数据被改变后,更新DOM之前执行
  2. beforeUpdate -钩子函数被执行,在此只能拿到最初的DOM元素
  3.  虚拟DOM重新渲染,打补丁到真实DOM
  4. updated---钩子函数被执行
  5. 当有 data 数据又有改变-重复这个循环

4.销毁阶段

  1.  当 $destiry() 被调用 - 比如用 v-if 时组件DOM被移除
  2. beforeDestroy - 钩子函数被执行
  3. 销毁 watch 等数据监视器、子组件和事件侦听器
  4. 实例被销毁后,触发最后一个钩子函数 - destroyed

5.不常用的钩子函数 

  •  使用 keep-alive 组件缓存中组件不再创建和销毁, 而是激活和非激活

    1. activated - 激活

    2. deactivated - 失去激活状态


    这两个钩子函数一般是一块配合使用的,组件切换会导致组件被频繁销毁和重新创建, 性能不高,这时候我们就可以用 keep-alive 组件配合这两个钩子函数来控制组件的激活与不激活,该钩子在服务器端渲染期间不被调用。

6.自定义指令的钩子函数

全局下的自定义指令

 input标签中:  v-指令名:属性名.修饰符='值'
                         v-on:keyup.enter="方法"
Vue.directive(’指令名‘,{
    指令生命周期

  1.     bind: 绑定时,自定义指令绑定于相应dom时执行,类似于vue生命周期的beforeMount
     
        bind(dom,obj,vnode){
               dom:指令所在dom节点
               obj:{
                       属性名,
                       修饰符,
                       值(value)
                }
                vnode:虚拟dom节点信息
                     context拿到当前指令所在组件实例对象        
        },
  2.     inserted:渲染完成时执行,指令所在dom添加到父节点时执行,类似于mounted
     inserted(dom,obj,vnode){ },
  3.     update:更新时,不保证更新完成(指令所在组件有更新时执行),不保证该更新和当前指令所在dom有关
        update(dom,obj,vnode){
            dom:当前指令所在dom
            obj:{
                属性名
                修饰符
                值   
            }
            vnode:context:获取指令所在组件的实例对象
        }
  4.     componentUpdated:更新完成时,指令所在组件更新完成(包括子组件也更新完成),类似于updated
  5.     unbind:解绑,类似于beforeDestroy

})
                                             --------------------------------------------------------------------仅仅是类似

局部自定义指令 

directives:{
    指令名:{生命周期}
}

7.路由的钩子函数

  •  全局路由钩子
    □ beforeEach
            前置守卫
    □ afterEach
            已进入相应路由时执行
    □ beforeResolve
            全局解析守卫,解析钩子
  •  组件内导航钩子
    ♦ 路由所对应组件钩子(路由配置中的component所对应组件)
             ■ beforeRouteEnter;进入前,进入路由所对应组件前,在beforeCreate前产生的,它不能使用实例化对象this
     
            beforeRouteEnter((to,from,next)=>{
                next((vm)=>{
                    vm:当前组件的实例对象
                })
            })

             ■ beforeRouteUpdate:更新前,路由更新了,但是路由所对应组件不变,它是更新前触发,更新没有完成,如果需要获取更新完成后信息,要加$nextTick
             ■ beforeRouteLeave:离开前,切换页面离开前就会触发,它在beforeDestroy前执行
    ♦ 路由配置所对应钩子
             beforeEnter:读取路由配制前会执行该钩子

执行先后
   beforeEach===>beforeEnter===>beforeRouteEnter===>beforeResolve===>afterEach
更新时执行先后
   beforeEach===>beforeRouteUpdate===>afterEach

 beforeDestroy执行时间节点
A路由跳转到B路由时它们A组件与B组件执行的生命周期勾子
beforeCreate(B)===>created(B)===>beforeMount(B)===>beforeDestroy(A)===>
destroyed(A)===>mounted(B)
父组件与子组件生命周期执行先后
beforeCreate(父)===>created(父)===>beforeMount(父)===>beforeCreate(子)===>
created(子)===>beforeMount(子)===>mounted(子)===>mounted(父)

  • 9
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值