h() 函数

在 Vue 中,h() 函数(全称为 createVNode)是创建虚拟节点(VNode)的核心工具,它是 Vue 渲染系统的基础。以下是关于 h() 函数的详细解释:

1. 什么是 h() 函数?

  • 作用h()hyperscript 的缩写,意为"生成 HTML 的脚本"。它通过 JavaScript 对象描述 DOM 节点,用于手动编写 Vue 的渲染函数(替代模板语法)。
  • 别名 :在 Vue 3 中,h()createVNode() 的别名,两者完全等价。

2. 为什么需要 h() 函数?

  • 模板语法的局限性 :Vue 的模板语法(如 <div>{``{ message }}</div>)适合简单场景,但对于动态生成复杂结构或运行时计算的 UI,模板会显得冗长。
  • 性能优化 :直接使用 h() 可以绕过模板编译过程,生成更高效的渲染逻辑。
  • 自定义组件开发 :在开发高阶组件、插件或库时,h() 能提供更灵活的渲染控制。

3. 基本语法

javascript 复制代码
h(
  type,      // 必选:组件类型或 HTML 标签名
  props,     // 可选:传递给组件的 props
  children   // 可选:子节点(文本、数组或函数)
)

示例 1:创建简单的 HTML 元素

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

// 创建 <div class="container">Hello World</div>
const vnode = h('div', { class: 'container' }, 'Hello World');

示例 2:创建带子节点的元素

javascript 复制代码
// 创建嵌套结构:<div><span>Text</span></div>
const vnode = h('div', [
  h('span', 'Text')
]);

示例 3:传递 props 和事件

javascript 复制代码
// 创建按钮并绑定点击事件
const vnode = h(
  'button',
  {
    class: 'btn',
    onClick: () => console.log('Clicked')
  },
  'Click me'
);

4. 与组件结合使用

h() 不仅能创建 HTML 标签,还能渲染自定义组件:

javascript 复制代码
import MyComponent from './MyComponent.vue';

// 渲染自定义组件并传递 props
const vnode = h(MyComponent, {
  msg: 'Hello from h()'
});

5. 在你的代码中的应用

在之前的代码中,summaryCellRenderer() 可能返回一个通过 h() 创建的 VNode:

javascript 复制代码
// 用户自定义的渲染函数
summaryCellRenderer: () => {
  // 返回一个带样式的组件
  return h('span', { class: 'text-red-500' }, '总计:100');
}

当 Vue 遇到 <component :is="summaryCellRenderer()"></component> 时,会直接渲染这个 VNode,最终在页面上显示为:

html 复制代码
<span class="text-red-500">总计:100</span>

6. 与 JSX 的关系

  • JSX :是一种 JavaScript 的语法扩展,看起来像 HTML,但会编译为 h() 调用。
  • Vue + JSX :Vue 3 支持 JSX 语法,本质上是对 h() 的语法糖。

JSX 示例

jsx 复制代码
// JSX 写法
const vnode = <div class="container">Hello</div>;

// 等价于 h() 写法
const vnode = h('div', { class: 'container' }, 'Hello');

7. 总结

h() 函数是 Vue 底层的渲染工具,它允许你:

  • 通过 JavaScript 对象描述 DOM 结构;
  • 动态创建 HTML 元素或组件;
  • 在运行时灵活生成 UI,避开模板的限制。

在你的代码场景中,h() 让用户可以自定义汇总单元格的复杂内容(如带样式的文本、按钮、甚至嵌套组件),并通过 <component> 动态渲染这些内容。

相关推荐
科技D人生1 分钟前
Vue.js 学习总结(20)—— Vue-Office 实战:word、pdf、excel、ppt 多种文档的在线预览
vue.js·word·vue-pdf·stylesheet·docx-preview·vue-office
vx1_Biye_Design3 分钟前
基于Spring Boot+Vue的学生管理系统设计与实现-计算机毕业设计源码46223
java·vue.js·spring boot·spring·eclipse·tomcat·maven
vx_Biye_Design4 分钟前
基于Spring Boot+vue的湖北旅游景点门票预约平台的设计--毕设附源码29593
java·vue.js·spring boot·spring cloud·servlet·eclipse·课程设计
hedley(●'◡'●)4 分钟前
基于cesium和vue的大疆司空模仿程序
前端·javascript·vue.js·python·typescript·无人机
qq5_8115175156 分钟前
web城乡居民基本医疗信息管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
前端·vue.js·spring boot
百思可瑞教育6 分钟前
构建自己的Vue UI组件库:从设计到发布
前端·javascript·vue.js·ui·百思可瑞教育·北京百思教育
百锦再6 分钟前
Vue高阶知识:利用 defineModel 特性开发搜索组件组合
前端·vue.js·学习·flutter·typescript·前端框架
hdsoft_huge8 分钟前
1panel面板中部署SpringBoot和Vue前后端分离系统 【图文教程】
vue.js·spring boot·后端
CappuccinoRose32 分钟前
JavaScript 学习文档(二)
前端·javascript·学习·数据类型·运算符·箭头函数·变量声明
这儿有一堆花38 分钟前
Vue 是什么:一套为「真实业务」而生的前端框架
前端·vue.js·前端框架