Vue3中h函数超详细教程(附示例与应用场景)

 更新时间:2025年07月28日 08:25:39   作者:JaysonJin  
这篇文章主要给大家介绍了关于Vue3中h函数的相关资料,h函数是Vue3中用来创建虚拟节点(VNode)的工具,它的本质是createVNode方法的简写,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

💡适合初中高级 Vue 3 开发者,了解 Composition API、JSX/TSX 或 render 函数写法的同学

一、什么是h函数?

在 Vue 3 中,h 是创建虚拟 DOM(VNode)的工具函数,常用于渲染函数中,替代 Vue 2 中的 createElement

h 是 hyperscript 的缩写,代表用 JS 语法构造虚拟 DOM 树结构。

二、语法结构与基本用法

h(
  type,          // string | Component | object
  props?,        // object | null
  children?      // string | array | object | function
)

参数详解:

参数说明
type标签名(如 'div')或组件引用
props元素属性或组件 props,例如 classonClick
children子节点,可以是字符串、数组、VNode,或插槽函数等

三、使用场景详解与示例

1. 普通元素渲染(替代模板语法)

import { h } from 'vue'

export default {
  render() {
    return h('div', { class: 'hello' }, 'Hello World')
  }
}

效果等同于:

<template>
  <div class="hello">Hello World</div>
</template>

2. 嵌套结构组件

export default {
  render() {
    return h('div', { class: 'wrapper' }, [
      h('h2', '标题'),
      h('p', '段落内容'),
      h('button', { onClick: this.handleClick }, '点击')
    ])
  },
  methods: {
    handleClick() {
      alert('点击了按钮!')
    }
  }
}

3. 渲染组件(传递 props 和插槽)

import { h } from 'vue'
import MyButton from './MyButton.vue'

export default {
  render() {
    return h(MyButton, { type: 'primary', onClick: this.doSomething }, {
      default: () => '点我'
    })
  },
  methods: {
    doSomething() {
      console.log('点击按钮!')
    }
  }
}

4. 组合 JSX/TSX 使用(推荐)

如果你启用了 TSX/JSX,使用 h 更加自然:

import { defineComponent } from 'vue'

export default defineComponent({
  setup() {
    return () => (
      <div class="box">
        <p>Hello JSX</p>
      </div>
    )
  }
})

⚠️ 需要配置 vite.config.ts 启用 JSX 插件:

import vueJsx from '@vitejs/plugin-vue-jsx'

export default {
  plugins: [vueJsx()]
}

四、常见扩展应用

动态渲染表格列(Element Plus 示例)

render() {
  return h('el-table-column', {
    prop: 'name',
    label: '姓名',
    scopedSlots: {
      default: (scope) => h('span', scope.row.name)
    }
  })
}

⚠️注意:Vue 3 移除了 scopedSlots,需改为 slot 函数形式:

render() {
  return h(ElTableColumn, { prop: 'name', label: '姓名' }, {
    default: ({ row }) => h('span', row.name)
  })
}

结合vnode动态插槽场景

render() {
  return h(MyComponent, {}, {
    default: () => '默认插槽内容',
    header: () => h('h1', '头部插槽')
  })
}

五、总结:何时使用h

需求是否使用 h
模板编写简单 UI❌ 推荐使用 <template>
组件库封装 / 高阶组件✅ 使用 render 函数或 h
动态插槽渲染✅ 推荐用 h
插件 / 指令 / 动态 DOM✅ 推荐用 h
使用 JSX/TSX 时✅ 使用 h 或 JSX

附录:Vue 官方h类型定义(简化)

function h(
  type: string | Component,
  props?: object | null,
  children?: string | VNode[] | () => VNode
): VNode

你也可以从 Vue 内部导出它:

import { h } from 'vue'

到此这篇关于Vue3中h函数超详细教程的文章就介绍到这了,更多相关Vue3 h函数详解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用Vue3和ApexCharts实现3D径向条形图的代码

    使用Vue3和ApexCharts实现3D径向条形图的代码

    径向条形图是一种用于可视化单一数据点及其与目标或理想值的关系的图表类型,它在显示进度、完成率或其他类似度量时非常有用,本文给大家介绍了使用Vue3和ApexCharts实现3D径向条形图,感兴趣的小伙伴可以参考阅读下
    2024-06-06
  • vue和react等项目中更简单的实现展开收起更多等效果示例

    vue和react等项目中更简单的实现展开收起更多等效果示例

    这篇文章主要介绍了vue和react等项目中更简单的实现展开收起更多等效果示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • Vue使用emit传参,父组件接收不到数据的问题及解决

    Vue使用emit传参,父组件接收不到数据的问题及解决

    这篇文章主要介绍了Vue使用emit传参,父组件接收不到数据的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-09-09
  • Vue 3 的<Teleport>功能与用法详解

    Vue 3 的<Teleport>功能与用法详解

    <Teleport> 是 Vue 3 的一个内置组件,允许将组件的内容渲染到 DOM 中的任意位置,而不改变其逻辑结构,这篇文章主要介绍了Vue 3 的<Teleport>功能与用法详解,需要的朋友可以参考下
    2025-04-04
  • vue3+ts封装axios,无感刷新问题

    vue3+ts封装axios,无感刷新问题

    文章详细介绍了前端项目开发中常见的技术栈,包括安装依赖、创建类型定义、状态管理、核心封装(Axios请求)、API接口示例、组件使用以及可选的路由守卫,作者分享了个人经验,希望为开发者提供参考和帮助
    2025-12-12
  • VUE使用axios调用后台API接口的方法

    VUE使用axios调用后台API接口的方法

    这篇文章主要介绍了VUE使用axios调用后台API接口的方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-08-08
  • Vue3实现一个定高的虚拟列表

    Vue3实现一个定高的虚拟列表

    虚拟列表对于大部分一线开发同学来说是一点都不陌生的东西了,这篇文章主要来教大家如何在2分钟内实现一个定高的虚拟列表,感兴趣的可以了解下
    2024-12-12
  • vue2 element-ui el-checkbox视图不更新问题及解决

    vue2 element-ui el-checkbox视图不更新问题及解决

    作者在开发过程中遇到了视图不更新的问题,最终通过改变一个无关紧要的响应式数据来解决,让视图发生改变
    2024-12-12
  • Vue.js的计算属性computed详解

    Vue.js的计算属性computed详解

    文章介绍了Vue.js中的计算属性(computed properties),解释了它们的基本概念、语法、优势以及应用场景,文章通过有趣的示例展示了计算属性在不同场景下的应用,如计算全名、计算列表的总和和计算对象的属性,感兴趣的朋友一起看看吧
    2025-03-03
  • vue3 elementplus table合并写法

    vue3 elementplus table合并写法

    这篇文章主要介绍了vue3 elementplus table合并写法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06

最新评论