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维吉尼亚密码算法实现代码
Nov 09 Javascript
js字符串的各种格式的转换 ToString,Format
Aug 08 Javascript
jQuery动画效果-slideUp slideDown上下滑动示例代码
Aug 28 Javascript
javascript产生随机数方法汇总
Jan 25 Javascript
jQuery技巧之让任何组件都支持类似DOM的事件管理
Apr 05 Javascript
详解Vue双向数据绑定原理解析
Sep 11 Javascript
vue中动态绑定表单元素的属性方法
Feb 23 Javascript
详解JavaScript添加给定的标签选项
Sep 17 Javascript
jQuery+PHP实现上传裁剪图片
Jun 29 jQuery
JavaScript制作3D旋转相册
Aug 02 Javascript
Vue2.0 实现页面缓存和不缓存的方式
Nov 12 Javascript
JavaScript enum枚举类型定义及使用方法
May 15 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
分享一个PHP数据流应用的简单例子
2012/06/01 PHP
php编写简单的文章发布程序
2015/06/18 PHP
PHP利用超级全局变量$_GET来接收表单数据的实例
2016/11/05 PHP
PHP二维数组去重实例分析
2016/11/18 PHP
Laravel timestamps 设置为unix时间戳的方法
2019/10/11 PHP
定义select的边框颜色
2008/04/28 Javascript
JQuery EasyUI 日期控件如何控制日期选择区间
2014/05/05 Javascript
JavaScript获取路径设计源码
2014/05/22 Javascript
VS2008中使用JavaScript调用WebServices
2014/12/18 Javascript
jQuery中each()方法用法实例
2014/12/27 Javascript
jQuery中:gt选择器用法实例
2014/12/29 Javascript
javascript框架设计之框架分类及主要功能
2015/06/23 Javascript
jquery动态切换背景图片的简单实现方法
2016/05/14 Javascript
JavaScript实现经典排序算法之冒泡排序
2016/12/28 Javascript
在 Angular2 中实现自定义校验指令(确认密码)的方法
2017/01/23 Javascript
vue2.0实战之基础入门(1)
2017/03/27 Javascript
jQuery实现手势解锁密码特效
2017/08/14 jQuery
jQuery+HTML5实现WebGL高性能烟花绽放动画效果【附demo源码下载】
2017/08/18 jQuery
纯html+css+javascript实现楼层跳跃式的页面布局(实例代码)
2017/10/25 Javascript
vue项目中axios使用详解
2018/02/07 Javascript
JavaScript实现汉字转换为拼音及缩写的方法示例
2019/03/28 Javascript
浅析vue插槽和作用域插槽的理解
2019/04/22 Javascript
基于JavaScript实现控制下拉列表
2020/05/08 Javascript
python脚本实现分析dns日志并对受访域名排行
2014/09/18 Python
Python爬取国外天气预报网站的方法
2015/07/10 Python
pyspark操作MongoDB的方法步骤
2019/01/04 Python
python实现最大子序和(分治+动态规划)
2019/07/05 Python
Python二维码生成识别实例详解
2019/07/16 Python
Python编写一个验证码图片数据标注GUI程序附源码
2019/12/09 Python
pyqt5数据库使用详细教程(打包解决方案)
2020/03/25 Python
全球知名的婚恋交友网站:Match.com
2017/01/05 全球购物
西铁城美国官方网站:Citizen Watch美国
2019/11/08 全球购物
房地产还款计划书
2014/01/10 职场文书
教师新年寄语
2014/04/03 职场文书
实践单位评语
2014/04/26 职场文书
领导干部贪图享乐整改措施
2014/09/21 职场文书