vue3进阶,渲染函数使用

目录

渲染函数使用场景

h() 渲染函数

渲染函数基础写法

渲染函数的组件传参,事件传递

渲染函数的插槽使用

结语


渲染函数使用场景

        在写这篇文章之前,我会先简单说一下渲染函数,并且我会在第一个渲染函数的介绍中,标名渲染函数的各种写法,在后续的渲染函数介绍中,我就只采用单一的写法去实现了。        

         这里附上官方网址:https://cn.vuejs.org/api/render-function.html       

        话不多说,正片开始!

        Vue 3项目中,渲染函数 (`render` function) 通常不是默认的选择,因为Vue的模板语法已经足够强大和灵活,可以满足大多数开发需求。然而,在某些特定的场景下,渲染函数会非常有用,因为render渲染的优先级是高于template的尤其是在需要高度动态内容或者优化性能的情况下。以下是一些可能使用渲染函数的项目实战场景:


        1. **复杂的动态内容**:当你的组件需要根据不同的条件渲染高度动态的结构时,渲染函数可以提供更大的灵活性。例如,根据数据动态生成表格、列表或者树形结构。
        2. **自定义渲染逻辑**:在某些情况下,你可能需要自定义渲染逻辑,比如实现一个复杂的自定义组件(如日期选择器、富文本编辑器等)。
        3. **性能优化**:在使用虚拟DOM的场景中,通过渲染函数可以更精细地控制DOM的更新,减少不必要的渲染,从而提高性能。
        4. ** JSX/TSX**:如果你使用的是TypeScript或者喜欢React的JSX语法,你可以结合Vue的渲染函数和JSX插件来实现类似React的开发体验。
        5. **函数式组件**:在Vue中,函数式组件通常与渲染函数一起使用,因为它们没有状态(state)和管理生命周期钩子的需要,可以提供更高的性能。
        6. **图形和可视化**:在开发图形界面(如图表、地图等)时,渲染函数可以提供更直接的方式来操作图形元素。
        7. **递归组件**:当需要渲染递归组件(比如树形控件)时,渲染函数可以更方便地处理递归逻辑。
        8. **外部库集成**:当需要将Vue与其他JavaScript库集成时,可能会用到渲染函数来桥接两者之间的DOM操作。


        在实际项目中,渲染函数的使用通常需要开发者对Vue的内部机制有较深的理解。因此,在决定是否使用渲染函数时,应该权衡其带来的灵活性和维护成本。对于大多数常规的UI开发任务,Vue的模板语法已经足够使用,而且更容易理解和维护。只有在遇到上述提到的特定场景时,才考虑使用渲染函数。

h() 渲染函数

先写一下几种写法,这几种写法参考了这篇文章:https://juejin.cn/post/7243357900939919418?searchId=20240703154620A17D2DF9F258021408F2

选项式API:

import { h } from 'vue'export default {data() {return {msg: 'hello'}},render() {return h('div', this.msg)}
}

 组合式API:

