Vue 生命周期详解

1.new Vue()
2.初始化配置,初始化实例属性options、parent、refs、events等

  _init(options)
         vm.$options = mergeOptions(
            resolveConstructorOptions(vm.constructor),
            options || {},
          )
        initLifecycle(vm)
            vm.$parent = vm.$options.parent
            vm.$root = parent ? parent.$root : vm
            vm.$children = []
            vm.$refs = {}
            vm._watcher = null
            vm._inactive = null
            vm._directInactive = false
            vm._isMounted = false
            vm._isDestroyed = false
            vm._isBeingDestroyed = false
            
        initEvents(vm)
            vm._events = Object.create(null)
            vm._hasHookEvent = false
            
        initRender(vm)
            // functional静态组件 和 正常组件的解析,生成Vnode
            vm._c = (a, b, c, d) => createElement(vm, a, b, c, d, false)
            vm.$createElement = (a, b, c, d) => createElement(vm, a, b, c, d, true)

3. beforCreate执行
        callHook(vm, 'beforeCreate')
        
4. 获取inject属性并响应式转化  

  initInjections(vm) // resolve injections before data/props  初始化inject属性并响应式转化
        initState(vm)
            initProps(vm, opts.props)  // 初始化props属性转化为响应式,并代理到vue实例对象
                defineReactive(props, key, value)
                proxy(vm, `_props`, key)
            initMethods(vm, opts.methods) //初始化metheds
            initData(vm)  //初始化data属性转化为响应式,并代理到vue实例对象
            initComputed(vm, opts.computed) //初始化computed,并创建每个计算属性的warcher实例对象存入_computedWatchers对象,并响应式处理
                 watchers[key] = new Watcher(
                    vm,
                    getter || noop,
                    noop,
                    computedWatcherOptions = { lazy: true }
                  )
                  defineComputed //初始化计算属性的并代理到vue实例对象
            initWatch(vm, opts.watch) //初始化watcher
            
       initProvide(vm) // resolve provide after data/props //初始化provide

         
5. created执行        
        callHook(vm, 'created')
     
6. 编译模板template 生成render()函数
        compileToFunctions  编译模板template 生成render()函数
        
7. beforMount执行        
        
8. 执行_render()生成VNode,并更新渲染到页面
    vm._render()     //    执行_render()生成VNode
    vm._update(Vnode) //对比VNode并编译成HTML代码,替换到页面
        vm.$el = vm.__patch__(vm.$el, vnode, hydrating, false)   //不存在旧的VNode
        vm.$parent.$el = vm.$el
    
9. mounted执行    
    callHook(vm, 'mounted')    
    
7.change data 触发notify()派发更新,将所有的依赖函数添加到队列

    
8. beforeUpdate执行
    callHook(vm, 'beforeUpdate')

9. 执行依赖函数,重新调用render函数生成VNode,比较VNode与旧的VNode并更新VNode,并更新渲染到页面
    watcher.run()    
    vm._render()     //    执行_render()生成VNode
    vm._update(Vnode) //对比VNode并编译成HTML代码,替换到页面
        vm.$el = vm.__patch__(prevVnode, vnode)  //存在旧的VNode
        vm.$el.__vue__ = vm;
    
10. updated执行
    callHook(vm, 'beforeUpdate')    
    
11. 手动触发销毁 app.$destroy();

12. beforeDestroy执行
    vue 实例销毁前调用,可用于销毁定时器,解绑全局时间 销毁插件对象等

13. destroyed执行
    Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。

activate:组件被激活的状态下使用的生命周期钩子

deactivated:组件停止使用时调用

        只有组件在<keep-alive>内被切换时,才有activate和deactivated

<keep-alive> 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。

<keep-alive> 是一个抽象组件:它自身不会渲染一个 DOM 元素,也不会出现在父组件链中。

    情境一:离开当前路由,会直接调用;

           当前路由不使用 <keep-alive> 缓存,离开当前路由会直接调用 beforeDestroy 和 destroyed 销毁

    情景二:离开当前路由,不会直接调用,需要程序控制调用;

           当前路由使用 <keep-alive> 缓存,离开当前路由不会直接调用 beforeDestroy 和 destroyed 销毁,需要使用路由钩子函数主动的调用    
               

 beforeRouteLeave(to, from, next) {
     this.$destroy();
     next();
 }


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值