Vue2中的render函数

Vue 推荐在绝大多数情况下使用模板来创建你的 HTML。然而在一些场景中,你真的需要 JavaScript 的完全编程的能力。这时你可以用render渲染函数,它比模板更接近编译器

在Vue2中,render函数是一个可选的、用于生成虚拟DOM的特殊函数。它是Vue实例的一个选项,允许开发者使用JavaScript编写模板,而不是使用HTML模板。render函数接收一个h函数(h函数是createElement的别名。很多人喜欢用createElement,形参不过是个名称而已)作为参数,该函数用于创建虚拟节点(VNode)。

下面是一个render函数简单示例: 

render(h) {return h('h1', 'Hello, Vue!')
}

上面是一个简单写法,完整来说,h函数接受三个参数:

第一个参数:可以是字符串(表示HTML标签名或组件名)、组件对象或函数。如果是自定义组件,需要确保组件已经在当前实例或全局注册。

第二个参数:属性对象,包含传递给子组件的props、attrs、class、style等。

第三个参数:子节点,可以是字符串、数组或对象。

当第一个参数为HTML标签名的时候,常用配置如下: 

const vnode = h('div', {id: 'my-id', // 设置id属性class: 'my-class', // 设置class属性style: { color: 'red' }, // 设置内联样式onClick: function() { // 设置点击事件处理程序console.log('Clicked!');}
}, [h('p', { class: 'text' }, 'Hello, World!') // 子节点
]);

当第一个参数为组件名称时,配置如下:

const vnode = h('my-component', {// 组件的类名  使用同 :class  语法class: {aaa: true},// 组件的内联样式  使用同 :style  语法style: {color: 'blue'},// 一个对象,包含组件所需的属性。这些属性将被传递给组件,并在组件内部作为props进行访问。props: {msg: 'Hello, World!',},//一个对象,包含组件的非prop属性(例如,class、style等)。这些属性将被添加到组件的根元素上。attrs: {class: 'my-class',style: { color: 'red' }},// 一个对象,包含组件的事件处理程序。on: {click() {console.log('Clicked!!!')}},// 一个对象,包含组件的原生事件处理程序。与on类似,但用于监听原生DOM事件。nativeOn: {click() {console.log('Clicked!!!')}},// 一个对象,包含组件的DOM属性。domProps: {innerHTML: 'Hello, World!'},// 一个对象,包含组件的作用域插槽。scopedSlots: {default: () => h('h1', null, '我是标题1')},// 一个字符串或数组,表示组件的插槽内容slot: 'slot container',// 一个字符串或数字,表示组件的唯一标识符。key: 'unique-key',// 一个字符串,表示组件的引用标识符。ref: 'myComp',// 一个函数,返回组件实例的数据对象。data() {return {name: 'wft'}},// 一个对象,包含组件的指令。directives: [{ name: 'my-directive', value: 'Hello, World!' }],// 一个对象,包含组件的生命周期钩子。hooks: {created() {console.log('created!!')},mounted() {console.log('mounted!!')}},// 一个布尔值,表示是否将父组件的属性继承到子组件。inheritAttrs: true,// 一个字符串,表示组件的真实标签名。这在渲染组件时非常有用,因为它允许Vue跳过验证过程。is: 'my-component'
}, {default: () => h('p', null, '我是默认插槽')
});

我们在给子组件传递数据的时候,也就是父传子,一般写在props中, 其实也可以写在attrs中,如果写在attrs中,我们也可以在子组件中props中接受attrs中的变量,如果props中没写的变量都会在attrs中,我们在组件中通过this.$attrs中可以拿到。

下面是一个示例:

先使用render函数封装一个组件,注意写了render函数就不要写template了,不然render函数不起作用

@/components/BasicRender.vue

<script>
import { deepClone } from '@/utils'
export default {props: {tag: {type: String,default: 'div'},option: {type: Object,default: () => null},children: {type: [String, Array, Object],default: ''}},render(h) {const opt = deepClone(this.option)console.log(opt, 'opt-->.')return h(this.tag, opt, this.children)}
}
</script>

上面是一个vue组件,也可以写一个.js文件,写render函数,那么它也可以跟组件一样使用(注册使用):

@/components/Render.js

import { deepClone } from '@/utils'
export default {props: {tag: {type: String,default: 'div'},option: {type: Object,default: () => null},children: {type: [String, Array, Object],default: ''}},render(h) {const opt = deepClone(this.option)console.log(opt, 'opt  对象 obj -->.')return h(this.tag, opt, this.children)}
}

然后是main.vue,引入封装的render组件

 

