vue —— h函数的学习与使用

文章目录

  • 一、h函数是什么?
  • 二、h函数格式说明及使用
    • 示例1:简单创建一个VNode(vue3)
    • 示例2:vue2中h函数用法
    • 示例3:vue3中h函数的用法
    • vue2和vue3中h函数的区别?
  • 三、h函数实现原理
  • 四、h函数常用场景
  • 五、h函数及插槽slot使用
  • 六、h函数和v-model使用

一、h函数是什么?

先看一下 Vue3官方文档说明:
在这里插入图片描述

简单理解: Vue中的 h 函数是 Vue 用于创建虚拟DOM(Virtual DOM)节点的核心函数。在 Vue 3.0 版本中,这个函数作为渲染函数的基础工具,用于替代模板解析的过程,允许开发者以编程方式描述组件结构和动态生成虚拟节点。

二、h函数格式说明及使用

function h(type, props, children)
  • type: 必需,表示要创建的元素类型或组件类型。它可以是一个字符串(HTML标签名),一个组件选项对象、异步组件函数或者一个函数式组件。
  • props: 可选的对象,包含了传递给元素或组件的所有属性(attributes)和 props。例如:可以包含类名、样式、事件监听器等。
  • children: 可选,代表子节点,它可以是字符串(文本内容)、数组(包含多个子节点,每个子节点可以是字符串或其他由 h 创建的虚拟节点)或者其他合法的虚拟DOM节点。

示例1:简单创建一个VNode(vue3)

import { h } from 'vue'const vnode = h('div', // 类型为 div 标签{ id: 'app', class: 'container' }, // props 对象[ // 子节点数组h('p', { class: 'text' }, 'Hello, World!'), // 子节点1:一个 p 标签h('button', { onClick: handleClick }, 'Click me') // 子节点2:一个绑定了点击事件handleClick的按钮]
)function handleClick() {console.log('Button was clicked!')
}

通过h函数的方式构建虚拟DOM树,Vue可以在内部高效地比较新旧虚拟DOM的不同,并最小化地更新实际DOM,从而提高页面渲染性能。

示例2:vue2中h函数用法