// 无须template部分,就会在页面显示一个div。
import { ref, h } from 'vue'export default {props: {/* ... */},setup(props) {const count = ref(1)// 返回渲染函数return () => h('div', props.msg + count.value)}
}

组合式API+setup语法糖:

<template><hd />
</template>
<script lang="tsx" setup>
import { h } from 'vue'// 返回一个组件hd
const hd = h('div',Array.from({ length: 20 }).map(() => {return h('p', 'hi')})
)
</script>

在接下来所有的例子中,我都会使用组合式API+setup语法糖

渲染函数基础写法

首先介绍一下基础写法:

<template><div><hd /></div>
</template><script setup>import { h } from 'vue'const hd = h('div', { class: 'className', id: 'idName', innerHTML: 'hello', style: {                 background: 'yellow',padding: '10px', width: '70px' } })
</script>

这段代码在页面上就是这样展示的:

不知道大家发现没有,这种写法就跟react中JSX很像了,都是吧DOM作为对象

渲染函数的组件传参,事件传递

当然,这种语法常见的写法还是要引入组件

子组件ceshi.vue中:

<template><div>这是测试引入的组件{{ props.someProp }}<button @click="ceshiChrild">按钮</button></div>
</template><script setup>
import { ref, defineEmits, defineProps } from 'vue'const props = defineProps({someProp: {type: String,default: ''}
})const emit = defineEmits(['ceshiApi'])const ceshiChrild = () => {emit('ceshiApi')
}</script>

父组件中:

<template><div><hd /><ceshiZuJian /></div>
</template><script setup>
import { ref, h } from 'vue'import ceshi from './ceshi.vue'const hd = h('div', { class: 'className', id: 'idName', innerHTML: 'hello', style: { background: 'yellow', padding: '10px', width: '70px' } })const ceshiZuJian = h(ceshi, {// 等价于 some-prop="hello"someProp: '传入的数据',// 等价于 @ceshiApi="ceshiApiInner()"onCeshiApi: () => { ceshiApiInner() }
})const ceshiApiInner = () => {console.log('ceshi');
}</script>

这样展示出来的样子就是这样的:

点击按钮,会打印‘ceshi’

至此,组件的引入,传参,事件触发展示完毕

渲染函数的插槽使用

这点学完之后,就基本上可以用渲染函数h()做很多工作了

官网中给出的例子是这样的:

官网给出的这种写法展示了在Vue 3中使用渲染函数 (h) 时,如何传递插槽内容给子组件。在Vue 3中,h函数可以接受三个参数:第一个参数是组件或者HTML标签名,第二个参数是传递给组件的属性和事件监听器,第三个参数是插槽内容。

我个人不太喜欢这种写法,而且在我们日常的开发中,我认为只需要掌握最常见的具名插槽,就可以满足绝大部分应用场景,所以我在这里就只去写具名插槽的使用了

子组件:

<template><div>这是测试引入的组件{{ props.someProp }}<button @click="ceshiChrild">按钮</button><slot name="footer"></slot></div>
</template><script setup>
import { ref, defineEmits, defineProps } from 'vue'const props = defineProps({someProp: {type: String,default: ''}
})const emit = defineEmits(['ceshiApi'])const ceshiChrild = () => {emit('ceshiApi')
}</script>

父组件:

<template><div><hd /><ceshiZuJian /></div>
</template><script setup>
import { ref, h } from 'vue'import ceshi from './ceshi.vue'const hd = h('div', { class: 'className', id: 'idName', innerHTML: 'hello', style: { background: 'yellow', padding: '10px', width: '70px' } })const ceshiZuJian = h(ceshi, {// 等价于 some-prop="hello"someProp: '传入的数据',// 等价于 @ceshiApi="ceshiApiInner()"onCeshiApi: () => { ceshiApiInner() }
}, {// 使用 slots 对象定义具名插槽footer: () => h('h1', '这是底部内容')
})const ceshiApiInner = () => {console.log('ceshi');
}onMounted(() => {})
</script>

上面展示出来的样子就是这样:

至此,我们就学完了绝大部分关于渲染函数h()的使用

结语

由于时间有限,先写这么些,渲染函数有很多,我会在后续有时间的时候,把剩下的一一补充上,也欢迎大家对我这篇文章做出补充和修改

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

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

相关文章

[Go 微服务] Kratos 验证码业务

文章目录 1.环境准备2.验证码服务2.1 kratos 初始化验证码服务项目2.2 使用 Protobuf 定义验证码生成接口2.3 业务逻辑代码实现 1.环境准备 protoc和protoc-gen-go插件安装和kratos工具安装 protoc下载 下载二进制文件&#xff1a;https://github.com/protocolbuffers/protobu…

探索智慧校园人事系统:社会关系管理功能全解析

智慧校园人事系统中的社会关系管理模块&#xff0c;旨在通过数字化手段&#xff0c;高效、安全地记录与管理教职工的社会联系信息&#xff0c;包括但不限于家庭成员、紧急联系人、学术合作关系、社会兼职等&#xff0c;旨在促进学校对教职工个人生活关怀及职业网络拓展的理解和…

四、(2)获取数据(补充urllib)(爬虫及数据可视化)

四、&#xff08;2&#xff09;获取数据&#xff08;补充urllib&#xff09;&#xff08;爬虫及数据可视化&#xff09; urllibget请求post请求User-AgentResponse模拟真实信息在豆瓣spider中真实实现 urllib 此处的扩展&#xff0c;可以进行在主体的程序学习完成后&#xff0…

【数据结构】04.双向链表

一、双向链表的结构 注意&#xff1a;这里的“带头”跟前面我们说的“头节点”是两个概念&#xff0c;带头链表里的头节点&#xff0c;实际为“哨兵位”&#xff0c;哨兵位节点不存储任何有效元素&#xff0c;只是站在这里“放哨的”。 “哨兵位”存在的意义&#xff1a;遍历循…

Roboflow自动标定数据集

最近需要自己打数据集&#xff0c;记录一下用Roboflow来打标签。 https://roboflow.com/&#xff08;官网&#xff09; 进入官网先注册&#xff0c;注册完成后进入这个界面。 我先讲如果不想让数据集公开怎么办&#xff0c;因为这里每个新建的都是公开的。新账号进去应该进去…

【数据分享】国家级旅游休闲街区数据(Excel/Shp格式/免费获取)

之前我们分享过从我国文化和旅游部官网整理的2018-2023年我国50个重点旅游城市星级饭店季度经营状况数据&#xff08;可查看之前的文章获悉详情&#xff09;&#xff01;文化和旅游部官网上也分享有很多与旅游相关的常用数据&#xff0c;我们基于官网发布的名单文件整理得到全国…

Qt Creator13配置Android开发环境

QT Creator13是目前&#xff08;2024年&#xff09;最新版本&#xff0c;配置Android开发环境有一些不一样&#xff0c;走了一些弯路&#xff0c;记录如下。 1、安装JDK和SDK 下载安装JDK和SDK&#xff0c;建议安装在无空格和中文字符的目录下。 具体安装步骤不再赘述&#…

GraalVM

文章目录 1、什么是GraalVM2、GraalVM的两种模式1_JIT模式2_AOT模式3_总结 3、应用场景1_SpringBoot搭建GraalVM应用2_函数计算3_Serverless应用 4、参数优化和故障诊断1_内存快照文件的获取2_运行时数据的获取 1、什么是GraalVM GraalVM是Oracle官方推出的一款高性能JDK&…

如何改善提示词,让 GPT-4 更高效准确地把视频内容整体转换成文章?

&#xff08;注&#xff1a;本文为小报童精选文章。已订阅小报童或加入知识星球「玉树芝兰」用户请勿重复付费&#xff09; 让我们来讨论一下大语言模型应用中的一个重要原则 ——「欲速则不达」。 作为一个自认为懒惰的人&#xff0c;我一直有一个愿望&#xff1a;完成视频制作…

Spire.PDF for .NET【文档操作】演示:以特定的缩放比例/百分比打开 PDF 文件

有时&#xff0c;我们可能需要在显示 PDF 文件时更改缩放比例以满足我们的要求。在本文中&#xff0c;我们将演示如何使用 Spire.PDF for .NET 以特定的缩放比例/百分比&#xff08;例如默认值、100% 或任何其他所需的缩放比例&#xff09;打开 PDF 文件。 Spire.PDF for .NET…

Renesas R7FA8D1BH (Cortex®-M85) I2C接口应用(OLED)

目录 概述 1 软硬件 1.1 软硬件环境信息 1.2 开发板信息 1.3 调试器信息 2 FSP和KEIL配置I2C 2.1 I2C硬件电路 2.2 FSP配置参数 3 软件功能实现 3.1 FSP生成项目 3.2 FSP中I2C接口函数 3.2.1 I2C Master的函数列表 3.2.2 函数功能介绍 3.3 I2C接口 4 验证i2c接口…

Vant Design - VUE 时间区间限制

效果图&#xff0c;限制7天 实现代码 <a-range-picker v-model"dateTime" style"width: 100%" :disabled-date"disabledDate" format"YYYY-MM-DD HH:mm:ss" :showTime"true" :placeholder"[开始时间, 结束时间]&quo…

浅析MySQL-索引篇01

什么是索引&#xff1f; 索引是帮助存储引擎快速获取数据的一种数据结构&#xff0c;类似于数据的目录。 索引的分类 按数据结构分类&#xff1a; MySQL 常见索引有 BTree 索引、HASH 索引、Full-Text 索引。 Innodb是MySQL5.5之后的默认存储引擎&#xff0c;BTree索引类型也…

量产工具一一文字系统(三)

目录 前言 一、文字数据结构抽象 1.描述一个文字的位图 2.描述一个字库操作 3.font_manager.h 二、实现Freetype封装 1.freetype.c 三、实现文字管理 1.font_manager.c 四、单元测试 1.font_test.c 2.disp_manager.c 3.disp_manager.h 4.上机测试 前言 前面我们…

从搜索框的提示词中再探防抖和节流

前言 最近逛掘金时&#xff0c;看到了一篇文章。发现是我之前写过的一篇文章主题是防抖和节流的&#xff0c;看防抖时没感觉哪里不一样&#xff0c;但是当我看到节流时发现他的节流怎么这么繁琐(・∀・(・∀・(・∀・*)&#xff1f; 抱着疑惑的想法&#xff0c;我仔细拜读了这…

深度学习简介-AI(三)

深度学习简介 深度学习简介深度学习例子深度学习训练优化1.随机初始化2.优化损失函数3.优化器选择4.选择/调整模型结构 深度学习常见概念隐含层/中间层随机初始化损失函数导数与梯度优化器Mini Batch/epoch 深度学习训练逻辑图 深度学习简介 深度学习例子 猜数字 A: 我现在心…

机器学习Day10:聚类

概念 聚类是按照某个特定标准把一个数据集分割成不同的类或簇&#xff0c;使得同一个簇内的数据对象的相似性尽可能大&#xff0c;同时不在同一个簇中的数据对象的差异性尽可能大 聚类的过程 数据准备&#xff1a;特征标准化和降维特征选择&#xff1a;从最初的特征中选择最…

rust 终端显示综合例程

文章目录 demo程序1 terminal_size2 term_grid3 crossterm3.1 style 4 lscolors准备内容4.1 LsColors 5 users5.1 获取用户/用户组信息5.2 通过缓存获取 demo程序 综合demo 各个库使用demo 1 terminal_size 一个获取终端界面大小的库&#xff0c;支持linux、macos、windows。…

keil5模拟 仿真 报错没有读写权限

debug*** error 65: access violation at 0x4002100C : no write permission 修改为&#xff1a; Dialog DLL默认是DCM3.DLL Parameter默认是-pCM3 应改为 Dialog DLL默认是DARMSTM.DLL Parameter默认是-pSTM32F103VE

【机器学习】机器学习与电商推荐系统的融合应用与性能优化新探索

文章目录 引言第一章&#xff1a;机器学习在电商推荐系统中的应用1.1 数据预处理1.1.1 数据清洗1.1.2 数据归一化1.1.3 特征工程 1.2 模型选择1.2.1 协同过滤1.2.2 矩阵分解1.2.3 基于内容的推荐1.2.4 混合推荐 1.3 模型训练1.3.1 梯度下降1.3.2 随机梯度下降1.3.3 Adam优化器 …