<template><div class="wft-main"><BasicRender:tag="tag":option="option":children="children"/></div>
</template>
<script>
// import BasicRender from '@/components/Render'
import BasicRender from '@/components/BasicRender'
export default {data() {return {// tag: 'div',// option: {//   id: 'WFT',//   class: 'wft',//   style: {//     border: '1px solid red',//     width: '350px',//     height: '350px',//     display: 'flex',//     justifyContent: 'center',//     alignItems: 'center'//   },//   onClick() {//     console.log('onClicked!!!')//   },//   attrs: {//     msg: '456 msg'//   }// },// children: '呵呵呵'tag: 'G1',option: {class: {'G1-class': true},style: {display: 'flex',flexDirection: 'column',justifyContent: 'center',alignItems: 'center'},props: {title: 'wwwfffttt',age: 18,info: {name: 'wft'}},attrs: {customData: {id: '0000',name: 'JAY'}},scopedSlots: {default: () => (<BasicRender tag={'h1'} children={'66611'} />),content: () => '我是content'}},children: {default: '666',content: '我是content插槽内容'}}},components: { BasicRender }
}
</script>
<style scoped>
.wft-main {width: 100%;height: 100%;display: flex;justify-content: center;align-items: center
}
</style>

这是加载组件G1,注意:我们加载的组件一定是引入、注册之后的,我这里全局注册了,

然后是G1组件:

<template><div class="wft-w-h-100"><slot></slot><h1>我是G1 全局组件</h1><h3>{{ title }}--{{ age }}--{{ info }}</h3><slot name="content"></slot></div>
</template>
<script>
export default {data() {return {}},props: {customData: {type: Object,default: () => ({})},title: {type: String,default: ''},age: {type: Number,default: 0},info: {type: Object,default: () => ({})}}
}
</script>
<style scoped>
.wft-w-h-100 {width: 100%;height: 100%;
}
</style>

下面是运行的效果图:

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

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

相关文章

国际网络专线怎么开通?

在全球化日益加速的今天&#xff0c;企业越来越需要稳定、高效的网络来支撑他们的跨国业务。国际网络专线&#xff0c;作为外贸企业、出海企业等拓展全球业务的关键基础设施&#xff0c;其重要性不言而喻。那么&#xff0c;企业如何才能开通国际网络专线呢&#xff1f;本文将详…

Amazon Q Developer 实战:从新代码生成到遗留代码优化(下)

简述 本文是使用 Amazon Q Developer 探索如何在 Visual Studio Code 集成编程环境&#xff08;IDE&#xff09;&#xff0c;从新代码生成到遗留代码优化的续集。在上一篇博客《Amazon Q Developer 实战&#xff1a;从新代码生成到遗留代码优化&#xff08;上&#xff09;》中…

docker常见问题-持续更新

docker 启动的问题解决 解决: 下载更新linux的win子系统, 重启就可以 WSL 2 installation is incomplete. 更加报错提示,猜测可能是我们使用的wsl2版本老了,需要我们自己手动更新一下,我们根据提示去微软官网下载最新版的wsl2安装后即可正常打开。更新包下载链接。 https://ws…

HBase:大数据时代的分布式存储利器

HBase&#xff1a;大数据时代的分布式存储利器 HBase&#xff1a;大数据时代的分布式存储利器1. HBase简介2. HBase特点3. HBase应用场景4. 总结 HBase&#xff1a;大数据时代的分布式存储利器 随着互联网和大数据技术的飞速发展&#xff0c;数据存储和计算需求呈现出爆炸式增…

Arduino - 串行绘图仪

Arduino - Serial Plotter Arduino - 串行绘图仪 In this tutorial, we will learn how to use the Serial Plotter on Arduino IDE, how to plot the multiple graphs. 在本教程中&#xff0c;我们将学习如何在Arduino IDE上使用串行绘图仪&#xff0c;如何绘制多个图形。 A…

webstorm无法识别@路径的问题,左键无法跳转

在项目根目录下创建 webstorm.config.js use strict; const webpackConfig require(vue/cli-service/webpack.config.js); module.exports webpackConfig;webstorm设置里找到以下位置&#xff0c;引入新建的 webstorm.config.js即可&#xff0c;不生效把webstorm重启一下

android Studio 无线开发调试: PC机远程安卓电脑 免费

背景 公司的安卓机比较大&#xff0c;还有连接着串口设备不好挪动。 但是遇到问题调试很麻烦。想找到一套远程调试方法。 实现 要求&#xff1a; adb android Studio 2023.3.1 安卓机IP:1928.168.1.228 直接用adb远程连接&#xff1a;adb connect 1928.168.1.228 默认端口…

HarmonyOS Next开发学习手册——ExtensionAbility

概述 EmbeddedUIExtensionAbility 是EMBEDDED_UI类型的ExtensionAbility组件&#xff0c;提供了跨进程界面嵌入的能力。 EmbeddedUIExtensionAbility需要和 EmbeddedComponent 一起配合使用&#xff0c;开发者可以在UIAbility的页面中通过EmbeddedComponent嵌入本应用的Embed…

读AI新生:破解人机共存密码笔记11智能爆炸

1. 大猩猩问题 1.1. 大约1000万年前&#xff0c;现代大猩猩的祖先创造了进化出现代人类的遗传谱系 1.1.1. 它们的物种基本上没有未来&#xff0c;除了我们屈尊所允许它们拥有的未来 1.1.2. 我们不希望在超级智能机器面前处于类似的地位 1.2. 大猩猩问题就是人类是否能在一个…

电脑提示msvcr120.dll丢失怎样修复

文件功能与重要性&#xff1a;msvcr120.dll 文件的功能和重要性体现在多个方面&#xff0c;以下是对其核心功能的详细分析&#xff1a; 运行时支持 msvcr120.dll 提供了运行时环境&#xff0c;使得使用 Microsoft Visual C 2013 编译的程序能够调用必要的运行时函数。这些函数…

Mysql----表的约束

提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、表的约束 表的约束&#xff1a;表中一定要有约束&#xff0c;通过约束让插入表中的数据是符合预期的。它的本质是通过技术手段&#xff0c;让程序员插入正确的数据&#xff0c;约束的最终目标是保证…

Java | Leetcode Java题解之第189题轮转数组

题目&#xff1a; 题解&#xff1a; class Solution {public void rotate(int[] nums, int k) {k % nums.length;reverse(nums, 0, nums.length - 1);reverse(nums, 0, k - 1);reverse(nums, k, nums.length - 1);}public void reverse(int[] nums, int start, int end) {whil…

【机器学习】图神经网络(NRI)模型原理和运动轨迹预测代码实现

1.引言 1.1.NRI研究的意义 在许多领域,如物理学、生物学和体育,我们遇到的系统都是由相互作用的组分构成的,这些组分在个体和整体层面上都产生复杂的动态。建模这些动态是一个重大的挑战,因为往往我们只能获取到个体的轨迹数据,而不知道其背后的相互作用机制或具体的动态…

Shardingsphere-Proxy 5.5.0数据迁移

Shardingsphere-Proxy 5.5.0数据迁移 Shardingsphere系列目录&#xff1a;背景配置集群部署搭建Zookeeper修改shardingsphere-proxy配置重启shardingsphere-proxy 执行数据迁移连接代理数据库实例&#xff08;Navicate&#xff09;应用代理数据库注册目标分片数据库存储单元创建…

如何将图片旋转任意角度?这四种方法轻松将图片旋转至任意角度!

如何将图片旋转任意角度&#xff1f;当我们涉及到图片时&#xff0c;常常会面临角度不佳的挑战&#xff0c;这一问题可能会给我们带来一系列不便&#xff0c;让我们深入探讨这些挑战&#xff0c;并探寻解决之道&#xff0c;首先&#xff0c;错误的角度可能导致视觉失真&#xf…

计算机Java项目|基于SpringBoot的音乐网站

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、Python项目、前端项目、人工智能与大数据、简…

【SQL Server数据库】带函数查询和综合查询(1)

目录 1&#xff0e;统计年龄大于30岁的学生的人数。 2&#xff0e;统计数据结构有多少人80分或以上。 3.查询“0203”课程的最高分的学生的学号。 4&#xff0e;统计各系开设班级的数目(系名称、班级数目)&#xff0c;并创建结果表。 5&#xff0e;选修了以“01”开头的课…

C语言入门课程学习笔记9:指针

C语言入门课程学习笔记9 第41课 - 指针&#xff1a;一种特殊的变量实验-指针的使用小结 第42课 - 深入理解指针与地址实验-指针的类型实验实验小结 第43课 - 指针与数组&#xff08;上&#xff09;实验小结 第44课 - 指针与数组&#xff08;下&#xff09;实验实验小结 第45课 …

AI入门:AI发展势头这么猛,你在哪个阶段,落后了吗

生活的各方面都在发生着各种变化&#xff0c;笔者的教育生涯伴随着考试分数和排名&#xff0c;但现在的小学已经不公开分数和排名了&#xff0c;高考都屏蔽分数防止炒作了。 个人认为这是一个好的现象&#xff0c;教育就应该只有一个单纯的目的&#xff0c;那就是培养学生如何…

2024上海MWC 参展预告 | 未来先行,解锁数字化新纪元!

一、展会介绍——2024世界移动通信大会 2024年世界移动通信大会上海(MWC上海)将于6月26日至28日在上海新国际博览中心举行。 本届大会以“未来先行(Future First)”为主题聚焦“超越5G”、“数智制“人工智能经济’造”三大热点话题。届时将在包括超级品牌馆(Super Hall)在内…