vue 中的 render 函数作用详解


Posted in Javascript onFebruary 28, 2020

render 函数作用

vue渲染函数文档第一遍看的晕晕乎乎的,再看看写写终于清晰了。建议配合文档阅读,本文也是根据文档加上自己的理解。

注:本文代码都是在单文件组件中编写。代码地址

render 函数作用

render 函数 跟 template 一样都是创建 html 模板的,但是有些场景中用 template 实现起来代码冗长繁琐而且有大量重复,这时候就可以用 render 函数。

官网例子:子组件想要根据父组件传递的 level 值(1-6)来决定渲染标签 h 几。具体代码可以看文档。

render 函数讲解

render 函数即渲染函数,它是个函数,它的参数也是个函数——即 createElement,我们重点来说 createElement 参数。

render 函数的返回值(VNode)

VNode(即:虚拟节点),也就是我们要渲染的节点。

render 函数的参数(createElement)

createElement 是 render 函数 的参数,它本身也是个函数,并且有三个参数。

createElement 函数的返回值(VNode)

createElement 函数的返回值是 VNode(即:虚拟节点)。

createElement 函数的参数(三个)

一个 HTML 标签字符串,组件选项对象,或者解析上述任何一种的一个 async 异步函数。类型:{String | Object | Function}。必需。

一个包含模板相关属性的数据对象你可以在 template 中使用这些特性。类型:{Object}。可选。
子虚拟节点 (VNodes),由 createElement() 构建而成,也可以使用字符串来生成“文本虚拟节点”。类型:{String | Array}。可选。

结合代码

/**
 * render: 渲染函数
 * 参数: createElement
 * 参数类型: Function
 */
 render: function (createElement) {
  let _this = this['$options'].parent // 我这个是在 .vue 文件的 components 中写的,这样写才能访问this
  let _header = _this.$slots.header  // $slots: vue中所有分发插槽,不具名的都在default里
 
  /**
  * createElement 本身也是一个函数,它有三个参数
  * 返回值: VNode,即虚拟节点
  * 1. 一个 HTML 标签字符串,组件选项对象,或者解析上述任何一种的一个 async 异步函数。必需参数。{String | Object | Function} - 就是你要渲染的最外层标签
  * 2. 一个包含模板相关属性的数据对象你可以在 template 中使用这些特性。可选参数。{Object} - 1中的标签的属性
  * 3. 子虚拟节点 (VNodes),由 `createElement()` 构建而成,也可以使用字符串来生成“文本虚拟节点”。可选参数。{String | Array} - 1的子节点,可以用 createElement() 创建,文本节点直接写就可以
  */
  return createElement(    
   // 1. 要渲染的标签名称:第一个参数【必需】   
   'div',  
   // 2. 1中渲染的标签的属性,详情查看文档:第二个参数【可选】
   {
    style: {
     color: '#333',
     border: '1px solid #ccc'
    }
   },
   // 3. 1中渲染的标签的子元素数组:第三个参数【可选】
   [
    'text',  // 文本节点直接写就可以
    _this.$slots.default, // 所有不具名插槽,是个数组
    createElement('div', _header)  // createElement()创建的VNodes
   ]
  )
 }

可以看下控制台中打印出来的 $slots

vue 中的 render 函数作用详解

下面在通过具体代码看下render函数怎么用

例:           

render:(h) => {
              return h('div',{








 //给div绑定value属性
                props: {
                  value:''
                },









 //给div绑定样式









 style:{











width:'30px'









 }, 









 //给div绑定点击事件

                on: {
                  click: () => {
                    console.log('点击事件')
                  }
                },

              })
            }

深入 data 对象

有一件事要注意:正如在模板语法中,v-bind:class 和 v-bind:style ,会被特别对待一样,在 VNode 数据对象中,下列属性名是级别最高的字段。该对象也允许你绑定普通的 HTML 特性,就像 DOM 属性一样,比如 innerHTML (这会取代 v-html 指令)。

{
 // 和`v-bind:class`一样的 API
 'class': {
 foo: true,
 bar: false
 },
 // 和`v-bind:style`一样的 API
 style: {
 color: 'red',
 fontSize: '14px'
 },
 // 正常的 HTML 特性
 attrs: {
 id: 'foo'
 },
 // 组件 props
 props: {
 myProp: 'bar'
 },
 // DOM 属性
 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
  }
 }
 ],
 // Scoped slots in the form of
 // { name: props => VNode | Array<VNode> }
 scopedSlots: {
 default: props => createElement('span', props.text)
 },
 // 如果组件是其他组件的子组件,需为插槽指定名称
 slot: 'name-of-slot',
 // 其他特殊顶层属性
 key: 'myKey',
 ref: 'myRef'
}

