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 url传值中文乱码之解决之道
Nov 20 Javascript
JS操作select下拉框动态变动(创建/删除/获取)
Jun 02 Javascript
判断javascript的数据类型(示例代码)
Dec 11 Javascript
jquery xMarquee实现文字水平无缝滚动效果
Apr 29 Javascript
Ext GridPanel加载完数据后进行操作示例代码
Jun 17 Javascript
ES6概念 Symbol toString()方法
Dec 25 Javascript
在React中如何优雅的处理事件响应详解
Jul 24 Javascript
微信通过页面(H5)直接打开本地app的解决方法
Sep 09 Javascript
详解vue中移动端自适应方案
May 05 Javascript
ios中视频的最后一桢问题解决
May 14 Javascript
layui的表单验证支持ajax判断用户名是否重复的实例
Sep 06 Javascript
解决removeEventListener 无法清除监听的问题
Oct 30 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
将数组写入txt文件 var_export
2009/04/21 PHP
php递归创建和删除文件夹的代码小结
2012/04/13 PHP
深入解析php之sphinx
2013/05/15 PHP
腾讯微博提示missing parameter errorcode 102 错误的解决方法
2014/12/22 PHP
PHP的PDO错误与错误处理
2019/01/27 PHP
让innerHTML的脚本也可以运行起来
2006/07/01 Javascript
JS Jquery 遍历,筛选页面元素 自动完成(实现代码)
2013/07/08 Javascript
求数组最大最小值方法适用于任何数组
2013/08/16 Javascript
javascript放大镜效果的简单实现
2013/12/09 Javascript
JS判断字符串包含的方法
2015/05/05 Javascript
js判断数组key是否存在(不用循环)的简单实例
2016/08/03 Javascript
关于Jquery中的事件绑定总结
2016/10/26 Javascript
在点击div中的p时,如何阻止事件冒泡
2017/02/07 Javascript
iview同时验证多个表单问题总结
2018/09/29 Javascript
原生JavaScript实现日历功能代码实例(无引用Jq)
2019/09/23 Javascript
jquery 回调操作实例分析【回调成功与回调失败的情况】
2019/09/27 jQuery
Vue实现多标签选择器
2019/11/28 Javascript
Flask解决跨域的问题示例代码
2018/02/12 Python
pycharm打开命令行或Terminal的方法
2019/01/16 Python
Python TestCase中的断言方法介绍
2019/05/02 Python
Python 获取ftp服务器文件时间的方法
2019/07/02 Python
使用Python实现图像标记点的坐标输出功能
2019/08/14 Python
Python爬虫爬取、解析数据操作示例
2020/03/27 Python
Python退出时强制运行一段代码的实现方法
2020/04/29 Python
Python执行时间的几种计算方法
2020/07/31 Python
使用python库xlsxwriter库来输出各种xlsx文件的示例
2020/09/01 Python
HTML5 script元素async、defer异步加载使用介绍
2013/08/23 HTML / CSS
澳大利亚排名第一的在线酒类商店:MyBottleShop
2018/04/26 全球购物
MAC彩妆英国官网:M·A·C UK
2018/05/30 全球购物
vue实现倒计时功能
2021/03/24 Vue.js
大课间活动制度
2014/01/18 职场文书
一月红领巾广播稿
2014/02/11 职场文书
保险公司晨会主持词
2014/03/22 职场文书
2015年敬老月活动总结
2015/03/27 职场文书
2015学校六五普法工作总结
2015/04/22 职场文书
职工食堂管理制度
2015/08/06 职场文书