美文网首页
Vue 挂载 — — Vue2.6

Vue 挂载 — — Vue2.6

作者: aabbccaa | 来源:发表于2020-11-02 16:37 被阅读0次
    Vue挂载.jpg

    new Vue(options?) 之后发生了什么?

    • 生成vue实例
    • 调用原型方法 this._init(options?)
        vm._uid = uid++     // 为当前实例绑定唯一id
    
        vm._isVue = ture   // 一个避免被观察到的标记(用来过滤无需被数据劫持的标志)
    
       // 性能测试,记录初始化过程性能
       // config.performance 默认为false
       if (process.env.NODE_ENV !== 'production' && config.performance && mark) {
          startTag = `vue-perf-start:${vm._uid}`
          endTag = `vue-perf-end:${vm._uid}`
          mark(startTag)
        }
       if (process.env.NODE_ENV !== 'production' && config.performance && mark) {
          vm._name = formatComponentName(vm, false)
          mark(endTag)
          measure(`vue ${vm._name} init`, startTag, endTag)
        }
    
        // 合并配置项
        if (options && options._isComponent) {  // 组件实例配置内部优化
          // 根组件无需,暂时忽略
          // TODO
          initInternalComponent(vm, options)
        } else {
          vm.$options = mergeOptions(
            resolveConstructorOptions(vm.constructor),
            options || {},
            vm
          )
        }
    

    resolveConstructorOptions(Ctor: Class<Component>)

    通用方法
    解析构造函数配置项
    接收参数:组件构造函数
    当前暂无需要 TODO

    mergeOptions(parent: Object ,child: Object ,vm?: Component)

    通用方法
    将两个配置项合并为新的配置项

    export function mergeOptions (
      parent: Object,
      child: Object,
      vm?: Component
    ): Object {
      if (process.env.NODE_ENV !== 'production') {
        checkComponents(child)  // 检测component是否符合规范
      }
    
      if (typeof child === 'function') { // 是否为VM
        child = child.options
      }
    
      normalizeProps(child, vm) // 规范化props 
      normalizeInject(child, vm) // 规范化inject
      normalizeDirectives(child) // 规范化指令 
    
      if (!child._base) {  // _base === vm
        if (child.extends) { // 合并扩展
          parent = mergeOptions(parent, child.extends, vm)
        }
        if (child.mixins) { // 合并混入
          for (let i = 0, l = child.mixins.length; i < l; i++) {
            parent = mergeOptions(parent, child.mixins[i], vm)
          }
        }
      }
    
      const options = {}
      let key
      for (key in parent) {  // 合并oldOptions
        mergeField(key)
      }
      for (key in child) { // 合并newOptions
        if (!hasOwn(parent, key)) {
          mergeField(key)
        }
      }
      function mergeField (key) { // 合并默认
        const strat = strats[key] || defaultStrat
        options[key] = strat(parent[key], child[key], vm, key)
      }
      return options
    }
    

    if (process.env.NODE_ENV !== 'production') {
        initProxy(vm) // 测试环境兼容模式 proxy
    } else {
        vm._renderProxy = vm 
    }
    
        vm._self = vm         // 曝光自身
        initLifecycle(vm)    // 初始化生命周期
        initEvents(vm)   // 初始化事件
        initRender(vm) // 初始化渲染函数
        callHook(vm, 'beforeCreate') // 更新生命周期
        initInjections(vm) // 初始化inject/data
        initState(vm) 初始化状态 (data,method,computed,watch...)
        initProvide(vm) // 初始化provide/data
        callHook(vm, 'created') //更新生命周期
    
       //性能测试
        if (process.env.NODE_ENV !== 'production' && config.performance && mark) {
          vm._name = formatComponentName(vm, false)
          mark(endTag)
          measure(`vue ${vm._name} init`, startTag, endTag)
        }
      
    //挂载dom
        if (vm.$options.el) {
          vm.$mount(vm.$options.el)
        }
      }

    相关文章

      网友评论

          本文标题:Vue 挂载 — — Vue2.6

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