【Vue3】 h()函数的用法

news2024/11/26 15:47:57

目录

介绍

参数

使用案例

1.创建虚拟 DOM 元素

2. 组件的动态渲染

3. 创建功能组件

4.渲染动态属性

5. 使用插槽

6. 创建动态标签


介绍

h() 函数用于辅助创建虚拟 DOM 节点,它是 hypescript 的简称——能生成 HTML (超文本标记语言) 的 JavaScript,它有另外一个名称,叫做 createVnode()。在 Vue 项目中使用 HTML 标签构建页面时,最终结果会转化为 vnode,而该h()函数直接创建 vnode,可以更灵活地构建组件渲染逻辑,并提高性能。

参数

  • type:要创建的节点类型,可以是 HTML 标签、组件或函数(功能组件)。
  • props(可选):包含节点属性的对象,作为 prop 传递。
  • children(可选):子节点可以是字符串、数组或其他 vnode 对象。

1. type:  HTML标签名:如果有type字符串,则会被解析为HTML标签。
                Component:如果type是对象或者函数,则会被解析为Vue组件。
                异步组件:type也可以是一个返回Promise的函数,该Promise将被解析到组件。
2. props:Props 是可选参数,用于指定节点的属性。
                传递 props 时,传递一个包含属性名称和值的对象作为 prop。
                您也可以将null其作为 props 的值传递。
3. children:子节点可以是字符串,数组或其他 vnode 对象。
                     如果子节点是一个数组,则数组中的每个元素都将被视为节点的子节点。
                     如果子节点是一个函数,它将在渲染期间被调用,并且其返回值将作为子节点。

注意事项:

  • 如果没有props,那么通常可以将children作为第二个参数传入;
  • 如果会产生歧义,可以将null作为第二个参数传入,将children作为第三个参数传

官方完整类型参数

// 完整参数签名
function h(
  type: string | Component,
  props?: object | null,
  children?: Children | Slot | Slots
): VNode

// 省略 props
function h(type: string | Component, children?: Children | Slot): VNode

type Children = string | number | boolean | VNode | null | Children[]

type Slot = () => Children

type Slots = { [name: string]: Slot }


使用案例

1.创建虚拟 DOM 元素

h函数可以在两个地方使用:

  • render函数选项中;
  • setup函数选项中(setup本身需要是一个函数类型,函数再返回h函数创建的VNode);
import { h } from 'vue'

export default {
  render() {
    return h('div', { className: 'app' }, [
      h('h2', { className: 'title' }, 'I am title'),
      h('p', null, 'I am content')
    ])
  }
}
// 或者
import { defineComponent } from "vue";
export default defineComponent({
  name: "Jsx",
  render() {
    return I am div;
  },
});

定义一个setup返回渲染函数的函数。

import { h } from "vue"

export default {
  setup() {
    // setup is a function that returns another function
    return () => h("div", { class: "app" }, [
      h("h2", { class: "title" }, "I am title"),
      h("p", null, "I am content")
    ])
  }
}

2. 组件的动态渲染

import { ref } from 'vue';
import ComponentA from './ComponentA.vue';
import ComponentB from './ComponentB.vue';

const nowComponent = ref('ComponentA');

function changeComponent() {
  nowComponent.value = nowComponent.value === 'ComponentA' ? 'ComponentB' : 'ComponentA';
}

const createComponent = () => {
  return h(nowComponent.value === 'ComponentA' ? ComponentA : ComponentB);
};

3. 创建功能组件

import { h, defineEmits } from 'vue';

const FunctionalComponent = (props, context) => {
  return h('div', null, [
    h('p', null, props.text),
    h('button', { onClick: context.emit.bind(context, 'click') }, 'click')
  ]);
};

const emit = defineEmits(['click']);

function handleClick() {
  console.log('handleClick');
}

如上所示,这是一个典型的函数式组件使用方法,包括如何在父子组件中与它们交互。FunctionalComponent 接收 props 和 context 参数,并使用 h() 函数构造页面。此外,它还通过触发父组件中的事件处理程序context.emit。

4.渲染动态属性

  import { ref } from 'vue';

  const visible = ref(true);

  function myVisibility() {
    visible.value = !visible.value;
  }

  const componentWithProps = () => {
    return h('div', { class: { visible: visible.value } }, 'div');
  };

