美文网首页
vue生命周期

vue生命周期

作者: 梦行乌托邦 | 来源:发表于2020-07-15 12:54 被阅读0次
    vue官方出品
    beforeCreate
    created

    src/core/instance/init.js

    export function initMixin (Vue: Class<Component>) {
      Vue.prototype._init = function (options?: Object) {
        ...
        // expose real self
        vm._self = vm
        initLifecycle(vm) // 给$parent、$root赋值,初始化$children、$refs等
        initEvents(vm) // 用来存放除@hook:生命周期钩子名称=”绑定的函数“事件的对象,如:$on、$emit等  TODO
        initRender(vm) // 赋值$slots、$scopedSlots、$createElement、$attrs、$listeners
        callHook(vm, 'beforeCreate') // 调用钩子函数
        initInjections(vm) // resolve injections before data/props
        initState(vm) // 处理props、methods、data、computed、watch
        initProvide(vm) // resolve provide after data/props
        callHook(vm, 'created')
        ...
      }
    }
    

    beforeMount
    mounted
    beforeUpdate
    src/core/instance/lifecycle.js

    export function mountComponent (
      vm: Component,
      el: ?Element,
      hydrating?: boolean
    ): Component {
      vm.$el = el
      if (!vm.$options.render) { // 生成render
        vm.$options.render = createEmptyVNode
         ...
      }
      callHook(vm, 'beforeMount')
    
      let updateComponent
      /* istanbul ignore if */
      if (process.env.NODE_ENV !== 'production' && config.performance && mark) {
        ...
      } else {
        updateComponent = () => {
          vm._update(vm._render(), hydrating)
        }
      }
    
      // we set this to vm._watcher inside the watcher's constructor
      // since the watcher's initial patch may call $forceUpdate (e.g. inside child
      // component's mounted hook), which relies on vm._watcher being already defined
      new Watcher(vm, updateComponent, noop, {
        before () {
          if (vm._isMounted && !vm._isDestroyed) {
            callHook(vm, 'beforeUpdate')
          }
        }
      }, true /* isRenderWatcher */)
      hydrating = false
    
      // manually mounted instance, call mounted on self
      // mounted is called for render-created child components in its inserted hook
      if (vm.$vnode == null) {
        vm._isMounted = true
        callHook(vm, 'mounted')
      }
      return vm
    }
    

    updated
    src/core/observer/scheduler.js

    function callUpdatedHooks (queue) {
      let i = queue.length
      while (i--) {
        const watcher = queue[i]
        const vm = watcher.vm
        if (vm._watcher === watcher && vm._isMounted && !vm._isDestroyed) {
          callHook(vm, 'updated')
        }
      }
    }
    

    beforeDestory
    destoryed
    src/core/instance/lifecycle.js

    Vue.prototype.$destroy = function () {
        const vm: Component = this
        if (vm._isBeingDestroyed) {
          return
        }
        callHook(vm, 'beforeDestroy')
        vm._isBeingDestroyed = true
        // remove self from parent
        const parent = vm.$parent
        if (parent && !parent._isBeingDestroyed && !vm.$options.abstract) {
          remove(parent.$children, vm)
        }
        // teardown watchers
        if (vm._watcher) {
          vm._watcher.teardown()
        }
        let i = vm._watchers.length
        while (i--) {
          vm._watchers[i].teardown()
        }
        // remove reference from data ob
        // frozen object may not have observer.
        if (vm._data.__ob__) {
          vm._data.__ob__.vmCount--
        }
        // call the last hook...
        vm._isDestroyed = true
        // invoke destroy hooks on current rendered tree
        vm.__patch__(vm._vnode, null)
        // fire destroyed hook
        callHook(vm, 'destroyed')
        // turn off all instance listeners.
        vm.$off()
        // remove __vue__ reference
        if (vm.$el) {
          vm.$el.__vue__ = null
        }
        // release circular reference (#6759)
        if (vm.$vnode) {
          vm.$vnode.parent = null
        }
      }
    }
    
    vue生命周期.png

    相关文章

      网友评论

          本文标题:vue生命周期

          本文链接:https://www.haomeiwen.com/subject/gcudhktx.html