Vue2.x中的Render函数详解


Posted in Javascript onMay 30, 2017

Render函数是Vue2.x版本新增的一个函数;使用虚拟dom来渲染节点提升性能,因为它是基于JavaScript计算。通过使用createElement(h)来创建dom节点。createElement是render的核心方法。其Vue编译的时候会把template里面的节点解析成虚拟dom;

什么是虚拟dom?

虚拟dom不同于真正的dom,它是一个JavaScript对象。当状态发生变化的时候虚拟dom会进行一个diff判断/运算;然后判断哪些dom是需要被替换的而不是全部重绘,所以性能会比dom操作高很多。

下面看一张Aresn大神总结的一张图:

Vue2.x中的Render函数详解

Vue2.x版本中VNode属性:

tag:当前节点标签名,

data:当前节点数据对象,

children:子节点数组,

text:当前节点文本,

elm:当前虚拟节点对应的真实dom节点,

ns:节点的namespace( 名称空间),

content:编译作用域,

functionalContext:函数化组件的作用域,即全局上下文,

key:节点标识,有利于patch优化,

componentOptions:创建组件实例时的options,

child:当前节点对应的组件实例,

parent:组件的占位节点,

raw:原始html,

isStatic:是否是静态节点,

isRootInsert:是否作为跟节点插入,若被<transition>包裹的节点,该属性值为false,

isComment:是否为注释节点,

isCloned:是否为克隆节点,

isOnce:是否只改变(渲染)一次,或是否有v-once指令;

其中这里面又有几种VNode类型:

Aresn大神总结的很好:

Vue2.x中的Render函数详解

TextVNode:文本节点,

ElementVNode:普通元素节点,

ComponentVNode:组件节点,

EmptyVNode:空节点,或者说是没有内容的注释节点,

CloneVNode:克隆节点,可以是以上任意类型节点

说了那么多;到底什么时候用虚拟dom才比较好呢?其实 我们使用的单文件组件就已经够好了。但是当某些代码冗余的时候如果写单文件组件的话会有好多重复的内容;

接下来介绍其核心函数;

createElement:

createElement接收3个参数:

第一个参数可以是HTML标签名,组件或者函数都可以;此参数是必须的;

第二个为数据对象(可选);

第三个为子节点(可选)。

附上一个非常简单的createElement函数demo;

var app = new Vue({
   el:"#app",
   render:createElement => {
     eturn createElement(
       'h2',
       [
         createElement(
           'a',
           {
             domProps:{
               href:"#biaoti"
             }
           },
           "标题"
         )
        ]      
       );
 
     }
 });

这只是一个createElement函数的使用,而Vue2中VNodeData

class: v-bind/:class

style:v-bind/:style

attrs:dom属性,如id

props:props,

on:自定义事件等,

 nativeOn:原生事件

像这些也可以在render函数中实现,若VNode是组件或含有组件的slot,那么VNode必须是唯一。

像平常开发过程中单文件组件中template写法更为简单,可读性也高。如果是webpack进行打包的话template也会预编译成render函数。

这里demo栗子暂时还没写那么多。这里只是一个简单的介绍。若有更好的欢迎大家一起学习讨论。

Javascript 相关文章推荐
javascript 读取XML数据,在页面中展现、编辑、保存的实现
Oct 27 Javascript
js+css 实现遮罩居中弹出层(随浏览器窗口滚动条滚动)
Dec 11 Javascript
javascript回车完美实现tab切换功能
Mar 13 Javascript
AngularJS语法详解(续)
Jan 23 Javascript
javaScript事件机制兼容【详细整理】
Jul 23 Javascript
AngularJS使用ng-repeat和ng-if实现数据的删选显示效果示例【适用于表单数据的显示】
Dec 13 Javascript
jquery处理checkbox(复选框)是否被选中实例代码
Jun 12 jQuery
angularjs2中父子组件的数据传递的实例代码
Jul 05 Javascript
微信小程序template模板实例详解
Oct 27 Javascript
JavaScript数组排序reverse()和sort()方法详解
Dec 24 Javascript
记录一次完整的react hooks实践
Mar 11 Javascript
微信小程序官方动态自定义底部tabBar的例子
Sep 04 Javascript
jQuery实现动态删除LI的方法
May 30 #jQuery
Vue.js实现在下拉列表区域外点击即可关闭下拉列表的功能(自定义下拉列表)
May 30 #Javascript
JS给按钮添加跳转功能类似a标签
May 30 #Javascript
jQuery异步提交表单实例
May 30 #jQuery
JS实现多级菜单中当前菜单不随页面跳转样式而发生变化
May 30 #Javascript
Angularjs中使用轮播图指令swiper
May 30 #Javascript
AngularJS路由Ui-router模块用法示例
May 29 #Javascript
You might like
Yii2使用swiftmailer发送邮件的方法
2016/05/03 PHP
PHP实现的简单AES加密解密算法实例
2017/05/29 PHP
php爬取天猫和淘宝商品数据
2018/02/23 PHP
浅析PHP echo 和 print 语句
2020/06/30 PHP
javascript最常用与实用的创建类的代码
2010/08/12 Javascript
超赞的jQuery图片滑块动画特效代码汇总
2016/01/25 Javascript
jquery中键盘事件小结
2016/02/24 Javascript
js判断图片加载完成后获取图片实际宽高的方法
2016/02/25 Javascript
不同js异步函数同步的实现方法
2016/05/28 Javascript
Vue通过input筛选数据
2020/10/26 Javascript
微信小程序之网络请求简单封装实例详解
2017/06/28 Javascript
JavaScript基础心法 深浅拷贝(浅拷贝和深拷贝)
2018/03/05 Javascript
javascript实现简易数码时钟
2020/03/30 Javascript
OpenLayers3实现地图鹰眼以及地图比例尺的添加
2020/09/25 Javascript
微信小程序实现倒计时功能
2020/11/19 Javascript
一起来了解一下JavaScript的预编译(小结)
2021/03/01 Javascript
[08:53]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS 选手采访
2021/03/11 DOTA
python 简单的绘图工具turtle使用详解
2017/06/21 Python
Python SQLite3数据库日期与时间常见函数用法分析
2017/08/14 Python
200 行python 代码实现 2048 游戏
2018/01/12 Python
简单谈谈python基本数据类型
2018/09/26 Python
使用python实现时间序列白噪声检验方式
2020/06/03 Python
pyCharm 实现关闭代码检查
2020/06/09 Python
Python+Kepler.gl实现时间轮播地图过程解析
2020/07/20 Python
如何用Django处理gzip数据流
2021/01/29 Python
提供世界各地便宜的机票:Sky-tours
2016/07/21 全球购物
鞋子女王塔玛拉·梅隆同名奢侈品牌:Tamara Mellon
2017/11/22 全球购物
俄罗斯购买自行车网站:Vamvelosiped
2021/01/29 全球购物
颇特女士香港官网:NET-A-PORTER香港
2021/03/08 全球购物
总裁秘书岗位职责
2013/12/04 职场文书
高三英语教学反思
2014/01/13 职场文书
《荷花》教学反思
2014/04/16 职场文书
党的群众路线对照检查材料
2014/09/22 职场文书
自我检讨书怎么写
2015/05/07 职场文书
2016年重阳节慰问信
2015/12/01 职场文书
使用redis实现延迟通知功能(Redis过期键通知)
2021/09/04 Redis