在讲h函数之前,我们先来了解下虚拟dom:

虚拟dom简单来说就是一个普通的JavaScript对象,包含tag,props,children三个属性。。。

lxc

上边的HTML代码转为虚拟DOM如下:

{

tag:"div",

props:{

id:"app"

},

children:[

{

tag:"p",

props:{

className:"text"

},

children:[

"lxc"

]

}

]

}

该对象就是所谓的虚拟dom,因为dom对象是属性结构,所以使用JavaScript对象就可以简单表示。而原生dom有许多属性、事件,即使创建一个空div也要付出昂贵的代价。而虚拟dom提升性能的点在于DOM发生变化的时候,通过diff算法对比,计算出需要更改的DOM,只对变化的DOM进行操作,而不是更新整个视图。。。

在vue脚手架中,我们经常会看到这样一段代码:

const app = new Vue({

··· ···

render: h => h(App)

})

这个render方法也可以写成这样:

const app = new Vue({

··· ···

render:function(createElement){

return createElment(App)

}

})

h函数就是vue中的createElement方法,这个函数作用就是创建虚拟dom,追踪dom变化的。。。

在看一个例子:写一个main.jsx文件

function getVDOM(){

return (

my name is lxc

)

}

使用bable编译之后:

上边代码:最终html代码会被编译成h函数的渲染形式。返回的是一个虚拟DOM对象,通过diff算法,来追踪自己要如何改变真实DOM。

function h(tag,props,...children){//h函数,返回一个虚拟dom对象

return {

tag,

props:props || {},

children:children.flat()//扁平化数组,降至一维数组

}

}

我们在看下官方文档所说的createElement函数,它返回的实际上不是一个DOM元素,更准确的名字是:createNodeDescription(直译为——创建节点描述),因为它所包含的信息会告诉vue页面上需要渲染什么样的节点,包括其子节点的描述信息。我们把这样的节点叫做:“虚拟节点(virtual node)”,也常简写为:“VNode”。(看了以上的案例相信在看刚这段话思路会更加清晰)

createElment参数(也就是h函数):

我们还是以官方文档的解释来讲,createElment函数接受三个参数,分别是:

参数一:tag(标签名)、组件的选项对象、函数(必选);

参数二:一个对象,标签的属性对应的数据(可选);

参数三:子级虚拟节点,字符串形式或数组形式,子级虚拟节点也需要使用createElement构建。

来一个小例子:

{{name}}

{{age}}

render:function(createElement){

return createElement("div",{id:"lxc"},[this.name,createElement("p",this.age)])

}

上边代码,值得注意的是,如果父元素有文本内容,在render函数中写的时候,内容写在参数三——数组的第一个参数中。(建议大家动手写一写,理解的会更透彻。)

在来一个官方文档例子:

{{item.name}}

No items

data:{

items:[{name:"l"},{name:"x"},{name:"c"}]

},

render:function(createElement){

if(this.items.length){

return createElement("ul",this.items.map(function(ele){

return createElement("li",ele.name)

}))

}else{

return createElment("p","No items")

}

}

