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 YUI 读码日记之 YAHOO.util.Dom - Part.3
Mar 22 Javascript
深入document.write()与HTML4.01的非成对标签的详解
May 08 Javascript
关于安卓手机微信浏览器中使用XMLHttpRequest 2上传图片显示字节数为0的解决办法
May 17 Javascript
Javascript中获取浏览器类型和操作系统版本等客户端信息常用代码
Jun 28 Javascript
深入浅析javascript中的作用域(推荐)
Jul 19 Javascript
jQuery实现鼠标经过购物车出现下拉框代码(推荐)
Jul 21 Javascript
vue.js实现仿原生ios时间选择组件实例代码
Dec 21 Javascript
JS实现手写parseInt的方法示例
Sep 24 Javascript
解决vue-cli创建项目的loader问题
Mar 13 Javascript
vue3.0 CLI - 2.3 - 组件 home.vue 中学习指令和绑定
Sep 14 Javascript
ES6知识点整理之模块化的应用详解
Apr 15 Javascript
小程序自定义圆形进度条
Nov 17 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下读取文本文件的代码
2008/07/02 PHP
PHP数组交集的优化代码分析
2011/03/06 PHP
php微信公众号开发之图片回复
2018/10/20 PHP
JS 密码强度验证(兼容IE,火狐,谷歌)
2010/03/15 Javascript
jQuery 锚点跳转滚动条平滑滚动一句话代码
2010/04/30 Javascript
JS模拟面向对象全解(一、类型及传递)
2011/07/13 Javascript
JQuery入门—JQuery程序的代码风格详细介绍
2013/01/03 Javascript
js实现非常简单的焦点图切换特效实例
2015/05/07 Javascript
实现音乐播放器的代码(html5+css3+jquery)
2015/08/04 Javascript
轻松掌握JavaScript中的Math object数学对象
2016/05/26 Javascript
基于JS分页控件实现简单美观仿淘宝分页按钮效果
2016/11/07 Javascript
jQuery EasyUI结合zTree树形结构制作web页面
2017/09/01 jQuery
Node.js 中使用 async 函数的方法
2017/11/20 Javascript
countUp.js实现数字动态变化效果
2019/10/17 Javascript
vue页面更新patch的实现示例
2020/03/25 Javascript
vue组件库的在线主题编辑器的实现思路
2020/04/03 Javascript
详解vue高级特性
2020/06/09 Javascript
JavaScript中常用的3种弹出提示框(alert、confirm、prompt)
2020/11/10 Javascript
python访问mysql数据库的实现方法(2则示例)
2016/01/06 Python
Python编程中归并排序算法的实现步骤详解
2016/05/04 Python
python利用OpenCV2实现人脸检测
2020/04/16 Python
Python基于opencv的图像压缩算法实例分析
2018/05/03 Python
Python实现的求解最小公倍数算法示例
2018/05/03 Python
Python File(文件) 方法整理
2019/02/18 Python
通过python实现弹窗广告拦截过程详解
2019/07/10 Python
ORM Django 终端打印 SQL 语句实现解析
2019/08/09 Python
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译
2020/04/15 Python
python中@property的作用和getter setter的解释
2020/12/22 Python
python实现计算图形面积
2021/02/22 Python
纯css3制作网站后台管理面板
2014/12/30 HTML / CSS
市场营销专业推荐信
2013/11/03 职场文书
八一建军节感言
2014/02/28 职场文书
小学教师师德师风自我剖析材料
2014/09/29 职场文书
趣味运动会简讯
2015/07/20 职场文书
2016年中秋祝酒词
2015/11/26 职场文书
Python利用机器学习算法实现垃圾邮件的识别
2021/06/28 Python