xwjie/VueStudyNote

12 实现组件2

xwjie opened this issue · 0 comments

xwjie commented

实现组件注册功能

关键点,使用 extends 继承 Xiao , 在构造方法 constructor 里面调用 super(definition)

class Xiao{
   /**
   * 全局注册组件
   */
  static component(id: string, definition?: Object) {
    if (globalComponent[id]) {
      return globalComponent[id]
    }

    if (!definition) {
      return null
    }

    const newClass = class extends Xiao {
      constructor() {
        super(definition)
      }
    }

    for (let key in definition) {
      newClass[key] = definition[key]
    }

    globalComponent[id] = newClass
    log('globalComponent', globalComponent)

    return newClass
  }
}

给虚拟节点增加 insert hook

insert 钩子里面,调用 子组件的 $mount 函数,渲染dom。

function setComponentHook(vnode: any, vm: Xiao) {
  if (!vnode.sel) {
    return
  }

  // 查看是否组成了组件?
  const Comp = Xiao.component(vnode.sel)

  if (Comp) {
    log('组件', Comp)

    vnode.data.hook = {
      insert: (vnode) => {
        log('component vnode', vnode)

        let app =new Comp()
        app._parent = vm

        app.$mount(vnode.elm)
      }
    }
  }

  if (vnode.children) {
    vnode.children.forEach(function (e) {
      setComponentHook(e, vm)
    }, this)
  }

}