总结

到此这篇关于vue 的 render 函数作用详解的文章就介绍到这了,更多相关vue render 函数作用内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
jQuery 追加元素的方法如append、prepend、before
Jan 16 Javascript
基于jQuery和CSS3制作数字时钟附源码下载(jquery篇)
Nov 24 Javascript
基于BootStrap Metronic开发框架经验小结【三】下拉列表Select2插件的使用
May 12 Javascript
深入理解JS DOM事件机制
Aug 06 Javascript
Vue.js系列之vue-router(上)(3)
Jan 03 Javascript
浅谈JS获取元素的N种方法及其动静态讨论
Aug 25 Javascript
实例学习JavaScript读取和写入cookie
Jan 29 Javascript
基于express中路由规则及获取请求参数的方法
Mar 12 Javascript
p5.js 毕达哥拉斯树的实现代码
Mar 23 Javascript
浅谈PDF.js使用心得
Jun 07 Javascript
ES6知识点整理之模块化的应用详解
Apr 15 Javascript
详解CocosCreator消息分发机制
Apr 16 Javascript
微信小程序动态添加和删除组件的现实
Feb 28 #Javascript
浅析Vue 中的 render 函数
Feb 28 #Javascript
微信小程序实现录制、试听、上传音频功能(带波形图)
Feb 27 #Javascript
基于Element的组件改造的树形选择器(树形下拉框)
Feb 27 #Javascript
js与jquery获取input输入框中的值实例讲解
Feb 27 #jQuery
javascript将扁平的数据转为树形结构的高效率算法
Feb 27 #Javascript
js实现无限层级树形数据结构(创新算法)
Feb 27 #Javascript
You might like
YB217、YB235、YB400浅听
2021/03/02 无线电
用PHP查询域名状态whois的类
2006/11/25 PHP
wordpress安装过程中遇到中文乱码的处理方法
2015/04/21 PHP
十大使用PHP框架的理由
2015/09/26 PHP
php实现微信公众平台账号自定义菜单类
2015/10/11 PHP
PHP实现的超长文本分页显示功能示例
2018/06/04 PHP
jQuery UI-Draggable 参数集合
2010/01/10 Javascript
js使下拉列表框可编辑不止是选择
2013/12/12 Javascript
JS基于面向对象实现的放烟花效果
2015/05/07 Javascript
从重置input file标签中看jQuery的 .val() 和 .attr(“value”) 区别
2016/06/12 Javascript
省市选择的简单实现(基于zepto.js)
2016/06/21 Javascript
js实现的光标位置工具函数示例
2016/10/03 Javascript
快速使用node.js进行web开发详解
2017/04/26 Javascript
10个最优秀的Node.js MVC框架
2017/08/24 Javascript
JS脚本加载后执行相应回调函数的操作方法
2018/02/28 Javascript
详解mpvue小程序中怎么引入iconfont字体图标
2018/10/01 Javascript
[01:16:37]【全国守擂赛】第三周决赛 Dark Knight vs. 一个弱队
2020/05/04 DOTA
python操作mongodb根据_id查询数据的实现方法
2015/05/20 Python
python数据结构之图的实现方法
2015/07/08 Python
Python中字符串的常见操作技巧总结
2016/07/28 Python
windows 10下安装搭建django1.10.3和Apache2.4的方法
2017/04/05 Python
tensorflow实现加载mnist数据集
2018/09/08 Python
Python 迭代,for...in遍历,迭代原理与应用示例
2019/10/12 Python
np.random.seed() 的使用详解
2020/01/14 Python
tensorflow求导和梯度计算实例
2020/01/23 Python
一款纯css3实现简单的checkbox复选框和radio单选框
2014/11/05 HTML / CSS
html5中valid、invalid、required的定义
2014/02/21 HTML / CSS
ABOUT YOU匈牙利:500个最受欢迎的时尚品牌
2019/07/19 全球购物
罗马尼亚购物网站:Vivantis.ro
2019/07/20 全球购物
简述进程的启动、终止的方式以及如何进行进程的查看
2013/07/12 面试题
个人对照检查剖析材料
2014/10/13 职场文书
毕业设计指导教师评语
2014/12/30 职场文书
行政文员岗位职责
2015/02/04 职场文书
党性修养心得体会2016
2016/01/21 职场文书
jQuery实现影院选座订座效果
2021/04/13 jQuery
python中urllib包的网络请求教程
2022/04/19 Python