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的版本实现执行不同的代码
May 11 Javascript
js 对小数加法精度处理示例说明
Dec 27 Javascript
JS替换文本域内的回车示例
Feb 18 Javascript
jquery 无限级下拉菜单的简单实现代码
Feb 21 Javascript
js如何判断用户是否是用微信浏览器
Jun 05 Javascript
Javascript类型转换的规则实例解析
Feb 23 Javascript
BootStrap Typeahead自动补全插件实例代码
Aug 10 Javascript
利用fecha进行JS日期处理
Nov 21 Javascript
详解vue组件化开发-vuex状态管理库
Apr 10 Javascript
Vue2.0子同级组件之间数据交互方法
Feb 28 Javascript
分享5个小技巧让你写出更好的 JavaScript 条件语句
Oct 20 Javascript
JS加载解析Markdown文档过程详解
May 19 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 GD绘制24小时柱状图
2008/06/28 PHP
PHP字符串函数系列之nl2br(),在字符串中的每个新行 (\n) 之前插入 HTML 换行符br
2011/11/10 PHP
IE JS编程需注意的内存释放问题
2009/06/23 Javascript
js 如何实现对数据库的增删改查
2012/11/23 Javascript
AngularJS HTML编译器介绍
2014/12/06 Javascript
Nodejs的express使用教程
2015/11/23 NodeJs
JavaScript控制浏览器全屏及各种浏览器全屏模式的方法、属性和事件
2015/12/20 Javascript
js遍历json的key和value的实例
2017/01/22 Javascript
nodejs使用express创建一个简单web应用
2017/03/31 NodeJs
nodejs操作mongodb的填删改查模块的制作及引入实例
2018/01/02 NodeJs
解决vue无法设置滚动位置的问题
2018/10/07 Javascript
vue-admin-template配置快捷导航的代码(标签导航栏)
2020/09/04 Javascript
angular8.5集成TinyMce5的使用和详细配置(推荐)
2020/11/16 Javascript
Python设计足球联赛赛程表程序的思路与简单实现示例
2016/06/28 Python
在Python的一段程序中如何使用多次事件循环详解
2017/09/07 Python
对pandas中apply函数的用法详解
2018/04/10 Python
Python读取英文文件并记录每个单词出现次数后降序输出示例
2018/06/28 Python
利用Python正则表达式过滤敏感词的方法
2019/01/21 Python
Python实现二叉树前序、中序、后序及层次遍历示例代码
2019/05/18 Python
使用Tensorflow-GPU禁用GPU设置(CPU与GPU速度对比)
2020/06/30 Python
使用Python实现NBA球员数据查询小程序功能
2020/11/09 Python
css3实现的多级渐变下拉菜单导航效果代码
2015/08/31 HTML / CSS
Canvas绘制浮动球效果的示例
2017/12/29 HTML / CSS
HomeAway的巴西品牌:Alugue Temporada
2018/04/10 全球购物
彪马西班牙官网:PUMA西班牙
2019/06/18 全球购物
Kate Spade澳大利亚官方网站:美国设计师手袋品牌
2019/09/10 全球购物
德国滑雪和户外用品网上商店:XSPO
2019/10/30 全球购物
介绍下WebSphere的安全性
2013/01/31 面试题
函授本科个人自我鉴定
2014/03/25 职场文书
工伤赔偿协议书
2014/04/15 职场文书
财务工作检讨书
2014/10/29 职场文书
服装店员工管理制度
2015/08/07 职场文书
初中英语教学反思范文
2016/02/15 职场文书
小数乘法教学反思
2016/02/22 职场文书
Python 文本滚动播放器的实现代码
2021/04/25 Python
redis调用二维码时的不断刷新排查分析
2022/04/01 Redis