当前位置: 首页 > news >正文

vue-render函数的三个参数

 第一个参数(必须) - {String | Object | Function}

Vue.component('elem', {render: function(createElement) {return createElement('div');//一个HTML标签字符/*return createElement({template: '<div></div>'//组件选项对象});*//*var func = function() {return {template: '<div></div>'}};return createElement(func());//一个返回HTML标签字符或组件选项对象的函数*/}});

第二个参数(可选) - {Object}

Vue.component('elem', {render: function(createElement) {var self = this;return createElement('div', {//一个包含模板相关属性的数据对象'class': {foo: true,bar: false},style: {color: 'red',fontSize: '14px'},attrs: {id: 'foo'},domProps: {innerHTML: 'baz'}});}});

第三个参数(可选) - {String | Array}

Vue.component('elem', {render: function(createElement) {var self = this;// return createElement('div', '文本');//使用字符串生成文本节点return createElement('div', {},[//由createElement函数构建而成的数组createElement('h1', '主标'),//createElement函数返回VNode对象createElement('h2', '副标')]);}});

与template写法对比

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>render</title><script src="https://cdn.bootcss.com/vue/2.3.4/vue.js"></script>
</head>
<body><div id="app"><ele></ele></div><script>/*Vue.component('ele', {template: '<div id="elem" :class="{show: show}" @click="handleClick">文本</div>',data: function() {return {show: true}},methods: {handleClick: function() {console.log('clicked!');}}});*/Vue.component('ele', {render: function(createElement) {return createElement('div', {'class': {show: this.show},attrs: {id: 'elem'},on: {click: this.handleClick}}, '文本');},data: function() {return {show: true}},methods: {handleClick: function() {console.log('clicked!');}}});new Vue({el: '#app'});</script>
</body>
</html>

this.$slots用法

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>render</title><script src="https://cdn.bootcss.com/vue/2.3.4/vue.js"></script>
</head>
<body><div id="app"><blog-post><h1 slot="header"><span>About Me</span></h1><p>Here's some page content</p><p slot="footer">Copyright 2016 Evan You</p><p>If I have some content down here</p></blog-post></div><script>Vue.component('blog-post', {render: function(createElement) {var header = this.$slots.header,//返回由VNode组成的数组body = this.$slots.default,footer = this.$slots.footer;return createElement('div', [createElement('header', header),createElement('main', body),createElement('footer', footer)])}});new Vue({el: '#app'});</script>
</body>
</html>

使用props传递数据

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>render</title><script src="https://cdn.bootcss.com/vue/2.3.4/vue.js"></script>
</head>
<body><div id="app"><ele :show="show"></ele><ele :show="!show"></ele></div><script>Vue.component('ele', {render: function(createElement) {if (this.show) {return createElement('p', 'true');} else {return createElement('p', 'false');}},props: {show: {type: Boolean,default: false}}});new Vue({el: '#app',data: {show: false}});</script>
</body>
</html>

v-model指令

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>render</title><script src="https://cdn.bootcss.com/vue/2.3.4/vue.js"></script>
</head>
<body><div id="app"><el-input :name="name" @input="val=>name=val"></el-input><div>你的名字是{{name}}</div></div><script>Vue.component('el-input', {render: function(createElement) {var self = this;return createElement('input', {domProps: {value: self.name},on: {input: function(event) {self.$emit('input', event.target.value);}}})},props: {name: String}});new Vue({el: '#app',data: {name: 'hdl'}});</script>
</body>
</html>

作用域插槽

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>render</title><script src="https://cdn.bootcss.com/vue/2.3.4/vue.js"></script>
</head>
<body><div id="app"><ele><template scope="props"><span>{{props.text}}</span></template></ele></div><script>Vue.component('ele', {render: function(createElement) {// 相当于<div><slot :text="msg"></slot></div>return createElement('div', [this.$scopedSlots.default({text: this.msg})]);},data: function() {return {msg: '来自子组件'}}});new Vue({el: '#app'});</script>
</body>
</html>

向子组件中传递作用域插槽

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>render</title><script src="https://cdn.bootcss.com/vue/2.3.4/vue.js"></script>
</head>
<body><div id="app"><ele></ele></div><script>Vue.component('ele', {render: function(createElement) {return createElement('div', [createElement('child', {scopedSlots: {default: function(props) {return [createElement('span', '来自父组件'),createElement('span', props.text)];}}})]);}});Vue.component('child', {render: function(createElement) {return createElement('b', this.$scopedSlots.default({text: '我是组件'}));}});new Vue({el: '#app'});</script>
</body>
</html>

函数化组件

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>render</title><script src="https://cdn.bootcss.com/vue/2.3.4/vue.js"></script>
</head>
<body><div id="app"><smart-item :data="data"></smart-item><button @click="change('img')">切换为图片为组件</button><button @click="change('video')">切换为视频为组件</button><button @click="change('text')">切换为文本组件</button></div><script>// 图片组件选项var ImgItem = {props: ['data'],render: function(createElement) {return createElement('div', [createElement('p', '图片组件'),createElement('img', {attrs: {src: this.data.url}})]);}}// 视频组件var VideoItem = {props: ['data'],render: function(createElement) {return createElement('div', [createElement('p', '视频组件'),createElement('video', {attrs: {src: this.data.url,controls: 'controls',autoplay: 'autoplay'}})]);}};/*纯文本组件*/var TextItem = {props: ['data'],render: function(createElement) {return createElement('div', [createElement('p', '纯文本组件'),createElement('p', this.data.text)]);}};Vue.component('smart-item', {functional: true,render: function(createElement, context) {function getComponent() {var data = context.props.data;if (data.type === 'img') return ImgItem;if (data.type === 'video') return VideoItem;return TextItem;}return createElement(getComponent(),{props: {data: context.props.data}},context.children)},props: {data: {type: Object,required: true}}});new Vue({el: '#app',data() {return {data: {}}},methods: {change: function(type) {if (type === 'img') {this.data = {type: 'img',url: 'https://raw.githubusercontent.com/iview/iview/master/assets/logo.png'}} else if (type === 'video') {this.data = {type: 'video',url: 'http://vjs.zencdn.net/v/oceans.mp4'}} else if (type === 'text') {this.data = {type: 'text',content: '这是一段纯文本'}}}},created: function() {this.change('img');}});</script>
</body>
</html>

渲染动态表单用法

<template><div><form><div v-for="(field, index) in fields" :key="index"><component :is="field.type" :name="field.name" :label="field.label" :options="field.options" v-model="form[field.name]" /></div></form></div>
</template><script>
import Vue from 'vue';export default {data() {return {form: {},fields: [{ type: 'text', name: 'username', label: '用户名' },{ type: 'password', name: 'password', label: '密码' },{ type: 'select', name: 'gender', label: '性别', options: [{ value: 'male', label: '男' }, { value: 'female', label: '女' }] },{ type: 'checkbox', name: 'hobbies', label: '爱好', options: [{ value: 'reading', label: '阅读' }, { value: 'music', label: '音乐' }, { value: 'sports', label: '运动' }] },{ type: 'radio', name: 'status', label: '状态', options: [{ value: 'active', label: '激活' }, { value: 'inactive', label: '未激活' }] },],};},render(h) {const self = this;const fields = self.fields.map((field) => {const props = {props: {name: field.name,label: field.label,options: field.options,value: self.form[field.name],},on: {input: (value) => {self.form[field.name] = value;},},};return h(field.type, props);});return h('div', fields);},
};
</script><style>
/* 样式省略 */
</style>

在示例代码中,我们定义了一个表单组件,其中的 `fields` 数组包含了表单中的各个字段,每个字段都有一个 `type` 属性表示字段的类型,例如文本框、密码框、下拉框等。在 `render` 函数中,我们使用 `map` 方法遍历 `fields` 数组,根据每个字段的类型动态生成对应的组件,并将组件的属性和事件绑定到表单数据中。最后,我们将所有生成的组件包裹在一个 `div` 元素中返回。

需要注意的是,由于在 `render` 函数中动态生成了组件,因此在模板中无法直接使用这些组件。如果需要在模板中使用这些组件,可以通过在 `render` 函数中将生成的组件保存到一个数组中,然后在模板中使用 `v-for` 渲染这个数组。

希望这个示例能帮助您理解如何使用 Vue 的 render 函数渲染动态表单。如有任何问题,请随时提问。

相关文章:

vue-render函数的三个参数

第一个参数(必须) - {String | Object | Function} Vue.component(elem, {render: function(createElement) {return createElement(div);//一个HTML标签字符/*return createElement({template: <div></div>//组件选项对象});*//*var func function() {return {t…...

数据结构与算法(Java版) | 排序算法的介绍与分类

各位朋友&#xff0c;现在我们即将要进入数据结构与算法&#xff08;Java版&#xff09;这一系列教程中的排序算法这一章节内容的学习中了&#xff0c;所以还请大家系好安全带&#xff0c;跟随我准备出发吧&#xff01; 相信诸位应该都知道排序算法有很多种吧&#xff01;就算没…...

Java 实现uniapp本机手机号一键登录

这里简单的贴一下后端的解析代码 其他配置项参照uniapp的官方文档配置就好了 这里的accessToken和openid是前端请求uCloud获取的 Data public class UniAppLoginVO {private Integer code;private String message;private ResultDataVO data;private Boolean success;private R…...

树莓派使用Nginx搭建web网站内存利用太低了?高效远程访问试试结合内网穿透进行

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《Linux深造日志》《C干货基地》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 一. Nginx安装步骤1.安装更新2.更新完成后安装Nginx 包3. 启动Nginx 二. 安装cpolar内网穿透工具1. 使用cpolar一…...

基于SSM的搬家预约系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…...

(论文阅读13/100)R-CNN minus R

文献阅读笔记 简介 题目 R-CNN minus R 作者 Karel Lenc Andrea Vedaldi 原文链接 https://arxiv.org/pdf/1506.06981.pdf 关键词 Null 研究问题 proposal generation在基于CNN的探测器中的作用&#xff0c;以确定它是否是一个必要的建模组件。 R-CNN留下的几个有趣…...

Jmeter和Postman哪个做接口测试会更好

软件测试行业做功能测试和接口测试的人相对比较多。在测试工作中&#xff0c;有高手&#xff0c;自然也会有小白&#xff0c;但有一点我们无法否认&#xff0c;就是每一个高手都是从小白开始的&#xff0c;所以今天我们就来谈谈一大部分人在做的接口测试&#xff0c;小白变高手…...

【算法|二分查找No.2】leetcode 69. x 的平方根

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…...

AI:56-基于深度学习的微表情识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…...

Jetpack Compose 中下拉框实现

下拉菜单主要 以下三种实现&#xff1a; ExperimentalMaterialApi Composable fun ExposedDropdownMenuBox(expanded: Boolean,onExpandedChange: (Boolean) -> Unit,modifier: Modifier Modifier,content: Composable ExposedDropdownMenuBoxScope.() -> Unit )实现代…...

输出最长公共字串

题目描述 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长公共子序列 示例 示例 1&#xff1a; 输入&#xff1a;text1 "abcde", text2 "ace" 输出&#xff1a;"ace" 示例 2&#xff1a; 输入&#xff1a;text1 &quo…...

学习经验分享【NO.19】YOLOv5可视化训练过程

将train.py中project的参数设置为如下&#xff1a; 点击AutoPanel即可&#xff1a; 得到如下的训练过程&#xff0c;可以观察所进行提升效果是否有用以及可以作为论文中的图&#xff0c;提高论文的档次。...

低代码可视化逻辑编排工具:JNPF

目录 Intro 一、是什么&#xff1f; 提供自动化的解决方案 二、为什么受欢迎&#xff1f; JNPF自身特点——安全、方便、高效、低耗 对于企业&#xff0c;更“安全” 成本“最低”&#xff0c;效率“最高” 三、JNPF开发平台功能展示 技术介绍 参考地址 近几年&#xff0c;随着…...

Redis创始人开源最小聊天服务器,仅200行代码,几天功夫已获2.8K Star!

中午时候&#xff0c;在技术交流群里聊起关于Redis创始人的一些趣事&#xff0c;比如离开Redis之后&#xff0c;去写科幻小说之类的。 因为好奇科幻小说&#xff0c;TJ君就去搜索了一下。结果一搜&#xff0c;发现Redis作者最近居然又搞了个新活儿&#xff01; 世界上最小的聊…...

RK-3399pro 萤火虫firefly 官方unbuntu 固件系统安装搜狗中文输入法

RK-3399pro 萤火虫firefly 官方unbuntu 固件系统安装搜狗输入法&#xff08;适用于所有基于Ubuntu的UI桌面系统&#xff09; 一、添加中文语言支持输入法平台fcitx 1.安装fcitx sudo apt-get install fcitx 2.然后设置fcitx为开机自启动 sudo cp /usr/share/applications/fc…...

2014年亚太杯APMCM数学建模大赛A题无人机创造安全环境求解全过程文档及程序

2014年亚太杯APMCM数学建模大赛 A题 无人机创造安全环境 原题再现 20 国集团&#xff0c;又称 G20&#xff0c;是一个国际经济合作论坛。2016 年第 11 届 20 国集团峰会将在中国召开&#xff0c;这是继 APEC 后中国将举办的另一个大型峰会。此类大型峰会&#xff0c;举办城市…...

Java字符串常用函数 详解5000字 (刷题向 / 应用向)

1.直接定义字符串 直接定义字符串是指使用双引号表示字符串中的内容&#xff0c;例如"Hello Java"、"Java 编程"等。具体方法是用字符串常量直接初始化一个 String 对象&#xff0c;示例如下&#xff1a; 1. String str"Hello Java"; 或者 …...

在RabbitMQ中 WorkQueue 工作队列 和发布(publish)/订阅(Subscribe) 有什么区别?

在RabbitMQ中&#xff0c;"Work Queue"&#xff08;工作队列&#xff09;和"Publish/Subscribe"&#xff08;发布/订阅&#xff09;是两种不同的消息传递模型&#xff0c;它们有不同的用途和工作方式。 Work Queue (工作队列)&#xff1a; 用途&#xff1a…...

关闭Dell xps 系列笔记本触控屏

【电脑】->【管理】->【设备管理器】 右键 禁用选择即可...

物理内存的组织形式

由于物理地址是连续的&#xff0c;页也是连续的&#xff0c;每个页大小也是一样的。因而对于任何一个地址&#xff0c;只要直接除一下每页的大小&#xff0c;很容易直接算出在哪一页。每个页有一个结构 struct page 表示&#xff0c;这个结构也是放在一个数组里面&#xff0c;这…...

CCF和中国科协对NeurIPS更正投稿政策做出回应

点击下方卡片&#xff0c;关注“CVer”公众号AI/CV重磅干货&#xff0c;第一时间送达点击进入—>【顶会/顶刊】投稿交流群添加微信号&#xff1a;CVer2233&#xff0c;小助手拉你进群&#xff01;扫描下方二维码&#xff0c;加入CVer学术星球&#xff01;可以获得最新顶会/顶…...

Mermaid Live Editor:代码驱动图表的革新者,重新定义技术可视化流程

Mermaid Live Editor&#xff1a;代码驱动图表的革新者&#xff0c;重新定义技术可视化流程 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trendin…...

霞鹜文楷GB:开源楷体字体的国标规范解决方案

霞鹜文楷GB&#xff1a;开源楷体字体的国标规范解决方案 【免费下载链接】LxgwWenkaiGB An open-source Simplified Chinese font derived from Klee One. 项目地址: https://gitcode.com/gh_mirrors/lx/LxgwWenkaiGB 在数字时代的中文排版领域&#xff0c;如何在保持视…...

SeargeSDXL:让SDXL图像生成像搭积木一样简单的ComfyUI终极方案

SeargeSDXL&#xff1a;让SDXL图像生成像搭积木一样简单的ComfyUI终极方案 【免费下载链接】SeargeSDXL Custom nodes and workflows for SDXL in ComfyUI 项目地址: https://gitcode.com/gh_mirrors/se/SeargeSDXL 还在为ComfyUI中复杂的SDXL工作流程而头疼吗&#xff…...

OneMore插件终极指南:160+功能免费解锁OneNote完整生产力

OneMore插件终极指南&#xff1a;160功能免费解锁OneNote完整生产力 【免费下载链接】OneMore A OneNote add-in with simple, yet powerful and useful features 项目地址: https://gitcode.com/gh_mirrors/on/OneMore OneMore是一款功能强大的OneNote免费开源插件&…...

FPGA密码锁设计避坑指南:状态机划分、时序约束与安全逻辑的那些事儿

FPGA密码锁设计避坑指南&#xff1a;状态机划分、时序约束与安全逻辑的那些事儿 在FPGA开发领域&#xff0c;密码锁设计看似简单&#xff0c;实则暗藏玄机。许多工程师在完成基础功能后&#xff0c;往往会在状态机划分、时序约束和安全逻辑等环节踩坑。本文将结合实战经验&…...

效率倍增:基于快马平台集成最新openclaw构建自动化采集工具

最近在做一个数据采集项目时&#xff0c;发现手动写爬虫实在太费时间了。每次都要重复处理请求头、代理设置、数据清洗这些基础工作&#xff0c;效率特别低。后来发现了openclaw这个工具包的新版本&#xff0c;正好结合InsCode(快马)平台快速搭建了一个自动化采集工具&#xff…...

在Ubuntu 20.04上搞定Synopsys SpyGlass 2016:一份针对高内核版本的详细避坑指南

在Ubuntu 20.04上搞定Synopsys SpyGlass 2016&#xff1a;一份针对高内核版本的详细避坑指南 当IC设计工程师遇到Ubuntu 20.04与SpyGlass 2016的版本冲突时&#xff0c;那种熟悉的挫败感往往伴随着终端里红色的报错信息一起涌现。这不是简单的"安装-运行"问题&#x…...

FreeRTOS进阶:任务优先级与调度策略深度解析

1. FreeRTOS任务优先级基础 在嵌入式实时操作系统中&#xff0c;任务优先级决定了任务执行的先后顺序。FreeRTOS采用数值越大优先级越高的设计&#xff0c;优先级范围通常为0到(configMAX_PRIORITIES-1)。我刚开始接触FreeRTOS时&#xff0c;经常混淆这个概念&#xff0c;直到在…...

MATLAB实战:AM调制解调中的噪声影响与优化策略

1. AM调制解调基础与噪声挑战 AM&#xff08;幅度调制&#xff09;是模拟通信中最基础的调制方式之一&#xff0c;它的核心思想是通过改变载波信号的幅度来携带信息。我刚开始接触通信仿真时&#xff0c;第一个动手实现的就是AM调制&#xff0c;因为它原理直观&#xff0c;代码…...