vue render函数_Vue 中 render 函数有点意思

我们知道 Vue 模板是非常强大的,基本可以完成我们日常开发的所有任务。但是,有一些用例,如基于输入或插槽值创建动态组件方式,render 函数会比模板完成的更好也更出色。

用过 React 开发的人对 render 函数应该非常熟悉,因为React组件通过 JSX和 render 函数来构建的。尽管Vue render 函数也可以用JSX编写,但在这里我们使用原生 JS方式,因为这样,我们可以更轻松地了解Vue组件系统的一些基础。

值得注意的是,Vue 的模板实际上在编译时也是会先解析成 render 函数表示方式。模板只是在render 函数之上提供了一个方便且熟悉的语法糖。尽管 render 函数更强大,但render函数可读性很差,相对用的也比较少了。

创建组件

带有 render 函数的组件没有template标记或属性。相反,该组件定义了一个了名为render的函数,该函数接收一个reateElement(renderElement: String | Component, definition: Object, children: String | Array)参数(由于某种原因,通常别名为h,归咎于JSX)并返回使用该函数创建的元素,其他一切保持不变,来看看事例:

7fec84cb4569e7b0ba9c7e74024d5ca7.png

render 函数中如何表示指令

Vue 模板具有各种便捷功能,以便向模板添加基本逻辑和绑定功能,如 v-if、v-for、v-moel指令等。在render函数中是无法使用这些指令的。取而代之的是以纯 JS 来实现,对于大多数指令而言,这也是比较简单的。

v-if

v-if 用纯 JS 实现很简单,只需围绕createElement调用使用 if(expr)语句即可。

v-for

v-for可以使用for-of,Array.map,Array.filter等的JS方法中的任何一种来实现。我们可以通过非常有趣的方式将它们组合在一起,以实现过滤或状态切片,而无需计算属性。

例如,有以下 Vue 的模板代码

04bfa41a823bef0bdfa77953c99209f5.png

可以用下面的 render 函数来实现上面的效果:

render(h) {  return h('ul', this.pod.map(pea => h('li', pea.name)));}
v-model

我们知道,v-model只是bind属性与value的语法糖,并在触发input事件时设置数据属性。但是,在render函数没有这样的简写,我们需要自己实现。

假设,在 Vue 中,我们有如下的结构:

  

上面代码等价于:

7f2891c5a17347f35055adad04d1fa62.png

在 render 函数中可以用下面方式来实现上面的代码:

6a566cf4628dba9be5f103687cdac1ae.png

v-bind

attribute和property 这两种类型的绑定被放在元素定义中,如arttrs、props和domProps( value 和innerHTML之类的东西)。

7c37afacfdaa512387111bb732cce658.png

需要注意的是,对于 class和style的绑定是直接在定义的根进行处理,而不是作为attrs,props或domProps处理。

1d83771c165e98070da0770d0b46d65b.png

v-on

对事件处理程也是直接添加到元素定义中 on 定义

c1052855be05e74189262a2d592648fa.png
ad9d682eea523a6bd843d3cf1722d500.png
特殊属性

Slots 可以通过this.$slots作为createElement()节点的数组来访问插槽。

作用域插槽存储在this.$scopedSlots[scope](props:object) 中,作为返回createElement()节点数组的函数。


原文:https://vuejsbook.com/introduction-to-vue-render-functions-with-examples作者:Joshua Bemenderfer 译者:前端小智 来源:vuejsbook.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值