【vue】h 函数的使用

news2024/11/16 13:27:38

文章目录

    • 1. 引言
    • 2. h 函数
    • 3. h 函数的使用
      • 3.1 v-if
      • 3.2 v-for
      • 3.3 v-on
      • 3.4 组件
      • 3.5 渲染插槽
    • 4. h函数的使用场景
    • 参考链接

1. 引言

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

一般在 vue项目开发中,一般都是这样的结构

<template>
  <div>

  </div>
</template>

<script setup lang="ts">

</script>

<style scoped>

</style>

但是有时候 不想写 template 想用 原生js 的方式 返回DOM 结构,就需要用到 h 函数

2. h 函数

h() 是 hyperscript 的简称——意思是“能生成 HTML (超文本标记语言) 的 JavaScript”。这个名字来源于许多虚拟 DOM 实现默认形成的约定。一个更准确的名称应该是 createVnode(),但当你需要多次使用渲染函数时,一个简短的名字会更省力。

// 完整参数签名
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 }

参数

  • type:必填,字符串/组件(字符串:一个html标签名
  • props:非必填,一个对象,内容包括了即将创建的节点的属性,例如 id、class、style等,节点的事件监听也是通过 props 参数进行传递,并且以 on 开头,以 onXxx 的格式进行书写,如 onInput、onClick 等。不写的话最好用 null占位
  • children:这个是子节点,也可以是数组

官方示例

import { h } from 'vue'

// 除了 type 外,其他参数都是可选的
h('div')
h('div', { id: 'foo' })

// attribute 和 property 都可以用于 prop
// Vue 会自动选择正确的方式来分配它
h('div', { class: 'bar', innerHTML: 'hello' })

// class 与 style 可以像在模板中一样
// 用数组或对象的形式书写
h('div', { class: [foo, { bar }], style: { color: 'red' } })

// 事件监听器应以 onXxx 的形式书写
h('div', { onClick: () => {} })

// children 可以是一个字符串
h('div', { id: 'foo' }, 'hello')

// 没有 prop 时可以省略不写
h('div', 'hello')
h('div', [h('span', 'hello')])

// children 数组可以同时包含 vnode 和字符串
h('div', ['hello', h('span', 'hello')])

3. h 函数的使用

setup 版本

<script>
import { h } from "vue";
export default {
  setup() {
    return () => h("div", { class: "my-class" }, "Hello, World!");
  },
};
</script>

<style lang="less" scoped></style>

然后再 app.vue 中引入这个 组件,并使用

<template>
  <div>
    <h2>h 函数测试</h2>
    <hello1 />
    <hr />
  </div>
</template>

<script setup>
import hello1 from "./views/01_h函数/hello.vue";
</script>

<style scoped></style>

在这里插入图片描述

然后就可以再界面上看到效果了

render 版本

<script>
import { h } from "vue";
export default {

  render() {
    return h("div", { class: "my-class" }, "Hello, World ddg!");
  },
};
</script>

<style lang="less" scoped></style>

3.1 v-if

在这里插入图片描述

<script>
import { h, ref } from "vue";
export default {
  setup() {
    // v-if
    const isShow = ref(true);
    return () => h("div", isShow.value ? "Hello, World true" : "Hello, World false");
  },
};
</script>

3.2 v-for

在这里插入图片描述

<script>
import { h, ref, render } from "vue";
export default {
  setup() {
    // -----------
    // v-for
    const list = ref([
      { name: "张三", age: 18 },
      { name: "李四", age: 19 },
      { name: "王五", age: 20 },
    ]);

    return () =>
      h(
        "div",
        list.value.map((item) => h("div", `姓名${item.name} 年龄${item.age}`))
      );
  },
};
</script>

注意:因为我们要展示 list 的数组的所有项, 所以第一个 h 函数 是需要有子节点的,这个参数是一个数组,所以要用 map , map 函数返回一个数组,这个数组每一项都是 h 函数

3.3 v-on

on 开头,并跟着大写字母的 props 会被当作事件监听器。比如,onClick 与模板中的 @click 等价。

在这里插入图片描述

<script>
import { h, ref, render } from "vue";
export default {
  setup() {
    // v-on
    const handleBtnClick = () => {
      console.log("click");
    };
    return () =>
      h("button", { style: { color: "red", background: "pink", padding: "10px" }, onClick: handleBtnClick }, "提交");
  },
};
</script>

如若需要给事件传递参数可以这样写

      h(
        "button",
        {
          style: { color: "red", background: "pink", padding: "10px" },
          onClick: () => handleBtnClick("ddg"),
        },
        "提交"
      );

搭配for循环,实现点击这一行,触发点击事件

<script>
import { h, ref, render } from "vue";
export default {
  setup() {
    const handleBtnClick = (params) => {
      console.log("click", params);
    };
    const list = ref([
      { name: "张三", age: 18 },
      { name: "李四", age: 19 },
      { name: "王五", age: 20 },
    ]);
    // return () =>
    //   h("button", { style: { color: "red", background: "pink", padding: "10px" }, onClick: handleBtnClick }, "提交");
    return () =>
      h(
        "button",
        list.value.map((item) =>
          h(
            "div",
            {
              style: { color: "red", background: "pink", padding: "10px", marginBottom: "10px" },
              onClick: () => handleBtnClick(item),
            },
            `姓名${item.name} 年龄${item.age}`
          )
        )
      );
  },
};
</script>

在这里插入图片描述

3.4 组件

在给组件创建 vnode 时,传递给 h() 函数的第一个参数应当是组件的定义。这意味着使用渲染函数时不再需要注册组件了 —— 可以直接使用导入的组件:

btn组件

<template>
  <div>
    <button class="rounded-lg bg-amber-500 p-[9px]">btn组件的按钮</button>
  </div>
</template>

<script setup></script>

<style lang="less" scoped></style>

具体使用方式如下:

<script>
import { h, ref, render } from "vue";
import BtnCPN from "./btn.vue";
export default {
  setup() {
    return () => h(BtnCPN);
  },
};
</script>

在这里插入图片描述

能展示出来信息就是正常

3.5 渲染插槽

有时候,父组件使用这个组件的时候,也会传递过来插槽

子组件

<script>
import { h, ref, render } from "vue";
import BtnCPN from "./btn.vue";
export default {
  setup(props, { slots }) {
    // 渲染插槽
    return () => [
      h("div", "默认插槽的内容开始"),
      slots.default(),
      h("div", "默认插槽的内容结束"),
      h("div", "具名插槽 footer 的内容开始"),
      slots.footer(),
      h("div", "具名插槽 footer 的内容结束"),
    ];
  },
};
</script>

<style lang="less" scoped></style>

父组件

<template>
  <div>
    <h2>h 函数测试</h2>
    <div>
      <hello1>
        <template #default>
          <p>我是父组件传递过来的默认插槽1</p>
          <p>我是父组件传递过来的默认插槽2</p>
        </template>
        <template #footer>
          <br />
          <p>我是父组件传递过来的footer插槽</p>
        </template>
      </hello1>
    </div>
    <hr />
  </div>
</template>

<script setup>
import { ref } from "vue";
import hello1 from "./views/01_h函数/hello.vue";
</script>

<style scoped></style>

在这里插入图片描述

渲染到界面上的效果就是这样

其实插槽的本质,就是父组件传递过来了一个对象,对象里面的key 是插槽的名称,值就是一个函数,再子组件可以调用这个函数进行渲染DOM

在这里插入图片描述

4. h函数的使用场景

  1. 用 h 函数 写一个组件
  2. componentis 属性可以搭配 h 函数使用
  3. 在一些 UI库中,也有一些使用场景,比如 Ant Design Vue 的表格组件的一些自定义项

在这里插入图片描述

<template>
  <div>
    <!-- <component :is="renderContainer" /> -->
    <component :is="renderContainer('add')" />
  </div>
</template>

<script setup>
import { ref, h } from "vue";


// const renderContainer = h("div", "我是H 函数渲染出来的!!!!");
const renderContainer = (type) => {
  if (type === "add") {
    return h("div", "我是H 函数渲染出来的!!!!" + "    新增");
  } else {
    return h("div", "我是H 函数渲染出来的!!!!");
  }
};
</script>

<style scoped></style>

在这里插入图片描述

文档上下面还有一些 属性可以用到 h 函数

参考链接

  • h 函数 vue2 官方文档
  • Ant Design Vue table 组件

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

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

相关文章

C++ 面试题常用总结 详解(满足c++ 岗位必备,不定时更新)

&#x1f4da; 本文主要总结了一些常见的C面试题&#xff0c;主要涉及到语法基础、STL标准库、内存相关、类相关和其他辅助技能&#xff0c;掌握这些内容&#xff0c;基本上就满足C的岗位技能&#xff08;红色标记为重点内容&#xff09;&#xff0c;欢迎大家前来学习指正&…

01 网络编程-概念引入

目录 1、互联网与物联网 2、计算机网络分类 &#xff08;1&#xff09;按地理范围分类 &#xff08;2&#xff09;按网络拓扑分类 &#xff08;3&#xff09;按网络用途分类 3、套接字 4、网络的七层模型&#xff08;OSI--国际化标准&#xff09; 5、TCP/IP四层协议栈 …

qml ChartView实现动态数据曲线

文章目录 一、qml静态数据曲线二、qml ChartView实现动态数据曲线三、使用C++给曲线提供数据更多qml教程,请参考QML入门进阶教程专栏:https://mingshiqiang.blog.csdn.net/category_9951228_2.html 本篇博客介绍使用qml实现动态数据曲线,效果图如下: 本篇博客代码通过C+…

DolphinScheduler3.2.2在centos7上伪集群部署

DolphinScheduler 是一个分布式易扩展的可视化工作流任务调度系统。集成了很多数据处理常用的功能&#xff0c;包括定时任务&#xff0c;脚本执行&#xff0c;错误预警等。 它具有以下一些主要特点和优势&#xff1a; 分布式架构&#xff1a;支持大规模任务的调度和管理&#…

centos7卸载docker报错No Packages marked for removal

执行&#xff1a; yum -y remove docker* 报错&#xff1a; No Packages marked for removal 执行&#xff1a; yum list installed | grep docker yum remove -y docker-ce.x86_64 docker-ce-cli.x86_64 containerd.io.x86_64

进程的退出以及线程

接上节&#xff1a; 1.wait 本身是一个阻塞操作&#xff0c;谁调用它就会使调用者阻塞 2.父进程要获得子进程的退出状态 要两个进程配合操作&#xff1a; 子进程&#xff1a; exit(退出状态值&#xff09; 退出状态值 只有最低为有效&#xff0c;范围为[0-255] 父进程 wa…

<Qt> 系统 - 网络编程 | 音视频

目录 前言&#xff1a; 一、QUdpSocket &#xff08;一&#xff09;核心 API 概览 &#xff08;二&#xff09;设计一个UDP回显服务器 二、QTCPSocket &#xff08;一&#xff09;核心 API 概览 &#xff08;二&#xff09;设计一个TCP回显服务器 三、HTTP Client 四、…

javaer快速入门 goweb框架 gin

gin 入门 前置条件 安装环境 配置代理 # 配置 GOPROXY 环境变量&#xff0c;以下三选一# 1. 七牛 CDN go env -w GOPROXYhttps://goproxy.cn,direct# 2. 阿里云 go env -w GOPROXYhttps://mirrors.aliyun.com/goproxy/,direct# 3. 官方 go env -w GOPROXYhttps://goproxy.…

【自动驾驶】自定义消息格式的话题通信(C++版本)

目录 新建消息文件更改包xml文件中的依赖关系更改cmakelist文件中的配置执行时依赖改变cmakelist编译顺序发布者程序调用者程序新建launch文件程序测试 新建消息文件 在功能包目录下&#xff0c;新建msg文件夹&#xff0c;下面新建mymsg.msg文件&#xff0c;其内容为 string …

机械行业数字化生产供应链产品解决方案(十六)

我们的机械行业数字化生产供应链产品解决方案通过全面应用物联网、人工智能和大数据技术&#xff0c;构建了一个高效的智能生产与供应链系统&#xff0c;能够在设计、生产和物流全环节中实现实时数据监控与动态优化。系统通过智能分析和预测&#xff0c;优化了生产计划和资源配…

Linux系统驱动(十九)块设备驱动

文章目录 一、块设备驱动简介&#xff08;一&#xff09;简介&#xff08;二&#xff09;块设备驱动相关概念 二、块设备驱动&#xff08;一&#xff09;框架图1. 虚拟文件系统&#xff08;VFS&#xff09;2. Disk Cache&#xff1a;硬盘的高速缓存3. 映射层&#xff08;mappin…

IP代理如何增强网络安全性?

在当今的数字时代&#xff0c;网络安全已成为一个关键问题&#xff0c;而使用 IP 代理可以成为增强网络安全的有效方法。根据请求信息的安全性&#xff0c;IP 代理服务器可分为三类&#xff1a;高级匿名代理、普通匿名代理和透明代理。此外&#xff0c;根据使用的用途&#xff…

NT35510的LCD函数详解01(洋桃电子-触摸屏开发者笔记)

NT35510的LCD函数详解01&#xff08;洋桃电子-触摸屏开发者笔记&#xff09; 资料下载&#xff1a; 洋桃电子 YoungTalk 探索最好的 STM32 教学 (doyoung.net) 接口类型 NT35510 数据手册&#xff08;英文&#xff09;.pdf NT35510 应用手册&#xff08;英文&#xff09;.…

Jenkins持续集成工具学习

一、从装修厨房看项目开发效率优化 二、持续集成工具 三、JavaEE项目部署方式对比 四、Jenkins+SVN持续集成环境搭建

WebGoC题解(18) 630.电线杆(2019NHOI小乙)

题目描述 小C在农场的附近看到有n颗电线杆排成一行&#xff0c;相邻之间距离为20。它们高度可能不一样&#xff0c;但高度相同的电线杆顶端有电线连接。如下面示意图中&#xff0c;电线杆用粗细为6的垂直直线画&#xff0c;电线用粗细为2的水平直线画。给定每个电线杆的高度&am…

Linux-Haproxy搭建Web群集

LVS在企业应用中抗负载能力强 不支持正则处理&#xff0c;不能实现动静分离对于大型网格&#xff0c;LVS的实施配置复杂&#xff0c;维护成本较高 Haproxy是一款可提供高可用性、负载均衡、及基于TCP和HTTP应用的代理的软件 适用于负载大的Web站点运行在硬件上可支持数以万计的…

AI大模型开发——4.transformer模型(0基础也可懂)(1)

无论是想怎样学习大模型&#xff0c;transformer都是一个绕不开的话题。transformer的出现彻底改变了nlp领域&#xff0c;进一步推动了大模型的产生&#xff0c;可以说&#xff0c;transformer就是大模型开发的鼻祖。 可能只通过说大家会有些不理解。大家可以看下方的大语言模型…

打卡第四十四天:最长公共子序列、不相交的线、最大子序和、判断子序列

一、最长公共子序列 题目 文章 视频 本题和最长重复子数组区别在于这里不要求是连续的了&#xff0c;但要有相对顺序&#xff0c;即&#xff1a;"ace" 是 "abcde" 的子序列&#xff0c;但 "aec" 不是 "abcde" 的子序列。 确定dp数…

4个快捷高效的ai在线写作工具推荐。

ai在线写作因其快速的创作方式&#xff0c;高效的写作效率以及能够为我们带来无限的灵感而被广泛应用。如果你还不会使用ai进行写作的话&#xff0c;就看看下面这4款AI写作工具吧。 1、笔灵在线创作 直通车 :https://ibiling.cn 这是个在线的AI工具网站&#xff0c;在内容创作…

个人可识别信息(PII) AI 去除 API 数据接口

个人可识别信息(PII) AI 去除 API 数据接口 ai / 隐私保护 基于 AI 模型自动去除个人识别信息&#xff08;PII&#xff09; 个人信息保护 / AI 模型 。 1. 产品功能 基于自有专业模型进行 PII 自动去除高效处理敏感信息全接口支持 HTTPS&#xff08;TLS v1.0 / v1.1 / v1.2 /…