Vue3 h函数用法详解

h 函数是 Vue 3 中的渲染函数,用于以编程方式创建虚拟 DOM 节点(VNode)。

h 函数的基本语法:

h(tag, props, children)

  • tag:可以是 HTML 标签名、组件选项对象或组件名称
  • props:一个对象,包含要传递给元素或组件的属性
  • children:子节点,可以是字符串、VNode 或它们的数组

h函数的使用场景:

  1. 在 render 函数中创建 VNode

    • 当需要动态生成复杂的 DOM 结构时
    • 当模板语法无法满足复杂的条件渲染需求时
  2. 在 setup 函数中返回渲染内容

    • 与组合式 API 结合使用,直接返回 h 函数创建的 VNode
  3. 动态创建组件

    • 根据条件或数据动态选择要渲染的组件
    • 实现组件的动态切换
  4. 条件渲染复杂的 UI 结构

    • 当模板中的 v-if / v-else-if / v-else 变得过于复杂时
    • 当需要根据多个条件组合生成不同的 UI 结构时
  5. 与 JSX 结合使用

    • 提供更灵活的方式来编写组件的渲染逻辑

基本用法

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

// 创建一个div元素
const vnode = h('div', { class: 'container' }, 'Hello World')

// 创建一个带有子元素的div
const vnodeWithChildren = h('div', { class: 'container' }, [
  h('h1', null, '标题'),
  h('p', null, '内容')
])

高级用法

javascript 复制代码
// 创建一个组件
import MyComponent from './MyComponent.vue'

const componentVnode = h(MyComponent, {
  props: {
    message: 'Hello'
  },
  on: {
    click: () => console.log('clicked')
  }
})

条件渲染

javascript 复制代码
function renderCondition(condition) {
  return h('div', null, [
    condition ? h('p', null, '条件为真') : h('p', null, '条件为假')
  ])
}

与模板语法的对比

模板语法:

javascript 复制代码
<template>
  <div class="container">
    <h1 v-if="showTitle">标题</h1>
    <p>{{ message }}</p>
  </div>
</template>

渲染函数:

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

export default {
  props: ['showTitle', 'message'],
  render() {
    return h('div', { class: 'container' }, [
      this.showTitle ? h('h1', null, '标题') : null,
      h('p', null, this.message)
    ])
  }
}

h 函数的优势在于它提供了更灵活的编程能力,特别是在处理复杂的条件逻辑和动态组件时。但对于简单的 UI 结构,模板语法通常更简洁易读。

相关推荐
跨境数据猎手9 分钟前
跨境独立站系统技术拆解(附带源码)
服务器·前端·php
豹哥学前端19 分钟前
用猜数字游戏,一口气掌握 JavaScript 核心知识点(附完整代码)
前端·javascript
忆往wu前39 分钟前
从0到1一步步拆解搭建,梳理一个 Vue3 简易图书后台全开发流程
前端·javascript·vue.js
木斯佳1 小时前
前端八股文面经大全:字节抖音前端三面(2026-04-27)·面经深度解析
前端·面试·笔试·八股·面经
shao9185161 小时前
第3章(2)——使用Gradio JavaScript Client
javascript·node.js·cdn·gradio·job·events·playcode
光影少年1 小时前
大屏页面,一次多个请求,请求加密导致 点击 全局时间选择器 时出现卡顿咋解决(面板收起会延迟1~2秒)
前端·javascript·vue.js·学习·前端框架·echarts·reactjs
Mr.mjw1 小时前
vue中封装一个环形进度条组件,根据外部盒子大小自适应变化
前端·javascript·vue.js
无心使然1 小时前
Openlayers调用ArcGis影像服务之一动态地图、地图切片(/exportImage)
前端·javascript·数据可视化
唯火锅不可辜负2 小时前
uniapp开发公众号订阅功能踩坑小记
前端·vue.js
opteOG2 小时前
游览器跨域问题详解
前端