如上所示,里面的函数根据 h()的值判断 vnode 是否带有class ,并在点击按钮时实现动态样式。当然,动态 class 只是一个例子,实际上里面的各种属性或者子组件都可以动态灵活

5. 使用插槽

import { h } from 'vue';

const SlotComponent = (props, context) => {
  return h('div', null, [
    h('p', null, 'In slot:'),
    context.slots.default && context.slots.default()
  ]);
};

如上所示,在引用SlotComponent组件时,其内部标签内的内容将作为默认插槽的内容传递给SlotComponent。此外,还可以使用context.slots.default()来获取并渲染默认插槽的内容。因此,当我们封装一个函数式组件,但内部有动态部分时,特别适合以这种方式使用插槽。

6. 创建动态标签

import { ref } from 'vue';

const tag = ref('div');

function changeTag() {
  tag.value = tag.value === 'div' ? 'section' : 'div';
}

const createElement = () => {
  return h(tag.value, null, 'dynamic');
};

这种方式避免了使用v-if产生大量冗余代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2207291.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开发实时美颜系统:视频美颜SDK与直播平台的集成方案详解

本文将详细介绍如何开发一个实时美颜系统,并探讨视频美颜SDK与直播平台的集成方案,帮助开发者实现流畅的美颜功能。 一、视频美颜SDK的核心功能 视频美颜SDK主要提供了一系列实时处理视频图像的算法,常见的功能包括: 1.美白、磨…

Vue3教程 - 3 HelloWorld

更好的阅读体验:点这里 ( www.foooor.com ) 3 HelloWorld 下面来正式进入 Vue3 的学习。先写一个 HelloWorld。 3.1 关于Vite Vite 是一个新型前端构建工具。 在 Vue2 中,我们主要使用 vue-cli 来构建我们的前端项目&#x…

进程的优先级详解(1)(在Linux中观察进程优先级,优先级的概念,优先级范围,进程的切换和切换的过程和理解)

文章目录 进程的优先级什么是进程的优先级?进程的优先级的划分1. 优先级的级别划分2. 动态与静态优先级 那么为什么要有优先级呢?区分 那么是怎么确定优先级的呢? Linux中的优先级Linux中的进程优先级补充 Linux优先级的范围进程的切换切换过…

四款pdf转图片在线转换免费工具推荐:

