vue3:一文理解h函数的使用

目录

[第一章 前言](#第一章 前言)

[第二章 h函数的使用](#第二章 h函数的使用)

[2.1 h函数语法](#2.1 h函数语法)

[2.2 原生标签渲染](#2.2 原生标签渲染)

[2.3 组件渲染](#2.3 组件渲染)

[2.4 渲染多个标签/组件](#2.4 渲染多个标签/组件)

[2.5 slot插槽渲染](#2.5 slot插槽渲染)

[2.6 例子](#2.6 例子)


第一章 前言

以下是官方文档下对h函数的一些说明与使用:

https://cn.vuejs.org/guide/extras/render-function.html#creating-vnodes
渲染函数 API | Vue.js

在绝大多数情况下,Vue 推荐使用模板语法来创建应用。然而在某些使用场景下,我们真的需要用到 JavaScript 完全的编程能力。这时渲染函数就派上用场了。

小编在该篇文章中主要说明一下h函数使用的场景和如何使用!

第二章 h函数的使用

2.1 h函数语法

  • 1.type: 第一个参数既可以是一个字符串 (用于原生元素) 也可以是一个 Vue 组件
  • 2.props: 要传的参数,可以理解成<div class="test" id="test" @click="handleClick" />标签上所有的属性都可以写在props里面,但是如果是事件监听器需要以 onXxx 的形式书写
  • 3.children: 子节点,可以是字符串,也可以是数组包含多个节点,也可以是对象针对于组件的插槽
  • 注意: h函数必须只有一个根节点,如果需要一次性渲染多个组件,需要在children中实现
javascript 复制代码
import { h } from 'vue'

// 完整参数
/*
    1.type: 第一个参数既可以是一个字符串 (用于原生元素) 也可以是一个 Vue 组件
    2.props: 要传的参数,可以理解成<div class="test" id="test" @click="handleClick" />标签上所有的属性都可以写在props里面,但是如果是事件监听器需要以 onXxx 的形式书写
    3.children: 子节点,可以是字符串,也可以是数组包含多个节点,也可以是对象针对于组件的插槽
*/
const VNod = h(
  type: string | Component,
  props?: object | null,
  children?: Children | Slot | Slots
)

2.2 原生标签渲染

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

// const vnode1 = h(
//     'div', // type
//     { id: 'foo', class: 'bar' }, // props
//     [] || '' // children
// )


const message = ref('这是一个h函数渲染的div')
const vnode2 = h(
  'div',
  {
    class: 'div-test',
    style: {
      color: 'red'
    },
    onclick: ()=> {
      console.log('点击输出');
    }
  },
  message.value
)

const vnode3 = h('div')
......

2.3 组件渲染

javascript 复制代码
// DownOutlined是antd的图标组件
h(DownOutlined, { style: { 'font-size': '12px' } })

2.4 渲染多个标签/组件

javascript 复制代码
// h函数必须只有一个根节点,如果需要一次性渲染多个组件,需要在children中实现
h(
  'div',
  {
    class: 'w-full gap-x-3 flex items-center justify-start'
  },
  [
    h('span', null)
    h('span', null, record.seqNumber)
  ]
)

2.5 slot插槽渲染

javascript 复制代码
// 这是antd的Tooltip, default为默认插槽
h(Tooltip, { title: str }, { default: () => showStr })
// 自定义组件HelloWorld,default为默认插槽,header为具名插槽
h(
    HelloWorld, 
    { 
        msg: message.value,
        onClick: (value)=> {
            console.log(value);
        },
    },
    {
        default: ()=> h('div', '我是 HelloWorld 组件的默认插槽里面的值'),
        header: ()=> h('div', '我是 HelloWorld 组件的 header 插槽里面的值'),
    }
)

2.6 例子

以下只是小编在实战中使用的一段代码:

javascript 复制代码
// 利用一段三目运算活用
// 小编这里之所以props传null是因为不传会报错,但是官网说明是可选的,具体看大家敲代码时的具体情况了
return !isSub
  ? h(
      'div',
      {
        class: 'w-full gap-x-3 flex items-center justify-start'
      },
      [
        record.childList.length
          ? expandedRowsSet.value.has(record.id)
            ? h(CaretDownOutlined, {
                onClick: () => removeExpanedRow(record.id)
              })
            : h(CaretRightOutlined, {
                onClick: () => addExpanedRow(record.id)
              })
          : h('span', null),
        h('span', null, record.seqNumber)
      ]
    )
  : h('span', null)
相关推荐
打野赵怀真9 分钟前
前端资源发布路径怎么实现非覆盖式发布(平滑升级)?
前端·javascript
顾林海18 分钟前
Flutter Dart 流程控制语句详解
android·前端·flutter
tech_zjf19 分钟前
装饰器:给你的代码穿上品如的衣服
前端·typescript·代码规范
xiejianxin52021 分钟前
如何封装axios和取消重复请求
前端·javascript
parade岁月21 分钟前
从学习ts的三斜线指令到项目中声明类型的最佳实践
前端·javascript
狼性书生23 分钟前
electron + vue3 + vite 渲染进程与渲染进程之间的消息端口通信
前端·javascript·electron
阿里巴巴P8资深技术专家24 分钟前
使用vue3.0+electron搭建桌面应用并打包exe
前端·javascript·vue.js
coder_leon28 分钟前
Vite打包优化实践:从分包到性能提升
前端
shmily_yyA28 分钟前
【2025】Electron 基础一 (目录及主进程解析)
前端·javascript·electron
吞吞071130 分钟前
浅谈前端性能指标、性能监控、以及搭建性能优化体系
前端