vue3进阶,渲染函数使用

news2024/11/16 20:51:42

目录

渲染函数使用场景

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.coloradmin.cn/o/1892204.html

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

相关文章

算法力扣刷题记录 二十八【225. 用队列实现栈】

前言 栈和队列篇。 记录 二十八【225. 用队列实现栈】 一、题目阅读 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 实现 MyStack 类&#xff1a; void p…

单片机关键任务优先级的实现学习

与总体产品联调时&#xff0c;需要各个单机系统严格按照总体要求&#xff0c;进行数据输出&#xff0c;时间的偏差将出现系统异常&#xff0c;控制失败等不稳定情况产生&#xff0c;甚至影响到产品安全。 因此必须确保某些关键任务的优先执行。单片机任务优先级一般有两种方式…

My sql 安装,环境搭建

以下以MySQL 8.0.36为例。 一、下载软件 1.下载地址官网&#xff1a;https://www.mysql.com 2. 打开官网&#xff0c;点击DOWNLOADS 然后&#xff0c;点击 MySQL Community(GPL) Downloads 3. 点击 MySQL Installer for Windows 4.点击Archives选择合适版本 5.选择后下载…

【国产开源可视化引擎Meta2d.js】锚点

国产开源 乐吾乐潜心研发&#xff0c;自主可控&#xff0c;持续迭代优化 Github&#xff1a;GitHub - le5le-com/meta2d.js: The meta2d.js is real-time data exchange and interactive web 2D engine. Developers are able to build Web SCADA, IoT, Digital twins and so …

神经网络入门:从零到训练

想要认识神经网络&#xff0c;个人认为还是需要先从回归开始理解 线性回归 回归&#xff08;regression&#xff09;是能为一个或多个自变量与因变量之间关系建模的一类方法。 在自然科学和社会科学领域&#xff0c;回归经常用来表示输入和输出之间的关系。 在机器学习领域中…

【Python机器学习】算法链与管道——构建管道

目录 1、首先&#xff0c;我们构建一个由步骤列表组成的管道对象。 2、向任何其他scikit-learn估计器一样来拟合这个管道 3、调用pipe.score 我们来看下如何使用Pipeline类来表示在使用MinMaxScaler缩放数据后&#xff0c;再训练一个SVM的工作流程&#xff08;暂时不用网格搜…

你知道是怎么运作的吗?神经网络内部原理解析

你知道神经网络是怎么运作的吗&#xff1f;神经网络内部原理解析 “神经网络就是一个具有输入和输出的黑盒” 神经网络模型就是模仿人类大脑神经元传递的过程&#xff0c;从使用者的角度来说&#xff0c;神经网络就是一个具有输入和输出的黑盒模型。 简化模型如下图&#xf…

python 比webdriver更好用的ChromiumPage

优点&#xff08;目前发现的&#xff09;&#xff1a; 不用配合selenium不用下载对应浏览器的webdriver&#xff0c;不用对应浏览器版本不用设置webdriver路径之类的设置目前没看到有出现像webdriver类似的浏览器被控制的提示&#xff0c;使用过程中好像也没被检测出来。每次不…

JAVA实现二分查找,斐波那契数列,深度优先搜索详情教程【包含代码】

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

《企业实战分享 · 内存溢出分析》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; 近期刚转战 CSDN&#xff0c;会严格把控文章质量&#xff0c;绝不滥竽充数&#xff0c;如需交流&#xff…

计算机系统中---信息就是位+上下文

hello.c #include <stdio.h>int main(){printf("hello,world\n");return 0; }hello程序的生命周期是从一个源程序(或者说源文件)开始的&#xff0c;即程序员通过编辑器创建并保存的文本文件&#xff0c;文件名是he11o.c。源程序实际上就是一个由值0和1组成的位…

推荐三款常用接口测试工具!

接口测试是软件开发中至关重要的一环&#xff0c;通过对应用程序接口进行测试&#xff0c;可以验证其功能、性能和稳定性。随着互联网和移动应用的快速发展&#xff0c;接口测试变得越来越重要。为了提高测试效率和质量&#xff0c;开发人员和测试人员需要使用专业的接口测试工…

复分析——第8章——共形映射(E.M. Stein R. Shakarchi)

第8章 共形映射(Conformal Mappings) The results I found for polygons can be extended under very general assumptions. I have undertaken this research because it is a step towards a deeper understanding of the mapping problem, for which not much has hap…

开放式耳机哪个牌子好?2024热门硬核机型推荐,不做冤大头

很多小伙伴私信我&#xff0c;想要挑选一款开放式耳机真的好难啊&#xff0c;现在开放式耳机市场的产品越来越多&#xff0c;知名的品牌和一些新兴的网红品牌哪一个最好&#xff1f;所以这篇文章&#xff0c;作为开放式耳机测评师&#xff0c;教大家如何挑选一款开放式耳机&…

工作助手VB开发笔记(1)

1.思路 1.1 样式 样式为常驻前台的一个小窗口&#xff0c;小窗口上有三到四个按钮&#xff0c;为一级功能&#xff0c;是当前工作内容的常用功能窗口&#xff0c;有十个二级窗口&#xff0c;为选中窗口时的扩展选项&#xff0c;有若干后台功能&#xff0c;可选中至前台 可最…

学生护眼台灯哪个牌子最好?几款口碑好、值得推荐的学生护眼台灯

家长们对孩子的用眼健康很重视&#xff0c;为什么&#xff1f;现在是科技电子时代&#xff0c;人们对电子屏幕的依赖性高&#xff0c;小孩子年纪小&#xff0c;眼部还处于正在发育的阶段&#xff0c;他们在学校中长时间的学习读写&#xff0c;用眼时间长。而且随着科技渗入教学…

36V高性能单双通道多路复用器开关控制器

产品简介 PC221 和 PC222 分别为单 8:1 和双通道 4:1 模拟多路复用器。由于特殊的设计优化&#xff0c;无论是上电状态还是掉电状态&#xff0c; PC221 和 PC222 都可以提供源端过压保护。正常供电状态下&#xff0c;多路复用器源端可以耐受持续的电压高达-50 V 至50 V。当掉电…

JS滚动时显示元素

本篇文章我们将实现文章平滑滑入 ● 其实这原本是用CSS实现的 .section {padding: 15rem 3rem;border-top: 1px solid #ddd;transition: transform 1s, opacity 1s; }.section--hidden {opacity: 0;transform: translateY(8rem); }● 我们的目的呢&#xff0c;就是当滚入到某一…

提升用户购物体验:多语言跨境电商系统源码优化技巧详解

随着全球化的发展&#xff0c;跨境电商已成为一种趋势。而在跨境电商中&#xff0c;多语言的支持是提升用户购物体验的重要一环。为此&#xff0c;本文将详细介绍多语言跨境电商系统源码的优化技巧。 一、多语言支持的重要性 在全球市场中&#xff0c;用户来自不同的国家和地…

日本服务器托管需要注意哪些问题

日本服务器托管是一项涉及多方面因素的重要决策&#xff0c;为了确保托管服务的稳定、高效与安全&#xff0c;企业或个人在托管过程中需要注意以下几个关键问题&#xff1a; 首先&#xff0c;数据中心的基础设施建设标准是决定托管稳定性的关键。这包括数据中心的建筑抗震、抗洪…