vue的h函数_vue 中的h函数相关推荐

  1. mounted钩子函数_vue中created钩子函数与mounted钩子函数的使用区别

    1:在使用vue框架的过程中,我们经常需要给一些数据做一些初始化处理,这时候我们常用的就是在created与mounted选项中作出处理. 首先来看下官方解释,官方解释说created是在实例创建完成 ...

  2. scala 函数中嵌套函数_Scala中的嵌套函数 用法和示例

    scala 函数中嵌套函数 Scala中的嵌套函数 (Nested functions in Scala) A nested function is defined as a function whi ...

  3. oracle中转换函数,Oracle中的转换函数

    Oracle中的转换函数有三个,分别为to_char(),to_date(),to_number() 1.to_char()的用法 格式化当前的日期时间 select sysdate,to_char( ...

  4. c语言isnumber函数用法,【C、C++】ctype.h、cctype中的isnumber()函数和isdigit()函数的区别...

    isnumber()函数和isdigit()函数并无区别,查看函数定义发现也是相同的,可能有微小的区别, Mac OS X 手册页 上ctype函数中对isnumber()和isdigit()函数的区 ...

  5. vue进入页面执行的钩子函数_vue中各选项及钩子函数执行顺序详解

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  6. vue created 调用方法_vue中的eventBus会产生内存泄漏吗

    eventBus是在vue中经常用来解决跨组件消息传递的问题,但对它的使用要特别注意,否则会产生很严重的后果. 引入 本文介绍了eventBus的实现原理,并介绍它如何在vue中使用,并举了一个具体的 ...

  7. vue 数组对象提取_vue中使用对象数组的最佳实践

    前言: 在平常的开发中,经常会在vue中用到对象数组,如渲染一个小区的列表,数据结构可能如下所示: CommunityList: [ { _id: '', community_code: '', co ...

  8. java 调用htm中js函数_Lua中调用C函数(lua5.2.3)

    Lua可以调用C函数的能力将极大的提高Lua的可扩展性和可用性.对于有些和操作系统相关的功能,或者是对效率要求较高的模块,我们完全可以通过C函数来实现,之后再通过Lua调用指定的C函数.对于那些可被L ...

  9. matlab randi 函数,MATLAB中的randi函数

    randi Pseudorandom integers from a uniform discrete distribution.来自一个均匀离散分布的伪随机整数 R = randi(IMAX,N) ...

  10. oracle有无left函数,Sql 中的 left 函数、right 函数

    DB2中left()函数和right()函数对应oracle中的substr()函数 DB2 LEFT.RIGHT函数 语法:LEFT(ARG,LENGTH).RIGHT(ARG,LENGTH) LE ...

最新文章

  1. python编程从入门到实践课后题答案-python编程:从入门到实践习题5-8~5-11
  2. Java之Number类
  3. ResNet最强改进版来了!ResNeSt:Split-Attention Networks
  4. java中三种常见内存溢出错误的处理方法
  5. eclipse在ubuntu13.04下崩溃crash
  6. 如何有效解决C与C++的相互调用问题
  7. 大一C语言大作业ip合法性,c语言实现判断ip地址是否合法
  8. 使用管理员账户远程连接WMQ7.5的“AMQ4036”错误
  9. ID3、C4.5、CART决策树算法解析(关键内容讲解)
  10. 《图解HTTP》读书笔记(二:各种协议与HTTP协议之间的关系)
  11. 阶段5 3.微服务项目【学成在线】_day05 消息中间件RabbitMQ_1.页面发布-需求分析...
  12. 金融行业灾备压力大?看中和农信如何从容应对
  13. C语言(面积计算器)不能输入负数[程序以要求]
  14. 疑难杂症篇(一)--安装Visio与已安装的office冲突的解决方案
  15. 值得尝试的 MQTT 客户端工具
  16. 错误号 MSSQL_REPL20011 错误号:15517
  17. win10计算机拨号连接,拨号连接设置(Win10怎么设置宽带自动连接 win10开机自动连接宽带设置方法详解)...
  18. 移动终端开发详解总结(二)(kotlin版)| CSDN创作打卡
  19. 《矛盾论》与《实践论》
  20. Bootstrap Table Fixed Columns

热门文章

  1. echart可视化图表多条折线显示数据混乱问题
  2. 2021年最后一天,学点Selenium玩点新鲜~新的一年,让分布式测试有更多玩法
  3. 基于arduino的oled显示屏的使用
  4. 中国移动mda移动桌面助手
  5. 开关Switch系列:Switch修改滑块(thumb)和滑道(track)的颜色(一)
  6. 共享IPFS生态红利丨IPFS合伙人招募大会哈尔滨站圆满落幕
  7. TSC打印机使用教程终极版(转)
  8. VDI(Virtual Desktop Infrastructure)云桌面使用笔记
  9. 【Oracle】并行等待之PX Deq: Table Q Normal
  10. python爬虫 scrapy 爬取腾讯招聘