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函数详解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue-element-admin配置小结

    vue-element-admin配置小结

    本文主要介绍了vue-element-admin配置小结,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • vue自定义tap指令及tap事件的实现

    vue自定义tap指令及tap事件的实现

    Vue提供自定义实现指令的功能, 和组件类似,可以是全局指令和局部指令,这篇文章主要介绍了vue自定义tap指令及tap事件的实现 ,需要的朋友可以参考下
    2018-09-09
  • 使用idea创建vue项目的图文教程

    使用idea创建vue项目的图文教程

    Vue.js是一套构建用户界面的框架,只关注视图层,它不仅易于上手,还便于与第三方库或既有项目整合,下面这篇文章主要给大家介绍了关于使用idea创建vue项目的相关资料,需要的朋友可以参考下
    2022-08-08
  • vue 2 实现自定义组件一到多个v-model双向数据绑定的方法(最新推荐)

    vue 2 实现自定义组件一到多个v-model双向数据绑定的方法(最新推荐)

    有时候我们需要对一个组件绑定自定义 v-model,以更方便地实现双向数据,例如自定义表单输入控件,这篇文章主要介绍了vue 2 实现自定义组件一到多个v-model双向数据绑定的方法,需要的朋友可以参考下
    2024-07-07
  • Vue.js每天必学之Class与样式绑定

    Vue.js每天必学之Class与样式绑定

    这篇文章主要为大家详细介绍了Vue.js的Class与样式绑定,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • Vue实现双token无感刷新的示例代码

    Vue实现双token无感刷新的示例代码

    这篇文章主要介绍了Vue实现双token无感刷新,双token机制,尤其是指在OAuth 2.0授权协议中广泛使用的access token(访问令牌)和refresh token(刷新令牌)组合,文中通过代码示例讲解的非常详细,需要的朋友可以参考下
    2024-03-03
  • vue实现图片裁剪后上传

    vue实现图片裁剪后上传

    这篇文章主要为大家详细介绍了vue实现图片裁剪后上传,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • element-plus的自动导入和按需导入方式详解

    element-plus的自动导入和按需导入方式详解

    之前使用 ElementPlus 做项目的时候,由于不会使用按需引入耽误了不少时间,这篇文章主要给大家介绍了关于element-plus自动导入和按需导入的相关资料,需要的朋友可以参考下
    2022-08-08
  • vue中el-autocomplete支持分页上拉加载功能

    vue中el-autocomplete支持分页上拉加载功能

    最近在项目中使用了ElementUI的el-autocomplete,下面这篇文章主要介绍了vue中el-autocomplete支持分页上拉加载功能的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • vue3.0实现移动端电子签名组件

    vue3.0实现移动端电子签名组件

    这篇文章主要为大家详细介绍了vue3.0实现移动端电子签名组件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08

最新评论