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 相关文章推荐
图片img的src不变让浏览器重新加载实现方法
Mar 29 Javascript
Jquery实现点击按钮,连续地向textarea中添加值的实例代码
Mar 08 Javascript
js实现人才网站职位选择功能的方法
Aug 14 Javascript
webpack学习笔记之代码分割和按需加载的实例详解
Jul 20 Javascript
jQuery动态添加.active 实现导航效果代码思路详解
Aug 29 jQuery
vue组件父子间通信之综合练习(聊天室)
Nov 07 Javascript
vue计算属性和监听器实例解析
May 10 Javascript
Node.js之readline模块的使用详解
Mar 25 Javascript
微信小程序学习总结(三)条件、模板、文件引用实例分析
Jun 04 Javascript
为什么JavaScript中0.1 + 0.2 != 0.3
Dec 03 Javascript
JavaScript使用setTimeout实现倒计时效果
Feb 19 Javascript
React服务端渲染原理解析与实践
Mar 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
php实现rc4加密算法代码
2012/04/25 PHP
解析php类的注册与自动加载
2013/07/05 PHP
使用YUI+Ant 实现JS CSS压缩
2014/09/02 PHP
Yii2创建多界面主题(Theme)的方法
2016/10/08 PHP
php封装的smartyBC类完整实例
2016/10/19 PHP
Prototype源码浅析 Number部分
2012/01/16 Javascript
javascript 基础篇1 什么是js 建立第一个js程序
2012/03/14 Javascript
使用jquery动态加载javascript以减少服务器压力
2012/10/29 Javascript
JavaScript中的关键字&quot;VAR&quot;使用详解 分享
2013/07/31 Javascript
简介JavaScript中toUpperCase()方法的使用
2015/06/06 Javascript
浅谈Node.js中的定时器
2015/06/18 Javascript
js常用的继承--组合式继承
2017/03/06 Javascript
Bootstrap Table使用整理(四)之工具栏
2017/06/09 Javascript
Vue基于vuex、axios拦截器实现loading效果及axios的安装配置
2019/04/26 Javascript
解决在layer.open中使用时间控件laydate失败的问题
2019/09/11 Javascript
layui问题之自动滚动二级iframe页面到指定位置的方法
2019/09/18 Javascript
[01:28]一分钟告诉你DOTA2 TI9不朽宝藏Ⅱ中有什么!
2019/07/09 DOTA
Python中用Ctrl+C终止多线程程序的问题解决
2013/03/30 Python
Python中序列的修改、散列与切片详解
2017/08/27 Python
Python延时操作实现方法示例
2018/08/14 Python
Python模拟百度自动输入搜索功能的实例
2019/02/14 Python
Laravel+Dingo/Api 自定义响应的实现
2019/02/17 Python
matplotlib实现数据实时刷新的示例代码
2021/01/05 Python
全球最大的中文旅行网站:去哪儿网
2017/11/16 全球购物
会计专业应届生求职信
2013/11/24 职场文书
个人自我鉴定写法
2013/11/30 职场文书
学校消防安全制度
2014/01/30 职场文书
股东合作协议书范本
2014/04/14 职场文书
新农村建设典型材料
2014/05/31 职场文书
服务标语大全
2014/06/18 职场文书
认真学习保证书
2015/02/26 职场文书
升学宴学生致辞
2015/07/27 职场文书
西部计划志愿者工作总结
2015/08/11 职场文书
2016年“我们的节日·重阳节”主题活动总结
2016/04/01 职场文书
解析探秘fescar分布式事务实现原理
2022/02/28 Java/Android
Vertica集成Apache Hudi重磅使用指南
2022/03/31 Servers