网站首页 > 开源技术 正文
最近在项目开发过程中,经常用到 UI 组件库中的 render 函数来渲染内容。今天来总结一下 render 的用法。
Render 函数
在 Vue 2 中,render 函数是一个用于创建 Vue 组件虚拟 DOM 的函数。它允许你以编程方式定义组件的结构,而不是使用模板语法。
render 函数接受一个 createElement 函数作为参数,并返回一个虚拟 DOM 节点。createElement 函数用于创建 Vue 的虚拟节点(VNode)。
基本结构
render(createElement) {
return createElement(
'div', // 标签名
{ class: 'my-class' }, // 属性对象
[
createElement('h1', 'Hello World'), // 子节点
createElement('p', 'This is a paragraph.')
]
);
}
用途
- 复杂逻辑: 当模板语法无法满足复杂逻辑需求时,可以使用 render 函数编写更复杂的组件结构。
- 动态内容: render 函数可以用来创建动态的虚拟 DOM,允许更细粒度地控制组件的渲染。
- 性能优化: 在某些性能要求高的场景中,render 函数可能提供比模板更高效的渲染方式。
render 函数最常见的地方就是表格的 columns。
Render 写法
通过给 columns 数据的项,设置一个函数 render,可以自定义渲染当前列,包括渲染自定义组件,它基于 Vue 的 Render 函数。
render 函数传入两个参数,第一个是 h,第二个是对象,包含 row、column 和 index,分别指当前单元格数据,当前列数据,当前是第几行。
基本语法
<template>
<Table :columns="columns" :data="data"></Table>
</template>
<script>
export default {
data() {
return {
data: [
{ name: 'John', age: 30 },
{ name: 'Jane', age: 24 }
],
columns: [
{
title: 'Name', // 列的标题为 'Name'
key: 'name', // 数据中对应的键为 'name'
render: (h, params) => {
// render 函数,用于自定义渲染列的内容
return h('div', [
// 创建一个 <div> 元素
h('Icon', {
// 在 <div> 中创建一个 <Icon> 组件
props: {
type: 'person' // 设置 <Icon> 组件的属性 'type' 为 'person'
}
}),
h('strong', params.row.name)
// 在 <div> 中创建一个 <strong> 元素,并显示当前行的数据中的 'name' 字段
]);
}
}
]
};
}
};
</script>
render 函数有两个参数, 最主要的是第一个参数 h 函数, 第二个参数是组件库自己封装的对外暴露的数据。
h 函数
在 Vue.js 中,h 函数通常是 createElement 的别名,用于创建虚拟 DOM 元素。在使用 Vue 的 render 函数时,h 函数是非常重要的,它可以创建任何你想要的 DOM 结构或组件。让我们详细解析 h 函数的用法和参数。
h 函数的三种用法
h 函数是 Vue 的 createElement 函数的缩写形式。它有三种主要的用法:
- 创建普通元素
创建了一个 div 元素,具有 class="my-class",并包含文本 “Hello World”。
h('div', { class: 'my-class' }, 'Hello World')
2.创建组件
创建了一个 MyComponent 组件,并传递了 someProp 属性。
h(MyComponent, { props: { someProp: 'value' } })
3.嵌套子节点
创建了一个 ul 元素,包含两个 li 子节点。
h('ul', [
h('li', 'Item 1'),
h('li', 'Item 2')
])
h 函数的参数
h 函数通常接收三个参数:
- 标签名或组件(tag): 可以是一个字符串(表示 HTML 标签) 或者是一个组件对象。
- 数据对象(data):一个包含属性、事件、样式等信息的对象(可选)。
- 子节点(children):一个子节点、一个子节点数组或者是字符串(可选)。
只有两个参数的情况
当使用 Vue.js 的 h 函数(createElement)时,如果只提供两个参数,这两个参数通常是标签名或组件以及子节点。数据对象(第二个参数)是可选的,所以如果你只提供两个参数,Vue 会将第二个参数解释为子节点。
h('div', 'Hello World')
到这里基本可以熟练的掌握用 h 函数来创建基本的虚拟 DOM 元素的了。
深入了解数据对象参数
下面主要来看一下数据对象(data) : 包含属性、事件、样式等信息的对象 的参数。下面是完整的数据对象声明参考。
常用项需要注意的几个点是:
- class 和 style 直接定义, HTML属性定义在 attrs 对象内
- 组件的 prop 定义在 props 中, DOM 属性定义在 domProps 中
- 组件事件在 on 中定义, 原生事件 在 nativeOn 中定义
- 作用域插槽在 scopedSlots 中定义
{
// 与 `v-bind:class` 的 API 相同,
// 接受一个字符串、对象或字符串和对象组成的数组
'class': {
foo: true,
bar: false
},
// 与 `v-bind:style` 的 API 相同,
// 接受一个字符串、对象,或对象组成的数组
style: {
color: 'red',
fontSize: '14px'
},
// 普通的 HTML attribute
attrs: {
id: 'foo'
},
// 组件 prop
props: {
myProp: 'bar'
},
// DOM property
domProps: {
innerHTML: 'baz'
},
// 事件监听器在 `on` 内,
// 但不再支持如 `v-on:keyup.enter` 这样的修饰器。
// 需要在处理函数中手动检查 keyCode。
on: {
click: this.clickHandler
},
// 仅用于组件,用于监听原生事件,而不是组件内部使用
// `vm.$emit` 触发的事件。
nativeOn: {
click: this.nativeClickHandler
},
// 自定义指令。注意,你无法对 `binding` 中的 `oldValue`
// 赋值,因为 Vue 已经自动为你进行了同步。
directives: [
{
name: 'my-custom-directive',
value: '2',
expression: '1 + 1',
arg: 'foo',
modifiers: {
bar: true
}
}
],
// 作用域插槽的格式为
// { name: props => VNode | Array<VNode> }
scopedSlots: {
default: props => createElement('span', props.text)
},
// 如果组件是其它组件的子组件,需为插槽指定名称
slot: 'name-of-slot',
// 其它特殊顶层 property
key: 'myKey',
ref: 'myRef',
// 如果你在渲染函数中给多个元素都应用了相同的 ref 名,
// 那么 `$refs.myRef` 会变成一个数组。
refInFor: true
}
场景示例
渲染组件
render: (h, {column,row,index}) => {
return h('div', [
h(
'Button', {
props: {
type: 'primary'
},
on: {
click: () => {
this.handleClick(row.id)
}
}
},
'编辑'
)])
渲染作用域插槽
render: (h, params) => {
return h("i-switch", {
props: {
size: "large",
trueValue: 1,
falseValue: 0,
value: params.row.status,
disabled: !params.row.disbaled
},
scopedSlots: {
open: () => h("span", "是"),
close: () => h("span", "否")
},
on: {
"on-change": value => {
this.handleChange(value);
}
}
});
}
},
结语
在 Vue 2 中,render 函数是一个极具灵活性的工具,能够帮助我们创建复杂的组件结构和优化性能。本文详细探讨了 render 函数的基本概念、常见用法及其在实际开发中的应用场景。通过学习 render 函数,我们不仅可以应对复杂的业务需求,还能在构建动态内容和提升应用性能方面获得更多的选择和控制。
掌握 render 函数及其 h 函数的用法,将有助于你在 Vue 项目中实现更高效的组件开发。希望本文的总结对你有所帮助,也鼓励你在实际项目中灵活运用这些知识,探索 Vue 的更多高级功能。
猜你喜欢
- 2024-12-06 游戏编程 | Three.js 加载STL模型
- 2024-12-06 flask web服务器的开发就这样简单的入门
- 2024-12-06 前端实战:如何快速在你的vue/react应用中实现服务端渲染(ssr)
- 2024-12-06 初识 JavaScript 第一篇及解释器和编译器
- 2024-12-06 一、nextjs 服务端渲染及环境搭建
- 2024-12-06 Vue源码全面解析三十六 _render函数(生成vnode虚拟DOM结构)
- 2024-12-06 一篇文章,教你学会Vue-CLI 插件开发【Vue进阶篇】
- 2024-12-06 Three.js在工业设备模型演示与监控中的应用:三维可视化渲染效果
- 2024-12-06 threejs渲染高级感可视化涡轮模型
- 2024-12-06 如何让Threejs的canvas背景透明?
你 发表评论:
欢迎- 05-16东契奇:DFS训练时喷了我很多垃圾话 我不懂他为什么比赛不这么干
- 05-16这两球很伤!詹姆斯空篮拉杆不中 DFS接里夫斯传球空接也没放进
- 05-16湖人自媒体调查:89%球迷希望DFS回归79%希望詹姆斯回归
- 05-16Shams:湖人得到全能球员DFS 节省了1500万奢侈税&薪金空间更灵活
- 05-16G5湖人胜率更高!詹姆斯不满判罚,DFS谈5人打满下半场:这很艰难
- 05-16DFS:当东契奇进入状态 所有防守者在他面前都像个圆锥桶
- 05-16上一场9中6!DFS:不能让纳兹-里德这样的球员那么轻松地投三分
- 05-16WIDER FACE评测结果出炉:滴滴人脸检测DFS算法获世界第一
- 最近发表
-
- 东契奇:DFS训练时喷了我很多垃圾话 我不懂他为什么比赛不这么干
- 这两球很伤!詹姆斯空篮拉杆不中 DFS接里夫斯传球空接也没放进
- 湖人自媒体调查:89%球迷希望DFS回归79%希望詹姆斯回归
- Shams:湖人得到全能球员DFS 节省了1500万奢侈税&薪金空间更灵活
- G5湖人胜率更高!詹姆斯不满判罚,DFS谈5人打满下半场:这很艰难
- DFS:当东契奇进入状态 所有防守者在他面前都像个圆锥桶
- 上一场9中6!DFS:不能让纳兹-里德这样的球员那么轻松地投三分
- WIDER FACE评测结果出炉:滴滴人脸检测DFS算法获世界第一
- 湖人自媒体调查:89%球迷希望DFS回归 79%希望詹姆斯回归
- 一觉醒来湖人苦盼的纯3D终于到位 DFS能带给紫金军多少帮助
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)