大家好!今天我来给大家推荐几款PDF转图片的在线转换工具,让你轻松将PDF文件转换成图片,无论是工作还是学习,都能派上大用场。下面,让我们来看看这几款工具吧! 一、福昕转换器 直通车(粘贴到浏览…

多线程(二):创建线程关键属性终止线程

目录 1、run & start 2、Thread类常见的属性和方法 2.1 构造方法 2.2 属性 3、后台进程 & 前台进程 4、后台线程的判断和设定——isDaemon & setDaemon 5、线程是否存活——isAlive 6、终止一个线程 6.1 lambda变量捕获 6.2 currentThread & isInterr…

atomic physics

​​​​​​​ https://www.youtube.com/watch?v6F8Wjblb0vE&listPLX2gX-ftPVXVqAS_q3OfJDmPn8-EQld_r&index18

Python 工具库每日推荐 【logging】

文章目录 引言Python日志记录的重要性今日推荐:logging模块主要功能:使用场景:快速上手基本使用代码解释实际应用案例案例:文件日志记录器案例分析高级特性日志过滤器上下文管理器扩展阅读与资源优缺点分析优点:缺点:总结【 已更新完 TypeScript 设计模式 专栏,感兴趣可…

钢管X射线 焊缝缺陷检测数据集,3408张x射线焊缝缺陷图像,也有更多的图像数据集,可以进行扩充 目标检测任务。可制作上位机软件。

钢管X射线 焊缝缺陷检测数据集,3408张x射线焊缝缺陷图像,也有更多的图像数据集,可以进行扩充 目标检测任务。可制作上位机软件。 B lowhole Undercut Broken arc Crack Overlap Slag inclusion L ack of fusion Hollow bead 钢管X射线焊缝缺陷…

正则表达式 | Python、Julia 和 Shell 语法详解

正则表达式在网页爬虫、脚本编写等众多任务中都有重要的应用。为了系统梳理其语法,以及 Python、Julia 和 Shell 中与正则表达式相关的工具,本篇将进行详细介绍。 相关学习资源:编程胶囊。 基础语法 通用语法 在大多数支持正则表达式的语…

Github 2024-10-11 Java开源项目日报 Top9

根据Github Trendings的统计,今日(2024-10-11统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目9TypeScript项目1Vue项目1C++项目1JeecgBoot 企业级低代码开发平台 创建周期:2062 天开发语言:Java, Vue协议类型:Apache License 2.…

除了Devops、DevSecOps和TestOps ,您还了解ITOps吗?

大家可能听说过Devops、DevSecOps、TestOps ,但是对于ITOps这个词儿可能会感到陌生,今天就带大家来了解一下什么事ITOps ITOps 信息技术运营 — 通常称为 IT 运营,或是 ITOps ,是实施、管理、 交付和支持 IT 服务的过程&#x…

Odoo:免费开源的装备制造行业信息化解决方案

概述 满足装备制造行业MTO、ETO、MTS等多种业务模式,从个性化的订单选配、多层级计划管理模式、复杂的物料齐套规划、频繁的设计变更管理、精细化制造执行和用料管控、精准的售后服务等行业特性,提供一站式整体解决方案。 行业趋势洞察 个性化定制 洞察…

FPGA中的亚稳态

一、建立时间和保持时间 对于数字系统而言,建立时间(setup time,Tsu)和保持时间(hold time,Th)是数字电路时序的基础。数字电路系统的稳定性,基本取决于时序是否满足建立时间和保持时…

详细版的Jsoncpp的使用,包括在VS环境下配置

目录 准备环境VS 环境下配置编译使用 基础概述Json 数组Json 对象 Jsoncpp 的使用ValueFastWriterReader示例 如果想要 Json 部署在 Linux 上 参考: https://blog.csdn.net/2303_76953932/article/details/142703683?spm1001.2014.3001.5502 C中原生不支持 Json,所…

ClickHouse 数据保护指南:从备份到迁移的全流程攻略

一、背景 运行3年的clickhouse需要迁移机房,迁移单库单表的140亿条的数据。采用clickhouse-backup 的方式进行备份迁移,打包备份,再加上数据拷贝,数据恢复 一共花费30分钟。数据在一定量级,避免使用SQL 导入导出的方式…

配置 Visual studio 2022 Connector C++ 8.0环境 连接MySQL

Connector C 8.0 环境配置 1. 配置 Connector C 头文件地址 (1) 在Mysql的安装路径中找到 MySQL\Connector C 8.0\include\jdbc 例如 : C:\Program Files\MySQL\Connector C 8.0\include\jdbc (2) 打开VS2022&…

如何用好 CloudFlare 的速率限制防御攻击

最近也不知道咋回事儿,群里好多站长都反映被CC 攻击了。有人说依旧是 PCDN 干的,但明月感觉不像,因为有几个站长被 CC 攻击都是各种动态请求(这里的动态请求指的是.php 文件的请求)。经常被攻击的站长们都知道,WordPress /Typecho 这类动态博客系统最怕的就是这种动态请求…

塔吊识别数据集 yolo格式 共5076张图片 已划分好训练验证 txt格式 yolo可直接使用

塔吊识别数据集 yolo格式 共5076张图片 已划分好训练验证 txt格式 yolo可直接使用。 类别:塔吊(Tower-crane) 一种 训练数据已划分,配置文件稍做路径改动即可训练。 训练集: 4724 (正面3224 负面1500) 验证集&#xf…

【父子线程传值TransmittableThreadLocal使用踩坑-及相关知识拓展】

文章目录 一.业务背景二.TransmittableThreadLocal是什么?三.问题复现1.定义注解DigitalAngel2.定义切面3.TransmittableThreadLocal相关4.线程池配置信息5.Controller6.Service7.测试结果8.问题分析9 解决办法及代码改造10.最终测试: 四.与 ThreadLocal…

【大模型实战篇】创建有效的大模型提示词Prompt(提示词工程)

1. 背景介绍 随着chatgpt、llama、chatglm、claude AI等一系列生成式 AI 工具的普及,很明显能感受到,个人的生产力得到了大幅地提升。这些生成式算法模型能够帮助我们开发新想法、轻松获取信息,并简化各种个人和职业任务。个人在日常生活、工…