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

相关推荐
.生产的驴19 小时前
Vue3 超大字体font-slice按需分片加载,极速提升首屏速度, 中文分片加载方案,性能优化
前端·vue.js·windows·青少年编程·性能优化·vue·rescript
打瞌睡的朱尤19 小时前
CSS复习
前端·css
程序员 沐阳19 小时前
异步编程深潜:事件循环、Promise 与 async/await 的底层真相
javascript
irpywp19 小时前
Boneyard:基于组件映射的骨架屏方案
前端·ui·github
276695829219 小时前
zp_stoken 算法风控分析
java·前端·javascript·python·web逆向·boss直聘·zp_stoken
叫我一声阿雷吧19 小时前
JS 入门通关手册(38):防抖与节流 原理 + 手写 + 实战场景(面试必考)
javascript·性能优化·前端面试·防抖·节流·js手写题
妮妮喔妮19 小时前
组件的封装
开发语言·前端·javascript
cypking19 小时前
前端瓦片渲染解决方案(解决大量数据渲染卡顿问题)
前端
李子焱19 小时前
第三节:开发环境搭建与Trae IDE深度配置
前端·ide·python·node.js·trae ide
王家视频教程图书馆20 小时前
electron 环境搭建
前端·javascript·electron