import Vue from 'vue' // 引入Vue和h函数// 定义一个组件
var MyComponent = {props: ['message'],render: function (createElement) {return createElement( // createElement实际上就是h函数'div', // 元素类型{ 		 // 属性对象class: ['my-class'], style: { color: 'red' },on: {click: this.handleClick,},},[ // 子元素数组this.message, // 文本内容createElement('span', {}, '这是一个子元素'),])},methods: {handleClick: function (event) {console.log('Clicked!')}}
}// 注册并使用该组件
new Vue({el: '#app',components: {MyComponent},template: `<div id="app"><my-component message="Hello from custom render function!" /></div>`
})

示例3:vue3中h函数的用法

import { h, ref, defineComponent } from 'vue';// 定义一个使用h函数的组件
const MyComponent = defineComponent({props: {message: String,},setup(props) {const count = ref(0);function handleClick() {count.value++;}return () => h('div', { // 元素类型class: ['my-class'], style: { color: 'red' },onClick: handleClick, // 事件监听器}, [props.message, // 文本内容h('span', {}, '这是一个子元素'),`Clicked ${count.value} times`, // 动态文本内容]);},
});// 使用该组件
new Vue({render: (h) => h(MyComponent, { props: { message: "Hello from custom render function!" } }),
}).$mount('#app');

vue2和vue3中h函数的区别?

1、导入方式不同: Vue 2需要从 Vue 实例中获取 h 函数,通常在 render 函数中通过参数传递。Vue 3直接从 @vue/runtime-domvue 模块中导入。

// vue2
import Vue from 'vue';
export default {render(h) {// 使用 h 函数}
}// vue3
import { h } from 'vue';
export default {setup() {return () => h('div', 'Hello World');}
}

2、与Composition API集成

  • Vue 2不直接支持 Composition API,需要结合 options API 来使用。
  • Vue 3在 Composition API 的 setup 函数中可以直接使用响应式数据,并返回一个渲染函数作为组件的输出。

3、模板语法的替代

  • Vue 2在自定义渲染函数中广泛使用 h 函数来代替模板语法。
  • Vue 3虽然仍然可以使用 h 函数,但随着单文件组件(SFC)中模板语法以及Composition API的改进,直接使用 h 函数的情况相对较少。

4、优化与性能

  • Vue 3底层引擎优化,使得 h 创建的虚拟DOM更加高效,尤其是在大型应用中表现更好。

5、props的处理

  • Vue 3中的 props 是通过 defineComponentprops 属性显式声明的,而在使用 h 函数时,这些 prop 值可以通过 setup 函数中的 props 参数直接访问,无需像 Vue 2 中那样进行解构。

总结来说:Vue 3中的 h 函数保持了其核心作用,但在上下文、API集成度和性能等方面进行了改进和优化,使其更适应于现代Vue应用程序开发需求。

三、h函数实现原理

Vue中的 h 函数(在 Vue 2中也称为 createElement)是用于构建虚拟 DOM 节点的核心函数。

基本实现原理可概述如下:

1、虚拟DOM节点创建:当调用 h(type, props, children) 时,它会创建一个描述真实DOM元素或组件的虚拟对象。这个虚拟对象包含类型信息(如标签名、组件名称)、属性对象(包括类名、样式、事件绑定等)以及子节点列表。

2、响应式数据绑定:如果传递给 h 函数的属性值是响应式的(例如由 Vue 的 datacomputed 返回的值),Vue 将通过内部的响应式系统跟踪这些值的变化,并在需要时重新生成虚拟DOM树。

3、DOM更新优化:Vue 使用虚拟DOM来计算状态变化前后DOM结构的差异,并将最小化的更新应用到实际DOM上,这个过程称为“异步批处理更新”和“DOM diff算法”。当组件状态改变并触发重新渲染时,Vue 会比较新旧虚拟DOM树的差异,只对实际发生变化的部分进行DOM操作,避免了频繁地重绘整个页面,从而提高性能。

4、跨平台支持h 函数作为抽象层,不仅限于浏览器环境下的DOM渲染,还能够应用于服务器端渲染(SSR)以及其他非DOM环境,比如Weex等跨平台应用场景。

5、Vue框架中的应用:Vue 在编译模板阶段,会将模板转换为 render 函数,render 函数中就大量使用了 h 函数来构建虚拟DOM。在Vue 3中即使使用的是模板语法,Vue也会将其编译成基于 h 函数的渲染逻辑。

总结来说,Vue 中的 h 函数通过创建和维护虚拟DOM,结合响应式数据系统与高效的DOM更新策略,实现了高效、灵活的视图渲染机制。

四、h函数常用场景

1、自定义渲染逻辑:当模板语法不足以处理复杂的动态内容或需要根据运行时条件动态生成DOM结构时,可以使用 h 函数在组件的 render 函数中编写更灵活的渲染逻辑。

2、高级组件库开发:组件库开发者通常会依赖 h 函数来创建可复用、功能丰富的组件。通过编程方式构建虚拟节点,可以实现对DOM元素精细控制和优化,如高级表格组件、树形控件、拖拽排序等复杂交互场景。

3、性能优化:在某些性能关键路径上,通过手动编写 h 函数来精确控制DOM更新,避免不必要的子组件渲染,从而提升应用性能。

4、无模板组件:如果不希望或者无法使用 .vue 单文件组件中的 <template> 标签,可以完全基于 h 函数来编写组件的渲染内容。

5、与JSX结合:Vue 3支持 JSX 语法,而 JSX 在编译阶段会被转换为 h 函数调用,因此对于喜欢 React 风格 JSX 开发的开发者来说,h 函数是底层支持的基础。

6、服务端渲染 (SSR):在服务端渲染 Vue 应用时,也需要使用 h 函数来创建 SSR 环境下的虚拟 DOM 节点。

简单使用示例:

// 通过h函数根据传入的items数组动态生成多个<li>子元素,并确保每个子元素都有唯一的key属性,以便Vue进行高效的DOM更新
export default {name: 'CustomComponent',props: ['items'],render() {return h('ul',this.items.map(item => h('li', { key: item.id }, item.text)));}
}

五、h函数及插槽slot使用

import { h, defineComponent } from 'vue';// 定义一个使用插槽的子组件:通过this.$slots来访问并渲染插槽内容
const MyComponent = defineComponent({render() {return h('div', [this.$slots.default?.(), // 使用默认插槽this.$slots.header?.(),  // 使用具名插槽 - 名为"header"this.$slots.footer?.(),  // 使用具名插槽 - 名为"footer"]);},
});// 在父组件中使用MyComponent并插入插槽内容
export default defineComponent({render() {return h(MyComponent, {}, [h('p', '这是默认插槽的内容'), 					// 默认插槽的内容h('template', { slot: 'header' }, [ // 具名插槽"header"的内容h('h1', '这是头部插槽内容'),]),h('template', { slot: 'footer' }, [ // 具名插槽"footer"的内容h('p', '这是底部插槽内容'),]),]);},
});

六、h函数和v-model使用

h函数本身并不直接支持v-model指令,但通过正确设置props和自定义事件,可以模拟出类似的双向数据绑定效果。

示例:使用h函数创建子组件,并实现了类似v-model的功能

// 子组件:实现了v-model的行为
import { h, defineComponent, ref, toRef } from 'vue';const CustomInput = defineComponent({props: {modelValue: { type: String, required: true },},emits: ['update:modelValue'], // 声明将要触发的事件setup(props, { emit }) {const internalValue = ref(props.modelValue); // 创建一个响应式变量保存内部状态function handleChange(event) {internalValue.value = event.target.value; 			// 更新内部状态emit('update:modelValue', internalValue.value); // 触发更新事件}return () => h('input', {type: 'text',value: internalValue.value, // 将内部状态绑定到input元素的value属性onInput: handleChange, 			// 监听输入事件并更新状态});},
});export default CustomInput;
// 父组件
import { h, ref } from 'vue';
import CustomInput from './CustomInput.vue';export default {setup() {const inputValue = ref('初始值');return () => h(CustomInput, {modelValue: inputValue.value,'onUpdate:modelValue': (value) => {inputValue.value = value;},});},
};

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

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

相关文章

800G光传输网络中的相干调制与PAM4技术

在800G光传输网络架构中&#xff0c;相干调制技术和PAM4&#xff08;四电平脉冲幅度调制&#xff09;技术各具优势&#xff0c;分别针对不同应用场景提供高效解决方案。 相干调制是高级光通信的核心技术之一&#xff0c;它通过精密操控光载波的频率、相位和振幅来编码信息&…

HMI-Board以太网数据监视器(二)MQTT和LVGL

E ∫ d E ∫ k d q r 2 k L ∫ d q r 2 E \int dE \int \frac{kdq}{r^2} \frac{k}{L} \int \frac{dq}{r^2} E∫dE∫r2kdq​Lk​∫r2dq​ E Q 2 π ϵ L 2 E \frac{Q}{2\pi\epsilon L^2} E2πϵL2Q​ Γ ( n ) ( n − 1 ) ! ∀ n ∈ N \Gamma(n) (n-1)!\quad\forall n…

JavaScript 学习笔记(WEB APIs Day4)

「写在前面」 本文为 b 站黑马程序员 pink 老师 JavaScript 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。推荐先按顺序阅读往期内容&#xff1a; 1. JavaScript 学习笔记&#xff08;Day1&#xff09; 2. JavaSc…

C#使用RabbitMQ-1_Docker部署并在c#中实现简单模式消息代理

介绍 RabbitMQ是一个开源的消息队列系统&#xff0c;实现了高级消息队列协议&#xff08;AMQP&#xff09;。 &#x1f340;RabbitMQ起源于金融系统&#xff0c;现在广泛应用于各种分布式系统中。它的主要功能是在应用程序之间提供异步消息传递&#xff0c;实现系统间的解耦和…

pytorch学习笔记(十一)

优化器学习 把搭建好的模型拿来训练&#xff0c;得到最优的参数。 import torch.optim import torchvision from torch import nn from torch.nn import Sequential, Conv2d, MaxPool2d, Flatten, Linear from torch.utils.data import DataLoaderdataset torchvision.datas…

uniapp安卓android离线打包本地打包整理

离线打包准备 下载Android studio 1.准备资源hbuilder 2.准备离线SDK 最新android平台SDK下载最新android平台SDK下载 3.离线打包key申请 4.直接导入HBuilder-Integrate-AS工程,直接运行simpleDemo项目即可 5.安装java 1.8 jdk-8u151-windows-x64 6.遇到这个报错报错Caus…

在游戏里开公司!基于ERNIE SDK的多智能体游戏应用

在虚拟世界有一座神奇的办公室&#xff0c;当你输入你的创业方向&#xff0c;办公室的智慧打工人们将团结合作&#xff0c;为你的项目勤劳奔走&#xff0c;并在过程中&#xff0c;把日报周报都写好&#xff0c;让你随时掌握项目进度和最终成果&#xff01;该项目基于ERNIE SDK开…

MSG3D论文解读

论文在stgcn与sta-lstm基础上做的。下面讲一下里面的方法&#xff1a; 1.准备工作 符号。这里是对符号进行解释。 一个人体骨骼图被记为G(v,E) 图卷积&#xff1a; 图卷积定义 考虑一种常用于处理图像的标准卷积神经网络 (CNN)。输入是像素网格。每个像素都有一个数据值向…

Windows10上使Git Bash支持rsync命令操作步骤

rsync命令是linux上常用的工具之一&#xff0c;用于远程以及本地系统中拷贝/同步文件和文件夹。 Windows Git Bash默认并不支持rsync&#xff0c;如下图所示&#xff1a; 使Git Bash支持rsync命令操作步骤&#xff1a; 1.从https://repo.msys2.org/msys/x86_64/ 下…

一、MongoDB、express的安装和基本使用

数据库【Sqlite3、MongoDB、Mysql】简介&小记 Sqlite3&#xff1a; SQLite3是一个轻量级的数据库系统&#xff0c;它被设计成嵌入式数据库。这意味着它是一个包含在应用程序中的数据库&#xff0c;而不是独立运行的系统服务。适用场景&#xff1a;如小型工具、游戏、本地…

算力总规模位列全球第二!中创:助推数据中心建设

近日&#xff0c;国新办举办新闻发布会&#xff0c;介绍2023年工业和信息化发展情况。算力、数据中心、云计算等与数字化转型、能源利用息息相关&#xff0c;被多次提及。 工业和信息化部新闻发言人、运行监测协调局局长陶青表示&#xff1a; 数字基础设施支撑有力&#xff0c;…

力扣算法-Day18

18.四数之和 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#xff09;&#xff1…

亚马逊鲲鹏系统:批量注册买家号的新利器

近年来&#xff0c;随着电商市场的迅速发展&#xff0c;亚马逊作为全球最大的在线零售平台之一&#xff0c;其买家号的需求也日益增长。而亚马逊鲲鹏系统是一个能够批量全自动注册亚马逊买家号的系统。而对于全自动批量注册&#xff0c;账号资料方面&#xff0c;也有一定的要求…

vue3 + antd 封装动态表单组件(二)

传送带&#xff1a; vue3 antd 封装动态表单组件&#xff08;一&#xff09; 前置条件&#xff1a; vue版本 v3.3.11 ant-design-vue版本 v4.1.1 vue3 antd 封装动态表单组件&#xff08;一&#xff09;是基础版本&#xff0c;但是并不好用&#xff0c; 因为需要配置很多表…

【QT+QGIS跨平台编译】之八:【zstd+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、zstd介绍二、文件下载三、文件分析四、pro文件五、编译实践一、zstd介绍 ZSTD(Zstandard的缩写),是一种快速压缩算法,提供了高压缩比功能。ZSTD还为小数据提供了一种特殊的模式,称为字典压缩。ZSTD库使用BSD许可证作为开放源码软件提供的。它的格式是稳定的,…

【java题解】题目 1779: 你的第一个程序;题目 1779: 你的第一个程序;题目 1173: 计算球体积

目录 题目 1779: 你的第一个程序 题目描述 输入格式 输出格式 样例输入 样例输出 题解 题目 1173: 计算球体积 题目描述 输入格式 输出格式 样例输入 样例输出 题解 题目 1267: AB Problem 题目描述 输入格式 输出格式 样例输入 样例输出 题解 从今天开始…

TS学习笔记十:装饰器及三斜线指令

本节介绍TS中的装饰器和三斜线指令&#xff0c; 装饰器&#xff08;Decorators&#xff09;为我们在类的声明及成员上通过元编程语法添加标注提供了一种方式。   三斜线指令是包含单个XML标签的单行注释。 注释的内容会做为编译器指令使用。 讲解视频 20240116-205052装饰器…

基于一款热门大屏可视化设计器使用教程

乐吾乐大屏可视化设计器是一个用于创建和定制大屏幕数据可视化展示的工具&#xff0c;支持零代码实现物联网、工业智能制造等领域的可视化大屏、触摸屏端UI以及工控可视化的解决方案。同时也是一个Web组态工具&#xff0c;支持2D、3D等多种形式&#xff0c;用于构建具有实时数据…

华硕ASUS K43SD笔记本安装win7X64(ventoy为入口以支撑一盘多系统);友善之臂mini2440开发板学习

记录 老爷机 白色 华硕 K43SD 笔记本 安装 win7X64 1. MBR样式常规安装win7X64Sp1 (华硕 K43SD 安装 win7X64 ) 老爷机 白色 华硕 K43SD 笔记本 安装 win7X64 (常规安装) 设置: 禁用UEFI 启用AHCI ventoy制作MBR(非UEFI)方式的启动U盘 U盘中放cn_windows_7_ultimate_wit…

TCP 三次握手以及滑动窗口

TCP 三次握手 简介&#xff1a; TCP 是一种面向连接的单播协议&#xff0c;在发送数据前&#xff0c;通信双方必须在彼此间建立一条连接。所谓的 “ 连接” &#xff0c;其实是客户端和服务器的内存里保存的一份关于对方的信息&#xff0c;如 IP 地址、端口号等。 TCP 可以…