软件教程 2025年08月6日
0 收藏 0 点赞 962 浏览 2320 个字
摘要 :

文章目录 基本使用 render 函数 patch 函数 多宿主环境的支持 总结 本文主要讲解关于Vue3是如何进行页面渲染的相关内容,让我们来一起学习下吧! 基本使用 当我们要渲……




  • 基本使用
  • render 函数
  • patch 函数
  • 多宿主环境的支持
  • 总结

本文主要讲解关于Vue3是如何进行页面渲染的相关内容,让我们来一起学习下吧!

基本使用

当我们要渲染一块 DOM 的时候,Vue 内部会将这块 DOM 的 vnode,传给 render 函数,完成渲染:

const vnode = { ... } // 某块 DOM 对应的 vnode
render(vnode, document.getElementById(\'app\'))

render 函数

render 函数的定义是这样子的:

const render = (vnode, container) => {
  if (vnode == null) {
    // 卸载
    if (container._vnode) {
      unmount(container._vnode, null, null, true);
    }
  } else {
    // 挂载或更新
    patch(container._vnode || null, vnode, container, null, null, null, isSVG);
  }
  container._vnode = vnode;
};

我们可以通过 render 函数进行挂载、更新和删除。

另外需要注意的是,我们会把当前 vnode 作为 container._vnode,这是为了再后面去 patch 的时候,作为 oldVNode

渲染:

render(vnode, document.getElementById(\"app\"));

更新:

// 首次渲染
render(oldVNode, document.getElementById(\"app\"));

// 更新
render(newVNode, document.getElementById(\"app\"));

删除

// 首次渲染
render(oldVNode, document.getElementById(\"app\"));

// 删除
render(null, document.getElementById(\"app\"));

patch 函数

可以看到,当我们给 render 传递的第一个参数不是 null 的时候,我们会调用 patch 函数。

patch 函数:

const patch: PatchFn = (
    oldVNode,
    newVNode
  ) => {
    if (oldVNode === newVNode) {
      return
    }

    const { type, ref, shapeFlag } = newVNode
    switch (type) {
      case Text:
        processText(oldVNode, newVNode)
        break
      case Comment:
        processCommentNode(oldVNode, newVNode)
        break
      case Static:
        if (oldVNode == null) {
          mountStaticNode(newVNode)
        } else if (__DEV__) {
          patchStaticNode(oldVNode, newVNode)
        }
        break
      case Fragment:
        processFragment(
          oldVNode,
          newVNode
        )
        break
      default:
        if (shapeFlag & ShapeFlags.ELEMENT) {
          processElement(
            oldVNode,
            newVNode
          )
        } else if (shapeFlag & ShapeFlags.COMPONENT) {
          processComponent(
            oldVNode,
            newVNode
          )
        } else if (shapeFlag & ShapeFlags.TELEPORT) {
          ;(type as typeof TeleportImpl).process(
            oldVNode as TeleportVNode,
            newVNode as TeleportVNode
          )
        } else if (__FEATURE_SUSPENSE__ && shapeFlag & ShapeFlags.SUSPENSE) {
          ;(type as typeof SuspenseImpl).process(
            oldVNode,
            newVNode
          )
        } else if (__DEV__) {
          warn(\'Invalid VNode type:\', type, `(${typeof type})`)
        }
    }
  }

在 patch 函数中,我们会根据 VNode 的不同 type 来进行不同的处理,比如处理文本节点、注释节点、DOM 节点、组件。。。

这里比如我们挑最常见的 DOM 节点来看,它会执行 processElement 函数。

processElement 函数:

const processElement = (oldVNode, newVNode) => {
  if (oldVNode == null) {
    mountElement(newVNode);
  } else {
    patchElement(oldVNode, newVNode);
  }
};

如果 oldVNode 为 null,那么就是挂载。

如果 oldVNode 不为 null,那么就是更新。

那么对于挂载和更新来说,它就会涉及到新增、删除、移动等等的节点操作,还有属性挂载等逻辑。

多宿主环境的支持

Vue 渲染主要是发生在运行时(runtime)。

并且,Vue 不仅可以在浏览器端渲染(CSR),还可以在服务端渲染(SSR),所以 Vue 就将 runtime 分成了两个包,渲染的核心逻辑代码会放到 runtime-core 中;浏览器渲染相关的代码会放到 runtime-dom 中,最终通过 options 传入。

总结

Vue 的渲染主要就是通过 render 来进行的,核心的逻辑就在 runtime-core 中。

以上就是关于Vue3是如何进行页面渲染的相关的全部内容,希望对你有帮助。欢迎持续关注潘子夜个人博客(www.panziye.com),学习愉快哦!

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/6565.html

管理员

相关推荐
2025-08-06

文章目录 一、Promise基础回顾 二、Promise 与 axios 结合使用场景及方法 (一)直接返回 axios …

269
2025-08-06

文章目录 一、模块初始化时的内部机制 二、常见导出写法的差异分析 (一)写法一:module.exports…

107
2025-08-06

文章目录 一、ResizeObserver详解 (一)ResizeObserver是什么 (二)ResizeObserver的基本用法 …

683
2025-08-06

文章目录 一、前期准备工作 (一)下载相关文件 (二)安装必要工具 二、处理扣子空间生成的文件…

338
2025-08-06

文章目录 一、官方文档 二、自动解包的数据类型 ref对象:无需.value即可访问 reactive对象:保持…

371
2025-08-06

文章目录 一、Hooks的工作原理 二、在if语句中使用Hook会出什么岔子? 三、React官方的Hook使用规…

843
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号