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同意等待代码实现心得
Jan 01 Javascript
中文字符串截取的js函数代码
Apr 17 Javascript
让javascript加载速度倍增的方法(解决JS加载速度慢的问题)
Dec 12 Javascript
JS函数arguments数组获得实际传参数个数的实现方法
May 28 Javascript
JS实现密码框的显示密码和隐藏密码功能示例
Dec 26 Javascript
原生js实现无限循环轮播图效果
Jan 20 Javascript
node 利用进程通信实现Cluster共享内存
Oct 27 Javascript
Node.js的Koa实现JWT用户认证方法
May 05 Javascript
微信小程序 slot踩坑的解决
Apr 01 Javascript
微信小程序new Date()方法失效问题解决方法
Jul 29 Javascript
原生js拖拽实现图形伸缩效果
Feb 10 Javascript
Vue父组件监听子组件生命周期
Sep 03 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
CI框架源码阅读,系统常量文件constants.php的配置
2013/02/28 PHP
浅析PHP substr,mb_substr以及mb_strcut的区别和用法
2013/06/21 PHP
ThinkPHP惯例配置文件详解
2014/07/14 PHP
优化WordPress的Google字体以加速国内服务器上的运行
2015/11/24 PHP
php 实现一个字符串加密解密的函数实例代码
2016/11/01 PHP
PHP jQuery+Ajax结合写批量删除功能
2017/05/19 PHP
thinkPHP框架整合tcpdf插件操作示例
2018/08/07 PHP
MSN消息提示类
2006/09/05 Javascript
document.all与WEB标准
2020/05/13 Javascript
关于js中window.location.href,location.href,parent.location.href,top.location.href的用法与区别
2010/10/18 Javascript
jquery图片播放浏览插件prettyPhoto使用详解
2014/12/19 Javascript
浅析webapp框架AngularUI的demo
2014/12/21 Javascript
javascript生成不重复的随机数
2015/07/17 Javascript
JS实现带有抽屉效果的产品类网站多级导航菜单代码
2015/09/15 Javascript
jQuery ajax时间差导致的变量赋值问题分析
2016/01/22 Javascript
JS+CSS3制作炫酷的弹窗效果
2016/11/08 Javascript
完美的js图片轮换效果
2017/02/05 Javascript
浅谈Angular2 ng-content 指令在组件中嵌入内容
2017/08/18 Javascript
Vue cli 引入第三方JS和CSS的常用方法分享
2018/01/20 Javascript
webpack+vue-cli项目中引入外部非模块格式js的方法
2018/09/28 Javascript
[02:06]DOTA2英雄基础教程 暗影萨满
2013/12/16 DOTA
[01:05]主宰至宝剑心之遗
2017/03/16 DOTA
用pywin32实现windows模拟鼠标及键盘动作
2014/04/22 Python
在Python的web框架中编写创建日志的程序的教程
2015/04/30 Python
Python基于smtplib实现异步发送邮件服务
2015/05/28 Python
ubuntu安装mysql pycharm sublime
2018/02/20 Python
Python网络编程基于多线程实现多用户全双工聊天功能示例
2018/04/10 Python
python获取程序执行文件路径的方法(推荐)
2018/04/26 Python
Python使用pymongo库操作MongoDB数据库的方法实例
2019/02/22 Python
荷兰最大的多品牌男装连锁店:Adam Brandstore
2019/12/31 全球购物
Farfetch澳大利亚官网:Farfetch Australia
2020/04/26 全球购物
临床医师个人自我评价
2014/04/06 职场文书
入党积极分子自我批评思想汇报
2014/10/10 职场文书
2015年建党94周年演讲稿
2015/03/19 职场文书
2015年高校辅导员工作总结
2015/04/20 职场文书
Python实现简单的俄罗斯方块游戏
2021/09/25 Python