• 组件有一个render函数,返回组建的虚拟DOM ```javascript //组件 const MyComponent = { name: “MyCOmponent”, render() { return {
      1. type: "div",
      2. children: "我是组件",
      } }, } //组件类型的虚拟节点 const componentNode = { type: MyComponent, }

    //挂载组件节点 function mountComponent(vnode, container, anchor) { //通过vnode获取组件选项 即vnode.type const componentOption = vnode.type //获取render函数 const { render } = componentOption //获取要渲染的节点,即render函数返回值 const subTree = render() //挂载节点 patch(null, subTree, container, anchor) }

    1. 组件响应式更新
    2. ```javascript
    3. const { reactive, effect } = Vue
    4. //挂载组件节点
    5. function mountComponent(vnode, container, anchor) {
    6. //通过vnode获取组件选项 即vnode.type
    7. const componentOption = vnode.type
    8. //获取render函数
    9. const { render, data } = componentOption
    10. //响应式数据
    11. const state = reactive(data())
    12. //响应式组件更新
    13. effect(() => {
    14. //获取要渲染的节点,即render函数返回值
    15. const subTree = render.call(state, state)
    16. //挂载节点
    17. patch(null, subTree, container, anchor)
    18. })
    19. }

    上面的代码只能实现组件挂载,没有组件更新
    定义组件实例用于组件更新,和组件生命周期

    1. function mountComponent(vnode, container, anchor) {
    2. //通过vnode获取组件选项 即vnode.type
    3. const componentOption = vnode.type
    4. //获取render函数
    5. const { render, data, beforeCreate, created, beforeMount, mounted } =
    6. componentOption
    7. beforeCreate && beforeCreate()
    8. //响应式数据
    9. const state = reactive(data())
    10. //定义组件实例
    11. const instance = {
    12. state, //组件状态
    13. isMounted: false, //组件是否已经挂载
    14. subTree: null, //组件的虚拟DOM
    15. }
    16. vnode.component = instance
    17. created && created().call(state)
    18. //响应式组件更新
    19. watchEffect(() => {
    20. const instance = vnode.component
    21. //获取要渲染的节点,即render函数返回值
    22. const subTree = render.call(state, state)
    23. //初次挂载
    24. if (!instance.isMounted) {
    25. //挂载节点
    26. beforeCreate && beforeCreate.call(state)
    27. patch(null, subTree, container, anchor)
    28. instance.isMounted = true
    29. //加载完成 mounted时事件周期
    30. mounted && mounted.call(state)
    31. } else {
    32. //更新节点
    33. patch(instance.subTree, subTree, container, anchor)
    34. }
    35. instance.subTree = subTree
    36. })
    37. }