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)
相关推荐
kyriewen1 小时前
今年裁了16万技术人——但字节前端岗反而涨了23%
前端·javascript·面试
用户059540174461 小时前
把 AI Agent 记忆存储验证从 40 分钟手测压到 3 分钟,pytest + Docker 这套组合太顶了
前端·css
stereohomology1 小时前
MS Edge很多事的一点是把地址栏复制的地址自动转标题文本
前端·edge
imaol12 小时前
链表 -- 环链表
java·前端·链表
imaol12 小时前
链表 -- 双向链表
java·前端·链表
东风破_2 小时前
大前端手里的 Next.js:从 #root 到 SEO,一份 HTML 的两种命运
前端·后端
IT_陈寒2 小时前
Vue的v-for不听话?我被这个Key的坑整懵了
前端·人工智能·后端
王林不想说话3 小时前
ES6 到 ES2026 全面进阶指南:新特性、原理、示例与工程落地
前端·javascript·面试
用户43523713814933 小时前
🚀 Vue3 + TypeScript 学习笔记:从泛型 T 到 Promise<T>,终于搞懂了 keyof 和 typeof
前端
跟着群主去吃肉3 小时前
Cinemachine的应用-第三人称视角
前端·unity3d·游戏开发