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 相关文章推荐
jquery加载图片时以淡入方式显示的方法
Jan 14 Javascript
JQuery工具函数汇总
Jun 15 Javascript
基于javascript制作微博发布栏效果
Apr 04 Javascript
jQuery实现对无序列表的排序功能(附demo源码下载)
Jun 25 Javascript
微信小程序 form组件详解及简单实例
Jan 10 Javascript
js模仿微信朋友圈计算时间显示几天/几小时/几分钟/几秒之前
Apr 27 Javascript
Javascript别踩白块儿(钢琴块儿)小游戏实现代码
Jul 20 Javascript
vue之将echart封装为组件
Jun 02 Javascript
JavaScript Math对象和调试程序的方法分析
May 13 Javascript
微信小程序new Date()方法失效问题解决方法
Jul 29 Javascript
JavaScript相等运算符的九条规则示例详解
Oct 20 Javascript
vue跳转方式(打开新页面)及传参操作示例
Jan 26 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
实现树状结构的两种方法
2006/10/09 PHP
在windows平台上构建自己的PHP实现方法(仅适用于php5.2)
2013/07/05 PHP
php发送post请求函数分享
2014/03/06 PHP
javascript数组与php数组的地址传递及值传递用法实例
2015/01/22 PHP
抛弃 PHP 代价太高
2016/04/26 PHP
js window.open弹出新的网页窗口
2014/01/16 Javascript
jquery选择器之基本过滤选择器详解
2014/01/27 Javascript
Python脚本后台运行的几种方式
2015/03/09 Javascript
jQuery中的基本选择器用法学习教程
2016/04/14 Javascript
Function.prototype.apply()与Function.prototype.call()小结
2016/04/27 Javascript
详解React Native顶|底部导航使用小技巧
2017/09/14 Javascript
React Native 截屏组件的示例代码
2017/12/06 Javascript
Vue全局分页组件的实现代码
2018/08/10 Javascript
layui从数据库中获取复选框的值并默认选中方法
2018/08/15 Javascript
js实现无缝滚动双图切换效果
2019/07/09 Javascript
layui问题之自动滚动二级iframe页面到指定位置的方法
2019/09/18 Javascript
Node 代理访问的实现
2019/09/19 Javascript
vue路由结构可设一层方便动态添加路由操作
2020/08/31 Javascript
深入理解python对json的操作总结
2017/01/05 Python
python实现飞机大战
2018/09/11 Python
解决python写入带有中文的字符到文件错误的问题
2019/01/31 Python
tensorflow没有output结点,存储成pb文件的例子
2020/01/04 Python
对python中各个response的使用说明
2020/03/28 Python
canvas实现按住鼠标移动绘制出轨迹的示例代码
2018/02/05 HTML / CSS
澳大利亚领先的男装零售连锁店:Lowes
2020/08/07 全球购物
在校生钳工实习自我鉴定
2013/09/19 职场文书
文体活动实施方案
2014/03/27 职场文书
科学发展观活动总结
2014/08/28 职场文书
党的群众路线教育实践活动批评与自我批评范文
2014/10/16 职场文书
写给老师的感谢信
2015/01/20 职场文书
高校教师个人总结
2015/02/10 职场文书
党小组意见范文
2015/06/08 职场文书
民政局未婚证明
2015/06/15 职场文书
三十年再续同学情倡议书
2019/11/27 职场文书
golang操作redis的客户端包有多个比如redigo、go-redis
2022/04/14 Golang
使用JS前端技术实现静态图片局部流动效果
2022/08/05 Javascript