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 结构,模板语法通常更简洁易读。

相关推荐
hkNaruto1 小时前
【AI】基于大模型的AI游戏地图生成、控制方案:AI Native Game Harness 迁移操作手册
前端·人工智能·游戏
IT_陈寒1 小时前
Java序列化踩坑记:对象循环引用让我加班两小时
前端·人工智能·后端
Acro2 小时前
快给macOS 上的Grok Bot换一套皮肤
前端
flash俊杰2 小时前
双引擎 OCR 编排:逐页判定、视觉优先、partial 语义与三层超时
前端
计算机魔术师2 小时前
Reddit 每周被 Google 偷走 100 万次点击,CEO 摊牌了
前端
前端繁华如梦2 小时前
用 React Three Fiber 做一栋能编辑的教学楼数字孪生
前端
前端繁华如梦2 小时前
用 React Three Fiber 做一套智慧医院数字孪生:编辑器、大屏和 BIM 浏览器
前端
俊昭喜喜里3 小时前
理解全局跨域CORS配置
前端
香芋芋圆4 小时前
iD-editor 详解|OSM官方在线编辑器,基于D3.js的轻量地图编辑器
开发语言·javascript·编辑器
晗夜未央5 小时前
任务队列反复失败,先分清重试、阻塞和结果待核对
开发语言·javascript