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 相关文章推荐
才发现的超链接js导致网页中GIF动画停止的解决方法
Nov 02 Javascript
jquery last-child 列表最后一项的样式
Jan 22 Javascript
Javascript读取cookie函数代码
Oct 16 Javascript
JQuery select控件的相关操作实现代码
Sep 14 Javascript
JavaScript中的undefined学习总结
Nov 30 Javascript
js通过元素class名字获取元素集合的具体实现
Jan 06 Javascript
原生js实现的贪吃蛇网页版游戏完整实例
May 18 Javascript
用ES6的class模仿Vue写一个双向绑定的示例代码
Apr 20 Javascript
JS实现全屏预览F11功能的示例代码
Jul 23 Javascript
微信小程序实现页面分享onShareAppMessage
Aug 12 Javascript
微信小程序入门之指南针
Oct 22 Javascript
Vue多选列表组件深入详解
Mar 02 Vue.js
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
如何删除多级目录
2006/10/09 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
2016/02/15 PHP
php修改数组键名的方法示例
2017/04/15 PHP
jQuery实现鼠标可拖动调整表格列宽度
2014/05/26 Javascript
js判断滚动条是否已到页面最底部或顶部实例
2014/11/20 Javascript
js实现Form栏显示全格式时间时钟效果代码
2015/08/19 Javascript
jQuery实现平滑滚动的标签分栏切换效果
2015/08/28 Javascript
javascript轮播图算法
2016/10/21 Javascript
angularJS的radio实现单项二选一的使用方法
2018/02/28 Javascript
js实现导航跟随效果
2018/11/17 Javascript
Python中的startswith和endswith函数使用实例
2014/08/25 Python
Python正则表达式完全指南
2017/05/25 Python
python实现Excel文件转换为TXT文件
2019/04/28 Python
一篇文章彻底搞懂Python中可迭代(Iterable)、迭代器(Iterator)与生成器(Generator)的概念
2019/05/13 Python
详解Python字符串切片
2019/05/20 Python
python将邻接矩阵输出成图的实现
2019/11/21 Python
在python中创建指定大小的多维数组方式
2019/11/28 Python
python  ceiling divide 除法向上取整(或小数向上取整)的实例
2019/12/27 Python
Python解释器以及PyCharm的安装教程图文详解
2020/02/26 Python
python+Selenium自动化测试——输入,点击操作
2020/03/06 Python
PyCharm Anaconda配置PyQt5开发环境及创建项目的教程详解
2020/03/24 Python
Python+PyQt5实现灭霸响指功能
2020/05/25 Python
Python趣味入门教程之循环语句while
2020/08/26 Python
Python extract及contains方法代码实例
2020/09/11 Python
CSS3实现伪类hover离开时平滑过渡效果示例
2017/08/10 HTML / CSS
html5使用canvas绘制一张图片
2014/12/15 HTML / CSS
法国最大电子商务平台:Cdiscount
2018/03/13 全球购物
C语言基础笔试题
2013/04/27 面试题
关联、聚合(Aggregation)以及组合(Composition)的区别
2012/02/29 面试题
工商学院毕业生个人自我评价
2013/09/19 职场文书
电子信息工程专业自荐书
2014/06/24 职场文书
庆国庆活动总结
2014/08/28 职场文书
2014党员批评和自我批评思想汇报
2014/09/21 职场文书
2015年学校精神文明工作总结
2015/05/27 职场文书
MySQL非空约束(not null)案例讲解
2021/08/23 MySQL
Oracle使用别名的好处
2022/04/19 Oracle