🔥 Vue2 vs Vue3 的 h 函数终极指南:从入门到源码级深度解析

大家好,我是鱼樱!!!

关注公众号【鱼樱AI实验室】持续每天分享更多前端和AI辅助前端编码新知识~~喜欢的就一起学反正开源至上,无所谓被诋毁被喷被质疑文章没有价值~~~坚持自己观点

一个城市淘汰的自由职业-农村前端程序员(虽然不靠代码挣钱,写文章就是为爱发电),兼职远程上班目前!!!热心坚持分享~~~

📜 目录

  1. [什么是 h 函数?](#什么是 h 函数? "#-%E4%BB%80%E4%B9%88%E6%98%AF-h-%E5%87%BD%E6%95%B0")
  2. 核心作用与原理
  3. [Vue2 vs Vue3 用法对比](#Vue2 vs Vue3 用法对比 "#-vue2-vs-vue3-%E7%94%A8%E6%B3%95%E5%AF%B9%E6%AF%94")
  4. 实战案例对比
  5. 底层原理与源码分析
  6. 最佳实践与注意事项

🌟 什么是 h 函数?

h 函数(Hyperscript) 是 Vue 中用于创建虚拟 DOM 节点的核心函数。它是模板编译的底层实现,能直接操作虚拟 DOM,适用于需要极致灵活性的场景。

核心特点:

  • 声明式渲染:比直接操作 DOM 更高效
  • 动态构建能力:可在 JavaScript 中直接构造复杂 UI 逻辑
  • 模板的替代方案:当模板语法无法满足需求时的终极武器

🧠 核心作用与原理

核心作用

  1. 创建虚拟 DOM 节点(VNode)
  2. 实现模板的底层渲染逻辑
  3. 支持 JSX 和自定义渲染逻辑

实现原理

bash 复制代码
模板/JSX → 编译 → h 函数调用 → 虚拟 DOM → 真实 DOM

虚拟 DOM 优化:

  • Vue2:全量对比虚拟 DOM
  • Vue3:静态标记 + 靶向更新(性能提升 200%)

⚔️ Vue2 vs Vue3 用法对比

参数结构对比

特性 Vue2 Vue3
导入方式 自动注入 需要显式导入
参数结构 h(tag, data, children) h(tag, props, children)
事件监听 on: { click: handler } onClick: handler
Props 传递 props: { ... } 直接作为对象属性
默认插槽 this.$slots.default 通过 slots.default() 访问

💻 实战案例对比

案例 1:基础按钮组件

Vue2 实现

javascript 复制代码
export default {
  render(h) {
    // dom
    return h('button', {
      // attr
      class: 'btn',
      // 事件
      on: {
        click: this.handleClick
      }
      // 获取默认插槽的内容
    }, this.$slots.default)
  },
  methods: {
    handleClick() {
      console.log('Vue2 按钮点击!')
    }
  }
}

Vue3 实现

javascript 复制代码
import { h } from 'vue'

export default {
  setup() {
    const handleClick = () => {
      console.log('Vue3 按钮点击!')
    }

    return () => h('button', {
      class: 'btn',
      onClick: handleClick
    }, slots.default?.())
  }
}

案例 2:动态列表渲染

Vue2 实现

javascript 复制代码
render(h) {
  return h('ul', 
    this.items.map(item => 
      h('li', { key: item.id }, item.text)
    )
  )
}

Vue3 实现

javascript 复制代码
import { h } from 'vue'

setup() {
  return () => h('ul', 
    items.value.map(item =>
      h('li', { key: item.id }, item.text)
    )
  )
}

🔍 底层原理与源码分析

Vue2 实现原理

javascript 复制代码
// 简化版 h 函数实现
function h(tag, data, children) {
  return {
    __v_isVNode: true,
    tag,
    data,
    children,
    // ...其他属性
  }
}

Vue3 优化实现

javascript 复制代码
// Vue3 的 createVNode 函数
function createVNode(type, props, children) {
  const vnode = {
    __v_isVNode: true,
    type,
    props,
    children,
    shapeFlag: getShapeFlag(type),
    // ...新增 patchFlag 进行靶向更新
  }
  // 静态节点标记优化
  if (isStaticVNode(vnode)) {
    vnode.patchFlag = PatchFlags.STABLE
  }
  return vnode
}

🚀 最佳实践与注意事项

最佳实践

  1. 优先使用模板:90% 场景下模板更合适
  2. 合理使用 JSX:复杂逻辑时更直观
  3. 缓存静态节点:利用 Vue3 的静态提升特性

常见陷阱

markdown 复制代码
- 🚫 Vue2 中忘记写 `this.$slots`
- 🚫 Vue3 中未正确导入 h 函数
- 🚫 错误处理事件绑定语法(`onClick` vs `on:click`)
- 🚫 忘记添加 `key` 属性导致渲染异常

📌 总结

维度 Vue2 Vue3
性能 中等 优化后提升 200%
语法简洁性 较传统 更现代化
类型支持 有限 完美 TS 支持
扩展能力 普通 支持自定义渲染器

掌握 h 函数的使用,你将获得:

  • 🔧 更强大的动态组件构建能力
  • 🚤 更精细的性能优化手段
  • 🧩 更深入理解 Vue 的渲染机制
相关推荐
优雅的落幕2 小时前
前端---初识HTML(前端三剑客)
java·前端·javascript·css·html
nujnewnehc2 小时前
vue 少了2道面试题, vapor 来了后 vnode 和 diff 算法可以不需要了?
前端·vue.js·vapor
codingandsleeping3 小时前
前端工程化之webpack(万字)
前端·javascript
Jiude3 小时前
UnoCSS presetWind4() 背景色使用 color-mix() 的原因及解决方案
前端·css
无名之逆4 小时前
Hyperlane:Rust 生态中的轻量级高性能 HTTP 服务器库,助力现代 Web 开发
服务器·开发语言·前端·后端·http·面试·rust
范哥来了4 小时前
python web开发django库安装与使用
前端·python·django
烛阴4 小时前
JavaScript 的 “new Function”:你不知道的黑魔法,让代码更灵活!
前端·javascript
ConardLi4 小时前
发布第五天,我的开源项目突破 1.7 K Star!
前端·javascript·人工智能
程序员小刚4 小时前
基于SpringBoot + Vue 的心理健康系统
vue.js·spring boot·后端
尚学教辅学习资料4 小时前
基于SpringBoot+Vue的幼儿园管理系统+LW示例参考
vue.js·spring boot·后端·幼儿园管理系统